[Java] 제어문
Java제어문
무조건 위에서 아래로 한 문장씩 순차적으로 진행되는 프로그램의 흐름을 바꾸는 역할을 하는 문장.
조건문과 반복문이 있다.
대게 조건식과 문장을 포함하는 블럭으로 구성되어 있다.
ControlStatement(condition){
// condition == true
}
조건식의 결과는 반드시 true 또는 false이어야 한다.
중첩할 경우 횟수에 제한이 없다.
블럭 { }
여러 문장을 하나의 단위로 묶는다.
괄호 열기( { )로 시작해서 괄호 닫기( } )로 끝난다.
문장의 끝을 의미하는 세미콜론( ; )을 붙이지 않는다.
블럭 내의 문장이 하나뿐 일 때는 괄호를 생략할 수 있다.
하지만 나중에 새로운 문장을 추가할 때 괄호로 문장들을 감싸주어야 하는 걸 잊기 쉬우므로 가능한 사용하는 것이 바람직하다.
조건문
조건에 따라 다른 문장이 수행되도록 한다.
if문
조건식이 참이면 괄호 안의 문장들을 수행한다.
if (i > 10) {
System.out.println("1은 10보다 크다.");
}
if (i <= 10) System.out.println("1은 10보다 작거나 같다.");
- if-else문
조건식의 결과가 거짓일 때 else블럭의 문장을 수행한다.
두 조건식이 참과 거짓인 상반된 관계에 있을 때 사용할 수 있다.
if (i > 10) {
System.out.println("1은 10보다 크다.");
} else {
System.out.println("1은 10보다 작거나 같다.");
}
if (i > 10) System.out.println("1은 10보다 크다.");
else System.out.println("1은 10보다 작거나 같다.");
- if-else if문
한 문장에 여러 개의 조건식을 쓸 수 있다.
결과가 참인 조건식을 만날 때까지 첫 번째 조건식부터 순서대로 평가한다.
조건식의 결과가 참인 것이 하나도 없을 경우 else블럭의 문장이 수행된다.
else블럭이 생략되어 있을 경우 if-else if문의 어떤 블럭도 수행되지 않을 수 있다.
if (i > 10) {
System.out.println("1은 10보다 크다.");
} else if (i > 0) {
System.out.println("1은 0보다 크고 10보다 작거나 같다.");
} else {
System.out.println("1은 0과 같거나 작다.");
}
조건식이 순차적으로 진행되므로 중복되는 조건은 생략한다.
위의 if-else if문을 if문으로 분리시키면 다음과 같다.
if (i > 10) {
System.out.println("1은 10보다 크다.");
}
if (i > 0 && i <= 10) {
System.out.println("1은 0보다 크고 10보다 작거나 같다.");
}
if (i <= 0) {
System.out.println("1은 0보다 작거나 같다.");
}
- 중첩 if문
if문의 블럭 내에 또 다른 if문을 포함시키는 것.
괄호가 생략될 경우 else블럭은 가까운 if문에 속한 것으로 간주되기 때문에 괄호 생략에 더욱 조심해야 한다.
if (condition1) {
// condition1 == true
if (condition2) {
// condition1, condition2 == true
} else {
// condition1 == true, condition2 == false
}
} else {
// condition1 == false
}
switch
단 하나의 조건식으로 많은 경우의 수를 처리할 수 있다.
조건식을 계산하여 나온 결과와 일치하는 case문으로 이동한다.
조건식의 결과값은 반드시 정수 또는 문자열(JDK1.7부터)이어야 한다.
case문의 값은 상수(정수)와 문자열(JDK1.7부터)만 가능하며 중복되지 않아야 한다.
조건식을 잘 만들어서 case문의 개수를 최소화하는 것이 중요하다.
switch (condition) {
case value1: // condition == value1
break;
case value2: // condition == value2
break;
default: // condition == null
}
- break문
각 case문의 영역을 구분한다.
생략될 경우 다른 break문을 만나거나 switch문 블럭의 끝(})을 만날 때까지 나오는 모든 문장들을 수행한다.
switch (level) {
case 5:
HardModeOpen(); // 4, 1의 문장들도 수행되어 모든 난이도를 할 수 있다.
case 4:
MediumModeOpen(); // 1의 문장도 수행되어 중간 난이도와 보통 난이도를 할 수 있다.
case 1:
NormalModeOpen(); // 보통 난이도만 할 수 있다.
}
중첩으로 사용할 경우 break문을 빼먹지 않도록 주의한다.
반복문
조건식이 거짓이 될 때까지 블럭 내의 문장을 반복 수행한다.
for문
반복횟수를 알고 있을 때 사용한다.
초기화, 조건식, 증감식, 블럭. 총 4부분으로 이루어져 있다.
for (initialization; condition; increment;) {
// condition == true
}
- 초기화
처음에 단 한번만 반복문을 제어할 변수를 초기화한다.
쉼표( , )를 구분자로해서 같은 타입인 둘 이상의 변수를 사용할 수 있다.
- 조건식
조건식이 참인 동안 블럭의 문장을 반복한다.
생략되면 참으로 간주되어서 무한 반복문이 되고, 조건식이 잘못 될 경우에도 무한 반복에 빠질 수 있다.
- 증감식
반복문을 제어하는 변수의 값을 증가 또는 감소시킨다.
매 반복마다 수행된다.
쉼표를 이용해서 두 문장 이상을 하나로 연결해서 사용할 수 있다.
for (int i = 0, j = 0; i < 10; ++i) ;
for (; ; ) ; // 초기화, 조건식, 증감식 모두 생략 가능
for (int i = 0; i < 10; ++i, j *= 3) ;
- 빈 문장
블럭 내에 세미콜론( ; )만 두거나 괄호 안을 비워둔다.
아무 일도 하지 않는 채 조건식과 증감식을 반복하며 시간을 보낸다.
for (int i = 0; i < 10; ++i) {
;
}
for (int i = 0; i < 10; ++i) ;
for (int i = 0; i < 10; ++i) {
}
- for-each 루프
변수에 배열/컬렉션의 요소가 차례대로 대입되면서 반복된다. (JDK1.5부터 추가)
for (variable : 배열/컬렉션) {
// statements
}
일반적인 for문과 달리 배열/컬렉션에 저장된 값들을 읽어오는 용도로만 사용할 수 있다.
int[] arr = {1, 2, 3, 4};
// 일반
for (int i = 0; i < arr.length; i++) {
j = arr[i];
}
// 읽어오는 용도
for (int tmp : arr) {
j = tmp;
}
while문
초기화나 증감식이 필요하지 않는 경우 사용한다.
while (condition) {
// condition == true
}
조건식을 생략할 수 없다.
- 무한 반복문
조건식이 항상 참이 되도록 할 경우 true를 넣는다.
반드시 블럭 안에 조건문을 넣어서 특정 조건을 만족하면 무한 반복문을 벗어날 수 있도록 한다.
- do-while문
while문의 변형으로, 조건식과 블럭의 순서를 바꿔놓은 것이다.
처음 한 번은 반드시 수행된다.
do {
// condition == true
} while (condition);
끝에 세미콜론( ; )을 잊지 않도록 주의한다.
반복적으로 사용자의 입력을 받아서 처리할 때 유용하다. ex) 숫자 맞추기
break문
자신이 포함된 가장 가까운 반복문을 벗어난다.
무한 반복문에는 항상 조건문과 같이 사용된다.
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (i == j) break; // 현재 for문이 중단되고 상위 for문의 다음 문장이 진행된다.
}
}
while (i < 10) {
if (i == 5) break; // while문을 중단한다.
i++;
}
continue문
반복문의 끝으로 이동하여 다음 반복으로 넘어간다.
for문의 경우 증감식으로, while문과 do-while문의 경우 조건식으로 이동한다.
전체 반복 중에 특정조건을 만족하는 경우를 제외할 때 유용하다.
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) continue;
System.out.println(i); // 홀수만 출력한다.
}
반복문에 이름 붙이기
반복문 앞에 이름을 붙여주어 break/continue문을 수행할 반복문을 임의로 지정해줄 수 있다.
하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.
Loop:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j == 5) continue Loop;
}
}
참고 서적: 자바의 정석 3판 - 남궁 성 지음