안녕하세요 오늘은 프로그램의 흐름을 바꾸는 제어문 중에 조건문에 대해 알아보겠습니다. 조건문은 조건에 따라 다른 문장이 수행되도록 합니다. 조건문은 조건식과 문장을 포함하는 블럭 {}으로 구성되어 있으며, 조건식의 연산결과에 따라 실행할 문장이 달라져서 프로그램의 실행흐름을 변경할 수 있습니다.
조건문은 조건식과 문장을 포함하는 블록 {}으로 구성되어 있으며, 조건식의 연산 결과에 따라 실행할 문장이 달라져서 프로그램의 실행 흐름을 변경할 수 있습니다.
조건문은 if문과 switch문, 두 가지가 있으며 주로 if문이 많이 사용됩니다. 처리할 경우의 수가 많을 때는 if문보다 switch문이 효율적이지만, switch문은 if문보다 제약이 많습니다.
1. if문
if 문은 가장 기본적인 조건문이며, 다음과 같이 '조건식'과 '괄호{}'로 이루어져 있습니다. 'if'의 뜻이 '만일 ~이라면'이므로 만일(if) 조건식이 참이면 괄호 {} 안의 문장들을 수행하라는 의미로 이해하면 됩니다.
if(조건식){
//조건이 참일 때 실행할 명령문;
}
if문의 가장 기본적인 구조입니다.
예제로 알아보겠습니다.
if (score > 80) {
System.out.println("합격입니다.");
}
만약 다음과 같은 if문이 있을 때, 조건식 'score > 80'이 참이면 괄호 {} 안의 문장이 수행되어 화면에 "합격입니다."라고 출력되고 거짓이면, if문 다음의 문장으로 넘어갑니다.
2. if-else문
if문의 변형인 if-else문의 구조는 다음과 같습니다.
if(조건식){
//조건이 참일 때 실행할 명령문;
} else {
//조건이 거짓일 때 실행할 명령문;
}
조건식의 결과에 따라 이 두 개의 블럭 {} 중 어느 한 블럭 {}의 내용이 수행되고 전체 if문을 벗어나게 됩니다. 두 블럭 {}의 내용이 모두 수행되거나, 모두 수행되지 않는 경우는 있을 수 없습니다.
예제로 알아보겠습니다.
if (score > 80) {
System.out.println("합격입니다.");
} else {
System.out.println("불합격입니다.");
}
만약 다음과 같은 if-else문이 있을 때, 조건식 'score > 80'이 참이면 괄호 {} 안의 문장이 수행되어 화면에 "합격입니다."라고 출력되고, 거짓이면 else문의 괄호 {} 안의 문장이 수행되어 화면에 "불합격입니다."라고 출력됩니다.
3. if-else-if문
if-else문은 두 가지 경우 중 하나가 수행되는 구조인데, 처리해야 할 경우가 셋 이상인 경우에는 어떻게 해야 할까요?
그럴 때는 한 문장에 여러 개의 조건식을 쓸 수 있는if-else-if문을 사용하면 됩니다.
if-else if문의 구조는 다음과 같습니다.
if(조건식1){
//조건식1이 참일 때 실행할 명령문;
} else if (조건식2){
//조건식2가 참일 때 실행할 명령문;
} else if (조건식3)( {
//조건식3이 참일 때 실행할 명령문;
} else {
//위의 어느 조건식도 만족하지 않을 때 실행할 명령문;
}
만약 다음과 같은 if-else if문이 있을 때, 첫 번째 조건부터 순서대로 평가해서 결과가 참인 조건식을 만나면, 해당 블럭 {]만 수행하고 'if-else if'문 전체를 벗어납니다.
만일 결과가 참인 조건식이 하나도 없으면, 마지막에 있는 else블럭의 문장들이 수행됩니다. 그리고 else 블럭은 생략이 가능합니다. else 블럭이 생략되었을 때는 if-else if문의 어떤 블럭도 수행되지 않을 수 있습니다.
예제로 알아보겠습니다.
if (score >= 80) {
grade = 'A';
} else if (score >= 70){
grade = 'B';
} else if (score >= 60) {
grade = 'C';
} else {
grade = 'D';
}
System.out.println("당신의 학점은" + grade + "입니다");
score가 80점 이상이면 A, 70점 이상 80점 미만이면 B, 60점 이상 70점 미만이면 C, 60점 미만이면 D가 출력됩니다.
4. 중첩 if문
if문의 블럭 내에 또 다른 if문을 포함시키는 것이 가능한데 이것을 중첩 if문이라고 부르며 중첩의 횟수에는 거의 제한이 없습니다.
if (조건식1) {
//조건식1이 참일 때 실행되는 명령문;
if (조건식2) {
//조건식1과 조건식2가 모두 true일 때 실행되는 명령문;
} else {
//조건식1이 참이고, 조건식2가 거짓일 때 실행되는 명령문;
}
} else {
//조건식1이 거짓일 때 실행되는 명령문;
}
위와 같이 내부의 if문은 외부의 if문보다 안쪽으로 들여 쓰기를 해서 범위가 명확히 구분될 수 있도록 작성해야 합니다.
예제로 알아보겠습니다.
if(score >= 90) {
if(score >= 95) {
System.out.println("등급 A+");
}else {
System.out.println("등급 A");
}
}
score가 90이상 중에 95이상은 등급이 A+이고, 90이상 이지만 95 미만은 등급이 A입니다.
5. switch문
if문은 조건식의 결과가 참과 거짓, 두 가지 밖에 없기 때문에 경우의 수가 많아질수록 else-if를 계속 추가해야 하므로 조건식이 많아져서 복잡해지고, 여러 개의 조건식을 계산해야 하므로 처리시간도 많이 걸립니다.
switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하므로 알아보기 쉽습니다. 그래서 처리할 경우가 많은 경우에는 if문 보다 switch문으로 작성하는 것이 좋습니다. 다만 switch문은 제약조건이 있기 때문에, 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 경우가 있습니다.
switch (조건식1) {
case 값1 :
//조건식의 결과가 값1과 같을 경우 실행되는 명령문;
//...
break;
case 값2 :
//조건식의 결과가 값2와 같을 경우 실행되는 명령문;
//...
break;
default :
//조건식의 결과와 일치하는 case문이 없을 때 실행되는 명령문;
//...
}
switch문의 구조는 위와 같습니다. 만일 조건식의 결과가 일치하는 case문이 하나도 없는 경우에는 default문으로 이동합니다. default문은 if문의 else블럭과 같은 역할을 한다고 보면 이해가 쉽습니다. default문의 위치는 어디라도 상관 없으나 보통 마지막에 놓기 때문에 break문을 쓰지 않아도 됩니다.
예제로 알아보겠습니다.
switch (level) {
case 3 :
grantDelete(); //삭제권한 부여
case 2 :
grantWrite(); //쓰기권한 부여
case 1 :
grantRead(); //읽기권한 부여
}
위의 예제 코드는 회원제로 운영되는 웹사이트에서 많이 사용되는 코드의 일부입니다. 로그인한 사용자의 등급(level)을 체크하여, 등급에 맞는 권한을 부여하는 방식으로 되어있습니다. 제일 높은 등급인 3을 가진 사용자는 grantDelete(), grantWirte(), grantRead()가 모두 수행되어 읽기, 쓰기, 삭제 권한까지 모두 갖게 되고, 제일 낮은 등급인 1을 가진 사용자는 읽기 권한만을 가지게 됩니다.
이처럼 case를 반대로 하여 아래로 실행될 때에는 break문을 쓰지 않아도 됩니다.