조건문이란?
조건문은 특정 조건에 따라 다른 코드 블록을 실행하도록 하는 구문입니다. 이를 통해 프로그램의 흐름을 동적으로 제어할 수 있으며, 조건에 따라 다른 작업을 수행하거나 값을 반환할 수 있습니다. 조건문의 종류는 크게 if문, if-else문, else if문, switch문이 있습니다.
조건문의 종류
Java에서 사용하는 조건문에 대해 각각 살펴보겠습니다.
if 문
if 문은 프로그래밍에서 가장 기본적인 조건문 중 하나로, 주어진 조건이 참(true)인지 거짓(false)인지에 따라 코드의 실행 흐름을 제어하게 해 줍니다. 만약 조건이 참(true)이라면 if 문 내부의 코드 블록이 실행되고, 거짓(false)이라면 해당 코드 블록은 건너뛰게 됩니다.
if문의 구조는 아래와 같은 형식의 구조를 갖습니다.
if (조건) {
// 조건이 참일 때 실행될 코드
}
- 조건 : 괄호 () 안에는 참(true) 또는 거짓(false)의 값을 가질 수 있는 표현식이 위치합니다. 이 표현식의 평가 결과에 따라 if 문 내부의 코드가 실행될지 결정됩니다.
- 코드 블록 : 중괄호 {} 안에는 조건이 참(true)일 때 실행될 코드가 위치합니다. 조건이 거짓(false)이라면 이 블록은 전혀 실행되지 않습니다.
- 실습 예제 -
public class Conditional01 {
public static void main(String[] args) {
int score = 75; // 사용자의 점수
// 점수가 70점 초과인지 검사
if (score > 70) {
// 조건이 참(true)일 경우 실행될 코드
System.out.println("합격입니다.");
}
}
}
위 예제는 점수(score)가 70점을 초과하는지 검사합니다. 조건이 참(true)이면, 즉 점수가 70점을 초과하면 "합격입니다." 메세지를 출력합니다. 만약 조건이 거짓(false)이라면, 즉 점수가 70점 이하라면 if문 내부의 코드 블록은 실행되지 않습니다. 해당 예제 코드는 score가 75 이고, 75 > 70 은 참(true)이기 때문에 if문 내부의 코드 블록이 실행되어, "합격입니다." 메세지를 출력하게 됩니다.
다음은 위 예제의 흐름을 나타낸 그림입니다.
변수 score가 70보다 크면 ①, score가 70이하면 ②가 실행됩니다. ①, ② 중 한 가지는 반드시 실행되며, 두 가지가 동시에 실행되거나 하나도 실행되지 않는 경우는 없습니다.
if-else문
if-else 문은 조건이 참(true)일 때와 거짓(false)일 때, 두 가지 경우에 대해 각각 다른 코드 블록을 실행할 수 있게 하는 조건문입니다. 이 구조를 사용하면 프로그램의 흐름을 보다 세밀하게 제어할 수 있습니다. if 문이 단독으로 사용될 때는 조건이 참(true)인 경우에만 특정 동작을 수행하지만, if-else 구조를 사용하면 조건의 결과가 참(true), 거짓(false)에 따라 각각 어떤 동작을 수행하게 할 수 있습니다.
if-else문의 구조는 아래와 같은 형식의 구조를 갖습니다.
if (조건) {
// 조건이 참일 때 실행될 코드
} else {
// 조건이 거짓일 때 실행될 코드
}
- 조건 : 괄호 () 안에는 참(true) 또는 거짓(false)의 값을 가질 수 있는 표현식이 위치합니다.
- 첫 번째 코드 블록 : if(조건) 키워드 다음에 오는 중괄호 {} 안에는 조건이 참(true)일 때 실행될 코드가 위치합니다.
- 두 번째 코드 블록 : else 키워드 다음에 오는 중괄호 {} 안에는 조건이 거짓(false)일 때 실행될 코드가 위치합니다.
- 실습 예제 -
public class Conditional02 {
public static void main(String[] args) {
int score = 65; // 사용자의 점수
// 점수가 70점 초과인지 검사
if (score > 70) {
// 조건이 참(true)일 경우 실행될 코드
System.out.println("합격입니다.");
} else {
// 조건이 거짓(false)일 경우 실행될 코드
System.out.println("불합격입니다.");
}
}
}
위 예제는 점수(score)가 70점을 초과하는지 검사합니다. 조건이 참(true)이면, 즉 점수가 70점을 초과하면 "합격입니다." 메세지를 출력합니다. 만약 조건이 거짓(false)이라면, 즉 점수가 70점 이하라면 else문 내부의 코드 블록을 실행하여 "불합격입니다." 메세지를 출력합니다. 해당 예제 코드는 score가 65 이고, 65 > 70 은 거짓(false)이기 때문에 else문 내부의 코드 블록이 실행되어, "불합격입니다." 메세지를 출력하게 됩니다.
다음은 위 예제의 흐름을 나타낸 그림입니다.
변수 score가 70보다 크면 ①, score가 70이하면 ②가 실행됩니다. ①, ② 중 한 가지는 반드시 실행되며, 두 가지가 동시에 실행되거나 하나도 실행되지 않는 경우는 없습니다.
else if문
else if 구문은 복수의 조건을 순차적으로 검사하고 싶을 때 사용되며, if-else 구조 내에서 여러 조건을 분기하고자 할 때 사용됩니다. if 문으로 시작된 조건 검사에서 첫 번째 조건이 거짓일 경우, 다음 else if 문의 조건을 차례로 검사합니다. 만약 어떤 else if의 조건도 만족하지 않으면, 최종적으로 else 블록이 실행됩니다. else 블록은 생략이 가능합니다. else블록이 생략된 경우, 어떠한 조건도 만족하지 않으면 최종적으로 어떠한 블록도 실행되지 않습니다.
else if문의 구조는 아래와 같은 형식의 구조를 갖습니다.
if (조건1) {
// 조건1이 참일 때 실행될 코드
} else if (조건2) {
// 조건1이 거짓이고 조건2가 참일 때 실행될 코드
} else {
// 모든 조건이 거짓일 때 실행될 코드 (생략 가능)
}
- 조건 : 각 if와 else if에는 참(true) 또는 거짓(false)을 평가할 수 있는 표현식이 들어갑니다.
- 코드 블록 : 조건에 따라 실행될 각각의 코드 블록을 정의합니다.
- 실행 순서 : 이 구문은 순차적으로 실행되며, if문 -> else if문 -> ... -> else문(생략가능) 순으로 평가됩니다.
만약 if문이 참(true)인 경우 if문의 코드 블럭이 실행되며, if문이 거짓(false)인 경우 다음 else if문을 평가합니다. 만약 평가한 else if문이 거짓(false)인 경우 또 다음 else if문을 평가합니다. 이런식으로 순차적으로 조건을 평가한 후 모두 거짓(false)인 경우에는 else구문을 실행합니다. 만약 else구문이 생략되었다면, 어떠한 코드 블록도 실행되지 않습니다.
- 실습 예제 -
public class Conditional03 {
public static void main(String[] args) {
int score = 75; // 사용자의 점수
char grade = ' '; // 사용자의 등급 (공백 문자로 초기화)
// 점수에 따른 등급 부여
if (score >= 90) {
// 90점 이상인 경우
grade = 'A';
} else if (score >= 80) {
// 90점 미만이고 80점 이상인 경우
grade = 'B';
} else if (score >= 70) {
// 80점 미만이고 70점 이상인 경우
grade = 'C';
} else if (score >= 60) {
// 70점 미만이고 60점 이상인 경우
grade = 'D';
} else {
// 모든 조건이 거짓(false)일 경우, 즉 60점 미만인 경우 실행될 코드
grade = 'f';
}
System.out.println("해당 사용자는 " + grade + " 등급입니다.");
}
}
이 예제는 점수(score)를 기반으로 등급(grade)을 결정하고 출력하는 Java 코드입니다. 코드의 실행 순서는 다음과 같습니다.
- score(사용자의 점수)와 grade(사용자의 등급)이 선언됩니다. score 변수가 75로 초기화되고, grade 변수가 공백 문자로 초기화 됩니다.
- 첫 번째 if 문에서 score가 90 이상인지 검사합니다. score는 75이므로, 이 조건은 거짓(false)입니다. 따라서, 이 코드 블록은 건너뛰고, 다음 else if 문으로 넘어갑니다.
- 두 번째 else if 문에서 score가 80 이상인지 검사합니다. score는 75이므로, 이 조건도 거짓(false)입니다. 이 코드 블록 역시 건너뛰고, 다음 else if 문으로 넘어갑니다.
- 세 번째 else if 문에서 score가 70 이상인지 검사합니다. 이번에는 score가 75이므로 조건이 참(true)입니다. 따라서 grade에 'C'가 할당되고, 이후의 else if 및 else 블록은 실행되지 않습니다.
- 마지막으로, System.out.println()을 통해 사용자의 등급을 나타내는 메시지가 콘솔에 출력됩니다. 출력 메시지는 "해당 사용자는 C 등급입니다."가 됩니다.
이 예제는 다양한 조건을 순차적으로 검사하여, 조건에 맞는 코드 블록을 실행하는 else if 구문의 사용법을 보여주고 있습니다. 조건이 참(true)이 되는 순간, 해당 코드 블록이 실행되고 나머지 else if 및 else 블록은 무시됩니다.
다음은 위 예제의 흐름을 나타낸 그림입니다.
switch문
switch 문은 주어진 변수의 값에 따라 다수의 코드 블록 중 하나를 실행하도록 선택하는 제어문입니다. 이 구문은 특정 변수의 값이 미리 정의된 여러 값 중 하나와 일치하는 경우, 해당하는 코드 블록을 실행합니다. switch 문은 if-else 구문보다 가독성이 좋고 관리하기 쉬울 때 주로 사용됩니다, 특히 한 변수가 다양한 상수 값 중 하나와 일치할 때 그 값에 따른 다른 동작을 정의해야 할 때 유용합니다.
switch문의 구조는 아래와 같은 형식의 구조를 갖습니다.
switch (식) {
case 값1:
// 식의 결과가 값1과 일치할 때 실행될 코드
break;
case 값2:
// 식의 결과가 값2와 일치할 때 실행될 코드
break;
// 추가적인 case들...
default:
// 어떤 case에도 해당하지 않을 때 실행될 코드
}
- 식 : 검사할 변수나 표현식입니다. switch 문은 이 식의 결과에 따라 실행할 코드 블록을 결정합니다.
- case : 식의 결과와 일치하는 값을 정의합니다. 각 case 뒤에는 해당하는 코드 블록이 오며, break 문을 통해 switch 문을 빠져나옵니다.
- default : case 중 어느 것과도 일치하지 않을 때 실행될 코드 블록입니다. default 블록은 생략 가능합니다.
- 실습 예제 -
public class Conditional04 {
public static void main(String[] args) {
int dayOfWeek = 4; // 요일을 나타내는 숫자 (1: 월요일, ..., 7: 일요일)
// 요일에 따른 이름 출력
switch (dayOfWeek) {
case 1:
System.out.println("월요일");
break;
case 2:
System.out.println("화요일");
break;
case 3:
System.out.println("수요일");
break;
case 4:
System.out.println("목요일"); // 이 case가 실행됩니다.
break;
case 5:
System.out.println("금요일");
break;
case 6:
System.out.println("토요일");
break;
case 7:
System.out.println("일요일");
break;
default:
System.out.println("잘못된 요일 번호입니다.");
}
}
}
위 예제는 요일(dayOfWeek)의 숫자에 따라 해당하는 요일 이름을 출력하는 Java 프로그램 예시입니다. 각 case는 dayOfWeek 값이 해당하는 요일의 숫자와 일치할 때 실행됩니다. dayOfWeek가 4이므로, "목요일"을 출력하고, switch 문을 break 문으로 인해 종료합니다.
switch문 주의사항
switch 문에서 break 문을 생략하면 "fall-through" 현상이 발생합니다. 이는 한 case의 실행 코드가 끝난 후, break 문이 없으면 프로그램이 다음 case로 넘어가서 계속해서 코드를 실행하는 현상을 의미합니다. 이러한 특성을 활용하면 여러 case에 대해 같은 동작을 정의할 수 있지만, 의도하지 않은 결과를 초래할 수도 있기 때문에 주의해야 합니다.
다음은 switch문에서 break를 생략한 경우를 다룬 실습 예제들입니다.
● 같은 결과를 갖게 하는 switch문 (의도적으로 생략된 break)
- 실습 예제 -
public class Conditional05 {
public static void main(String[] args) {
int dayOfWeek = 3; // 요일을 나타내는 숫자 (1: 월요일, ..., 7: 일요일)
// 요일에 따라 메시지 출력 (break 문 생략)
switch (dayOfWeek) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("주중입니다."); // 1 ~ 5일 경우, 이 메시지 출력
break; // 여기서 switch 문을 종료
case 6:
case 7:
System.out.println("주말입니다."); // 6, 7일 경우, 이 메시지 출력
break; // 여기서 switch 문을 종료
default:
System.out.println("잘못된 요일 번호입니다.");
}
}
}
- 출력 결과 -
주중입니다.
이 예제는 월요일부터 금요일(1~5)까지는 "주중입니다."라는 메시지를, 토요일과 일요일(6, 7)에는 "주말입니다."라는 메시지를 출력합니다. 1~5는 같은 동작을 하게 되고, 6~7은 같은 동작을 하게 됩니다.
이처럼 같은 동작을 수행 시키기 위해 break를 생략 할 수 있습니다.
● 누적된 결과를 갖게 하는 switch문 (의도적으로 생략된 break)
- 실습 예제 -
public class Conditional06 {
public static void main(String[] args) {
int dayOfWeek = 1; // 요일을 나타내는 숫자 (1: 월요일, ..., 7: 일요일)
String message = "오늘의 준비물 : ";
// 요일에 따라 준비물을 누적시키는 switch 문
switch (dayOfWeek) {
case 1: // 월요일
message += "펜 ";
// break가 없으므로 다음 case로 이어집니다.
case 2: // 화요일
message += "책 ";
// break가 없으므로 다음 case로 이어집니다.
case 3: // 수요일
message += "안경 ";
// break가 없으므로 다음 case로 이어집니다.
case 4: // 목요일
message += "수첩 ";
// break가 없으므로 다음 case로 이어집니다.
case 5: // 금요일
message += "노트북 ";
break; // 여기서 switch 문 종료
case 6: // 토요일
case 7: // 일요일
message += "휴일 ";
break;
default:
message = "잘못된 요일입니다.";
break;
}
System.out.println(message);
}
}
- 출력 결과 -
오늘의 준비물 : 펜 책 안경 수첩 노트북
이 예제는 요일에 따라 다양한 준비물을 메시지에 누적시킵니다. 예를 들어, dayOfWeek가 1(목요일)인 경우, 1(월요일)부터 5(금요일)까지의 준비물이 메시지에 누적되어 "오늘의 준비물 : 펜 책 안경 수첩 노트북 " 이라는 결과를 얻게 됩니다. 이는 각 case에서 break가 생략되어 있기 때문에 가능한 동작입니다. 만약 dayOfWeek가 3이라면, "오늘의 준비물 : 안경 수첩 노트북 " 와 같은 결과가 될 것입니다.
이처럼 각 조건의 결과를 누적하거나 여러 조건을 거쳐 종합적인 결과를 도출해야 할 때 break를 생략할 수 있습니다.
● 의도하지 않은 결과를 갖게 하는 switch문 (실수로 생략된 break)
- 실습 예제 -
public class Conditional07 {
public static void main(String[] args) {
int dayOfWeek = 4; // 요일을 나타내는 숫자 (1: 월요일, ..., 7: 일요일)
String dayName = "";
// 요일에 따른 이름 출력
switch (dayOfWeek) {
case 1:
dayName = "월요일";
case 2:
dayName = "화요일";
case 3:
dayName = "수요일";
case 4:
dayName = "목요일"; // 이 case가 실행되지만, break문이 없으므로 계속 실행됩니다.
case 5:
dayName = "금요일";
case 6:
dayName = "토요일";
case 7:
dayName = "일요일";
default:
dayName = "잘못된 요일 번호";
}
System.out.println(dayName + " 입니다.");
}
}
- 출력 결과 -
잘못된 요일 번호 입니다.
이 예제는 switch 문에서 break 문을 실수로 생략한 경우의 예시입니다. break 문의 생략으로 인해 의도하지 않은 결과를 얻게 됩니다. break 문이 없으면, switch 문은 다음 case 또는 default 구문으로 넘어가지 않고 계속해서 모든 case를 순서대로 실행합니다. 따라서 해당 switch문은 아래와 같은 순서로 실행됩니다.
- 변수 dayOfWeek에 4가 할당되어 있으므로, switch 문은 case 4: 로 진입합니다. case 4: 에서 dayName에 "목요일"이 할당됩니다.
- 하지만, case 4: 뒤에 break 문이 없으므로, 프로그램은 계속해서 case 5:, case 6:, case 7:, 그리고 default: 에 이르기까지 모든 뒤따르는 코드를 순차적으로 실행합니다.
- 결과적으로, dayName 변수는 "목요일", "금요일", "토요일", "일요일"을 거쳐 최종적으로 "잘못된 요일 번호"로 설정됩니다.
따라서 최종 출력 메시지는 "잘못된 요일 번호 입니다."가 됩니다.
이 예제에서 의도했던 것은 dayOfWeek 값에 따라 해당 요일의 이름을 dayName에 할당하고 그 값을 출력하는 것이었지만, break 문의 생략으로 인해 의도하지 않은 "잘못된 요일 번호 입니다."라는 결과가 출력됩니다. 따라서 break 문을 생략하는 경우, 코드의 흐름을 명확히 이해하고 있어야 하며, 의도치 않은 동작을 방지하기 위해 주의해야 합니다.
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 06. 반복문의 제어 (break, continue, label) (0) | 2024.03.27 |
---|---|
[Java] 05. 반복문 배우기 (for, while, do-while, 향상된 for문) (0) | 2024.03.27 |
[Java] 03. 연산자란? (우선순위, 결합규칙) (1) | 2024.03.26 |
[Java] 02. 형변환이란? (암시적 형변환, 명시적 형변환) (0) | 2024.03.26 |
[Java] 01. 변수와 상수 배우기 (0) | 2024.03.26 |