1. 조건문 - if, switch
조건문은 조건식과 문장을 포함하는 블럭{}으로 구성되어 있고, 조건식의 연산관계에 따라 실행할 문장이 달라져서 프로그램의 실행 흐름을 변경할 수 있다. → Jump 즉, 인터럽트랑 같은 부분이다.
if문
만일(if) 조건식이 참(true)면 {} 안의 문장을 실행해라. 라는 의미로 수행된다.
if (조건식) {
// 조건식이 true 일 때 수행될 문장들을 적는다.
}
if (score > 60) {
System.out.println("합격입니다.");
}
조건식
조건식은 일반적으로 비교연산자와 논리연산자로 구성된다.
// 1.
if(90 <= x && x <= 100)
// 2.
if(x < 0 || x > 100)
// 3.
if(str.equals("yes"))
조건식을 사용할 때 주의해야 할점은, 등가비교 연산자 대신에 대입 연산자를 사용하는 것을 조심하도록 하자!
블럭{}
{ } 를 이용해서 여러 문장을 하나의 단위로 묶을 수 있다. 이것을 ‘블럭’ 이라고 한다. 블럭에 끝에는 ; 가 붙지 않는 것을 주의하자. 또한 블럭 내의 문장들은 tab을 이용하여, 가독성 있게 작성하도록 하자.
if(score > 60) {
System.out.println("합격입니다.");
}
블럭 내의 문장이 하나뿐인 경우, { } 를 생략할 수 있지만, 이럴 때에는 다음과 같은 실수를 범하는 경우가 많다.
if(score > 60)
System.out.println("합격입니다."); // if문 속한 문장
System.out.println("축하합니다."); // if문에 속하지 않은 문장
의도는 60점을 넘었을 때 “합격입니다.”, “축하합니다.” 가 출력되기를 원했겠지만, 이럴 경우 축하합니다가 60점보다 낮아도, “축하합니다.” 가 출력된다는 것을 알 수 있다.
if-else문
else는 if문의 결과가 참이 아닐 때 실행된다.
if (조건식) {
// 조건식이 true일 때 수행될 문장
} else {
// 조건식이 false일 때 수행될 문장
}
===
if (input == 0) {
System.out.println("0입니다.");
}
if (input != 0) {
System.out.println("0이 아닙니다.");
}
위의 if-else 구문은 아래와 다르지 않다. 그러나 주의 할 점은 if-else문을 if문 2개로 바꾸는 것은 가능하지만, if문 2개를 무조건 if-else문으로 바꿀수는 없다. if문과 동일하게 블럭내의 내용이 한 줄 인 경우, 블럭을 제거할 수 있지만, 항상 가독성과 실수를 방지하기 위해서 블럭을 쓰는 습관을 가지는 것이 좋다.
if-else if문
처리해야 될 경우의 수가 셋 이상인 경우에는 if-else if 문을 사용할 수 있다.
if (조건식1) {
// 조건식1이 true 일 때 수행될 문장
} else if (조건식2) {
// 조건식2가 true 일 때 수행될 문장
} else if (조건식3) {
// 조건식3이 true 일 때 수행될 문장
} else { // 마지막은 보통 else 블럭으로 끝나며, else는 생략이 가능하다.
// 위에 모든 조건을 충족하지 않을 시 수행될 문장
}
====
if (score >= 90) {
grade = 'A';
} else if ( score >= 80) { // 1️⃣
grade = 'B';
} else if( score >= 70) {
grade = 'C';
} else {
grade = 'D';
}
1번 else if에서 왜 score ≥ 80 && score < 90 이 아닌지 의문이 있을 수 있다. 이유는 조건식의 실행 순서 때문인데, score가 85인 경우, score ≥ 90 에서 이미 score가 90보다 작다는 것이 판명이 됐기 때문에 score ≤ 90을 또 체크해 줄 필요가 없는 것이다. 만약 위처럼 작성한다면 다음과 같이 되어야 할 것이다.
if(score >= 90) {
grade = 'A';
}
if(score >= 80 && score < 90) {
grade = 'B';
}
if(score >= 70 && score < 80) {
grade = 'C';
}
if(score < 70) {
grade = 'D';
}
이 처럼 if-else if문은 if문을 여러개 쪼개놓은거지만 맨 위의 if문이 실행되어서 score의 값이 바뀌기라도 한다면 다른 결과를 도출하게 될 것이다.
중첩 if문
if문의 블럭 내에 또 다른 if 문을 포함시키는 것이 가능하다. 이것을 중첩 if문이라고 하고, 중첩의 횟수에는 제한이 없다.
if (num >= 0) {
if (num != 0) {
sign = '+';
}
} else {
sign = '-';
}
이 때, 주의 할 점은 이전과 같지만, if문의 블럭내의 문장이 하나여서, 블럭을 생략할 경우, 중첩된 if의 else 문으로 받아들일 수 있다는 것이다. 따라서, 몇 번이고 강조하지만 한 문장이더라도 블럭을 꼭 사용하도록 하자.
Switch 문
if-else if의 경우 조건식이 너무 많아지면, 복잡해지고 처리하는 시간도 많이 발생한다. 하지만 switch문의 경우에는 제약조건이 있긴 하지만, 하나의 조건식으로 많은 경우의 수를 처리할 수 있다.
switch (조건) {
case 값1:
// 조건식의 결과가 값1과 같을 경우 수행
break;
case 값2:
// 조건식의 결과가 값2와 같을 경우 수행
break;
case 값3:
// 조건식의 결과가 값3과 같을 경우 수행
break;
default:
// 조건식의 결과와 일치하는 case문이 없을 때 수행
break;
}
switch문은 조건식을 먼저 계산한 다음, 그 결과와 일치하는 case문으로 빠르게 이동한다. 마지막에 default문이 있는 것을 볼 수 있는데, default 문은 어디 위치에 존재해도 상관없으나, 대부분 마지막에 놓는 것이 관습이다. 따라서 default가 마지막 문장일 때에는 break를 생략해주어도 문제가 없다. switch문을 사용할 때의 주의할 점은 각 case 마다 break문이 있는 것을 볼 수 있는데, break문이 없으면 다음 break를 만날 때 까지 다음 case들을 연달아서 수행한다는 것이다. break를 빼먹어서, 종종 원하는 결과를 도출하지 않는 경우가 있는데, 웬만하면 break를 쓰도록 하고, 물론 일부러 break를 쓰지 않고 원하는 결과를 얻어낼 수도 있다.
switch(level) {
case 3:
grantDelete();
case 2:
grantWrite();
case 1:
grantRead();
}
레벨에 따라 권한을 달리 주는 switch문이다. 3이 제일 높은 등급이라고 했을 때, level == 3 이 들어오게 되면, case 3, 2, 1이 모두 실행되어 level 3 는 모든 권한을 얻을 수 있게 되고, 이와 동일한 방식으로 level 2 는 쓰기와 읽기만, level 1 읽기 권한만 가질 수 있게 된다. 이런식으로 의도적으로, break문을 사용하지 않고 여러가지 경우의 수를 판단하는 경우가 있다는 것을 알아둬야 한다.
이렇게 좋은 기능을 가지고 있지만 왜 자주 사용되지 않는지는 아까 위에서 얘기했던 제약조건 때문이다.
switch문의 제약조건
- switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
- case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.
여기서 주의 할 점은 char 형 또한 내부적으로 unicode로 저장되기 때문에 가능하다는 점이다. 추가적으로 JDK 1.7 부터 문자열 상수도 가능하게 되었다. “JDK” 처럼 리터럴로 지정해둔다면 가능하다.
switch 문에서의 재밌는 예시인 가위바위보 문제로 switch 문이 어떻게 쓰이는지 볼 수 있을 것이다.
import java.util.*;
public class Main {
public static void main(String[] args) {
// 가위(1), 바위(2), 보(3)
int user, com;
user = (int)(Math.random() * 3) + 1;
com = (int)(Math.random() * 3) + 1;
switch(user-com) {
case 2:
case -1:
System.out.println("패배");
break;
case 1:
case -2:
System.out.println("승리");
break;
case 0:
System.out.println("비김");
break;
}
}
}
기존 예시는 user의 값을 직접 입력받는 형식이었지만, 랜덤으로 지정하였다. 유저가 패배하는 경우는 {유저-가위, 컴퓨터-바위}, {유저-바위 , 컴퓨터-보}, {유저-보, 컴퓨터-가위} 인 경우이다. 따라서, 1-2, 2-3, 3-1 세 가지의 결과가 나오게 되고 따라서 2와 -1인 경우에만 패배로 지정을 해둔 것이다. 아래의 결과들도 다음과 같은 이유로 case문을 구성해 놓은 것을 볼 수 있다.
'Language > Java' 카테고리의 다른 글
12. Generic 제너릭 (0) | 2023.03.29 |
---|---|
4-2 자바 반복문 (0) | 2023.03.23 |
7-6 다형성 (0) | 2023.03.23 |
7-5 캡슐화 (0) | 2023.03.23 |
7-4 제어자 (0) | 2023.03.23 |