제어문은 수많은 명령어들의 흐름(실행 순서)을 통제하는 수단을 의미한다.
제어문의 끝에 문장 종결자(;)를 사용하지 않는다는 특징이 있다.
제어문은 크게 조건문(조건 제어문)과 반복문(반복 제어문)으로 구분할 수 있다.
먼저 조건문에 대해 알아보도록 하자.
조건문은 개발자가 조건을 제시한 후 조건의 결과에 따라 흐름을 제어할 수 있다.
조건문의 종류로는 if문과 switch문이 있다.
💡if문
if (조건식) {
문장;
} else if (조건식) {
문장;
} else {
문장;
}
if문은 선언부와 구현부로 구분되며, 조건식은 boolean을 가지는 표현식이 오면 된다.
조건(boolean)을 제시하면 조건식이 참인 경우에만 블록({}) 안의 문장이 실행된다.
블럭을 생략하고도 if문을 사용하는 게 가능하지만, 가독성을 위해 블럭을 만드는 게 좋다.
if문 사용 예시
Scanner scan = new Scanner(System.in);
String result = "";
System.out.print("나이: ");
int age = scan.nextInt();
result = (age >= 18) ? "성인" : "미성년자";
System.out.println(result);
if (age >= 18) {
result = "성인";
} else {
result = "미성년자";
}
위 코드는 age 값을 입력받아 if문을 사용하며, 18세 이상이면 "성인"을 출력하고, 그렇지 않으면 "미성년자"를 출력한다.
if와 else는 블럭의 성질이 서로 다르다. if는 조건이 참일 때 실행하는 블럭이고, else는 거짓일 때 실행하는 블럭이다. 이는 동전의 앞면과 뒷면으로 이해할 수 있다.
Dead code
if (true) {
System.out.println("참");
}
if (false) {
System.out.println("거짓");
}
조건식의 결과가 false일 경우 바깥으로 빠져나가는데, 이 경우 실행을 못 하고 끝나버리기 때문에 죽은 코드이다.
다중 조건문 (다중 if문)
Scanner scan = new Scanner(System.in);
System.out.print("색상 입력: ");
String color = scan.nextLine();
if (color.equals("빨강") || color.equals("파랑") || color.equals("노랑")) {
if (color.equals("빨강") || color.equals("파랑")) {
System.out.println("15,000원 입니다.");
} else if (color.equals("노랑")) {
System.out.println("20,000원 입니다.");
}
} else {
System.out.println("재고가 없습니다.");
}
if문 안에 새로운 if문을 추가함으로서 다중 조건문을 사용할 수 있다.
💡switch문
switch (조건){
case 값:
문장:
break;
case 값:
문장:
break;
case 값:
문장:
break;
default:
문장:
break;
}
switch, switch case문은 조건으로 boolean이 아닌 일반 값을 사용한다. 여기서 일반 값이란 정수, 문자열, 열거형(enum)을 말한다. 만약 조건으로 boolean을 넣으면 에러가 나게 된다.
switch문의 조건이 case값과 일치하는 경우 해당 문장을 실행하며, break문을 만나면 switch문을 중단하며 바깥으로 빠져나온다.
switch문 사용 예시
int lastDay = 0; // 마지막 일
Scanner scan = new Scanner(System.in);
System.out.print("월: ");
int month = scan.nextInt();
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
lastDay = 31;
break;
case 2:
lastDay = 28;
break;
case 4: case 6: case 9: case 11:
lastDay = 30;
break;
}
System.out.printf("입력한 %d월의 마지막 날짜는 %d일 입니다.\n", month, lastDay);
월: 5
입력한 5월의 마지막 날짜는 31일 입니다.
break문을 사용하지 않고 case를 중첩하여 제어하는 것이 가능하다.
if문과 switch문의 차이
Scanner scan = new Scanner(System.in);
System.out.print("숫자: ");
int num = scan.nextInt();
// if문 사용
if (num == 1) {
System.out.println("하나");
} else if (num == 2) {
System.out.println("둘");
} else if (num == 3) {
System.out.println("셋");
} else {
System.out.println("else");
}
// switch문 사용
switch (num) {
case 1:
System.out.println("하나");
break;
case 2:
System.out.println("둘");
break;
case 3:
System.out.println("셋");
break;
default:
System.out.println("default");
break;
}
if문을 사용하는 코드와 달리 switch문은 break를 사용하며, if문의 else 대신 default를 사용한다.
switch문보다는 if문이 가독성이 좋으므로 if문을 더 많이 사용하는 편이다.