제어문
프로그래밍 언어가 특정 조건에 기반하여 프로그램의 실행 흐름을 제어하기 위해 제어문을 사용한다. 이러한 조건문을 통해 프로그램의 상태 변경에 따라 실행 흐름을 진행하고 분기시키는 데 사용된다.
제어문의 종류로는 총 3가지가 있다.
- 조건문: 특정 조건의 참/거짓 여부에 따라 코드 실행 경로를 결정한다. (if문, else문, switch문)
- 반복문: 특정 조건이 충족될 때까지 코드 블록을 반복적으로 실행한다. (for문, while문, do-while문)
- 점프문: 실행 흐름을 다른 부분으로 이동시킨다. (break문, continue문, return문)
프로그래밍에서 로직을 제어하고 원하는 결과를 얻기 위해 제어문을 사용하는 것이 중요하다.
조건문(Condition)
주어지는 조건식을 만족하면 블럭({}) 안의 내용을 수행한다. (0 ~ 1번 수행)
if문, else-if문, else문으로 나눠져 있고 조건식의 결과에 따라 프로그램 실행 흐름을 분기로 처리할 수 있다.
if문
int a = 10;
int b = 5;
// TODO: if문
if (a > b) System.out.println(a); // 수행할 내용이 한 개만 있다면 블럭없이 처리가 가능하다.
if (a > b) { // 수행할 내용이 한 개 이상이면 블럭을 사용해서 처리해야 한다.
System.out.println(a);
System.out.println("OK");
}
주어지는 조건식이 참일 때 블럭 안의 문장들을 수행한다.
코드에서 보이는 것 처럼 조건식이 참일 때 수행할 문장이 한 개라면 블럭을 생략해서 사용할 수 있다. (else-if, else문 동일)
문장이 한 개 이상이라면 반드시 블럭을 사용하여 수행할 문장들을 묶어줘야 한다.
if문의 실행 흐름을 살펴보면 주어지는 조건식이 true일 경우 블럭 내의 문장들을 수행하고, false일 경우 블럭 내의 문장을 수행하지 않고 바로 다음 조건식으로 넘어가는 것을 알 수 있다.
if - else문
if문의 실행 흐름을 보면 조건이 false인 경우 아무 것도 수행하지 않고 다음 조건으로 넘어가는 것을 알 수 있는데 프로그램을 만들다 보면 때로는 조건이 거짓일 때 다른 작업을 수행해야 되는 경우가 생기기도 한다. 이때 사용하는 것이 else 문이다.
int a = 10;
int b = 5;
if (a > b) { // 서로 상반된 조건식이 있다면 else문을 사용해서 처리가 가능하다. (else문은 생략이 가능함)
System.out.println(a);
} else {
System.out.println(b);
}
해당 코드와 같이 서로 상반된 조건식이 있다면 false인 경우도 처리할 수 있다.
else문은 필수로 작성해야 되는 것은 아니기 때문에 false일 경우를 따로 처리할 필요가 없다면 생략이 가능하다.
if-else 문의 실행 흐름을 보면 주어진 조건식이 false일 경우 else문을 통해서 해당 블럭을 처리하고 난 후 다른 조건식으로 간다.
if - else-if 문
만약 프로그램을 개발하면서 여러 조건문을 사용하고 싶은 경우에는 어떻게 해야될까?
if문을 여러 개 사용할 수 있지만 else-if문을 사용해서 여러 조건식을 포함한 조건문을 만들면 코드의 가독성을 높일 수 있다.
if (a < b) {
System.out.println(b);
}
if (a == b) {
System.out.println("==");
}
if (a > b) {
System.out.println(a);
}
변수 a와 b를 비교하는 조건문을 만든다고 하면 if문으로 위의 코드처럼 만들 수 있다. 여기서 else-if문을 사용한다면 3개의 조건문이 아닌 하나의 조건문으로 사용할 수 있게 된다.
int a = 10;
int b = 5;
if (a < b) {
System.out.println(b);
} else if(a == b) { // 상위 if문에서 결과값이 false가 나오면 순차적으로 else if문을 확인하게 된다.
System.out.println("==");
} else if(a > b) { // 조건에 해당하는 else if문을 만나면 해당 조건식 내용을 수행한다.
System.out.println(a);
}
이처럼 if문의 조건식을 먼저 확인하여 false일 경우 다음 else-if문을 거치도록 만들어 조건식을 처리할 수 있다.
실행 흐름을 보면 먼저 if문의 조건식을 확인하여 false면 다음 else-if문으로 가고 true면 블럭 내의 문장을 수행하게 된다.
else-if문도 마찬가지로 주어진 조건식이 false면 다음 else-if로 true면 블럭 내의 문장들을 수행한다.
반복문(Loop)
반복문은 조건을 만족하는 동안 블럭{} 에 있는 문장들을 수행한다. (0 ~ n번)
반복문은 3가지의 종류가 있다.
for문
조건을 만족하는 동안 블럭 내의 문장들을 반복적으로 실행한다.
주로 반복 횟수를 알 경우에 사용한다.
for (int i = 0; i < 10; i++) { // 초기화; 조건식; 증감식; 순서이다.
System.out.println(i);
}
for 문의 실행 순서
- 변수를 먼저 초기화해준다. (for문을 실행하는 동안 한 번만 초기화됨)
- 조건식을 수행한다.
- 만약 조건식이 true면 블럭 안의 문장들을 수행한다.
- 증감식을 수행한다.
for (int i = 1; i < 5; i++) { // 중첩 for문
for (int j = 1; j < 10; j++) {
System.out.println(i + " X " + j + " = " + (i*j));
}
}
해당 코드와 같이 for문을 중첩해서 사용할 수 있다. 이때 조심해야 될 사항으로는 for문의 변수들이 겹치면 안 된다.
for (int i = 1; i < 5; i++) { // 중첩 for문
for (int i = 1; i < 10; i++) { // 같은 i 변수를 사용할 수 없음
System.out.println(i + " X " + j + " = " + (i*j));
}
}
또한, for문을 중첩해서 사용할 경우 시간 복잡도와 공간 복잡도가 증가하는 단점이 있다.
Java 5부터 좀 더 향상된 for문으로 foreach문을 제공해 준다.
foreach 문은 컬렉션 또는 배열의 요소를 반복해서 확인할 수 있다.
String array[] = { "Ron", "Harry", "Hermoine" };
// foreach
for (String x : array) {
System.out.println(x);
}
while문
while문은 조건을 만족시키는 동안 블럭 내의 문장들을 수행하는 반복문이다.
반복 횟수를 모를 때 주로 사용하는 반복문이다.
while문의 실행 순서
- 조건식을 수행한다.
- 블럭 내의 문장들을 수행한다.
- 블럭 내에서 조건식을 업데이트해준다.
- 조건식이 거짓일 경우 while문을 빠져나간다.
int sum = 0;
int j = 0;
while (sum <= 100) {
System.out.printf("%d - %d\n", j, sum);
sum += ++j;
}
해당 while문처럼 블럭 내에서 조건식을 업데이트를 해줘야 무한 루프를 피할 수 있다.
do-while문
for 또는 while문과 달리 블럭 내의 문장들을 실행한 후 조건에 대한 검사가 이뤄진다.
사용자 입력을 받을 때 유용하다.
do-while 실행 순서
- 반복문의 블럭 내의 문장들을 수행한다.
- 조건식을 업데이트해준다.
- 조건식을 검사한다.
- 조건식 결과가 참이면 다시 블럭 내의 문장들을 수행하고, 거짓이면 빠져나온다.
continue 문
continue 문은 반복문을 제어하기 위해 자주 사용된다.
반복문을 수행하다가 continue 문을 만나게 되면 현재 반복문의 수행을 멈추고 다음 반복을 위해 시작 부분으로 다시 간다.
for (int a = 0; a <= 10; a++) {
if (a % 2 == 1) continue; // 자신이 포함된 반복문의 끝으로 이동 - 다음 반복으로 넘어감
System.out.println(a);
}
해당 for문을 확인해 보면 짝수가 아닌 숫자를 만나게 되면 continue를 만나게 되면서 출력이 아닌 처음 반복문으로 돌아가게 된다.
break문
continue와 달리 반복문을 종료하는 데 사용되는 제어 문이다.
블럭 내의 문장들을 수행하다가 break 문을 만나게 되면 그 즉시 반복문을 종료하게 된다.
기본적으로 실제 반복 횟수가 확실하지 않거나 일부 조건에 따라 반복문을 종료해야 될 경우 사용된다.
int n = 0;
int m = 0;
while (true) {
if (m > 100) break; // 조건문이 true가 나오면 while문을 벗어난다.
++n;
m += n;
}
해당 while문처럼 반복 횟수가 고정되지 않을 때 무한 루프를 방지하기 위해 break문을 걸어둔다.
참고 자료
- 자바의 정석(남궁성)
- https://www.geeksforgeeks.org/java/?ref=outind
'자바' 카테고리의 다른 글
Java - 배열 (1) | 2023.11.09 |
---|---|
Java - 문자와 문자열 (0) | 2023.11.06 |
Java - 연산자 (0) | 2023.11.02 |
Java - 변수 (1) | 2023.11.01 |
객체 지향 프로그래밍 - 추상화 (0) | 2023.08.18 |