제어문이란? 지금까지의 코드실행 흐름은 무조건 위에서 아래로 한 문장씩 순차적으로 진행됐지만 때로는 조건에 따라 문장을 건너뛰고, 때로는 같은 문장을 반복해서 수행해야 할 때가 있다. 이처럼 프로그램의 흐름(flow)을 바꾸는 역할을 하는 문장들을 '제어문(control statement)'라고 한다. 제어문에는 '조건문'과 '반복문'이 있는데, 조건문은 조건에 따라 다른 문장이 소행되도록 하고, 반복문은 특정 문장들을 반복해서 수행한다.
조건문은 조건에 따라 코드를 실행하거나 건너뛰는 역할을 하며 가장 기본적인 조건문으로는 if문과 switch문이 있다.
괄호 '{}'를 이용해서 여러 문장을 하나의 단위로 묶을 수 있는데, 이것을 '블럭(block)'이라고 한다. 블럭은 {로 시작하고 안에 코드를 작성한 후 }로 닫는다 닫고나서 }뒤에는 ;를 붙이지 않는다는 것에 주의하자. 또한 블럭 내의 코드가 한줄안에 끝나는 경우 블럭 자체를 아래와 같이 생략가능하다
if (true) System.out.println("참입니다");
if (조건식) {
// 조건식이 참(true)일 때 수행될 문장들을 적는다.
}
if문의 변형인 if-else문의 구조는 다음과 같다. if문에 'else'블럭이 추가되었는데 if문의 조건식이 거짓일때는 else블럭의 문장을 실행한다
if (조건식) {
// 조건식이 참(true)일 때 수행될 문장
} else {
// 조건식이 거짓(false)일 때 수행될 문장
}
if-else문은 두 가지 경우 중 하나가 수행되는 구조이고 처리해야할 조건이 셋이상이면 아래와같이 여여러개의 조건식을 쓸 수 있는 'if-else if'문을 사용할 수 있다. if-else if문은 따로 만들어진 문장이아닌 if-else에서 else블럭을 생략하고 다시 if문을 작성한 것이다
if (조건식1) {
} else if (조건식2) { //여기서 원래는 else { if (조건식2) } 이지만 한줄에 끝나는 코드는 {}이 생략 가능하다.
} else if (조건식3) {
} else {}
if문은 조건식의 결과가 참과 거짓밖에 없기 때문에 경우의 수가 많아질수록 else-if를 계속 추가해야하므로 성능상으로 좋지않다. 이런 if문의 문제를 switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고 표현도 간결하다. 그래서 if-else if문을 무한 반복하기보다는 switch문을 사용하는게 좋다. 다만 나중에 알려 줄 siwtch문의 제약조건 때문에 어쩔수 없이 if-else문을 사용해야 할 때도 있다.
switch문은 조건식을 먼저 계산한 후 그 결과와 일치하는 case문으로 이동한다. 이동한 case문 아래의 모든 코드를 실행하기에 필요한 코드만 사용하고 break;문으로 switch문을 탈출한다.
switch (조건식) {
case 값1 :
// 조건식의 결과가 값1과 같을 경우 수행될 문장들
// ...
break; //만약 break이 없다면 아래 코드들도 같이 실행됨
case 값2 :
// 조건식의 결과가 값2와 같을 경우 수행될 문장들
// 위 case 값1: 부분은 실행되지 않음
break; //만약 break이 없다면 아래 코드들도 같이 실행됨
default :
// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
// default는 보통 switch문의 마지막에 작성하나 중간에 작성할 경우
// break;를 꼭 적어주어야 아래 코드들이 같이 실행되지 않는다.
}
switch문의 조건식은 결과값이 반드시 정수이어야 하며, 이 값과 일치하는 case문으로 이동하기 때문에 case문의 값 역시 정수이어야 한다. 그리고 중복되지 않아야한다.
switch문의 제약조건
1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
2. case문의 값은 정수 상수(문자 포함), 문자열만 가능하며 중복되지 않아야 한다.
public static void main(String[] args) {
int num, result;
final int ONE = 1;
...
switch(result) {
case '1': //OK. 문자 리터럴(정수 49와 동일)
case ONE: //OK. 정수 상수
case "YES": //OK. 문자열 리터럴. JDK7이상
case num: //에러. 변수는 불가
case 1.0: //에러. 실수도 불가
...
}
}