Java 조건문의 중요성: 왜 알아야 할까요?
프로그래밍은 결국 ‘어떤 상황에서 어떻게 동작할 것인가’를 정의하는 과정입니다. 예를 들어, 사용자가 입력한 비밀번호가 맞으면 로그인을 허용하고, 틀리면 “비밀번호 오류” 메시지를 보여주는 것처럼 말이죠. 이처럼 특정 조건에 따라 다른 코드 블록을 실행하도록 만드는 문법을 조건문이라고 합니다.
Java에서 조건문은 프로그램의 논리를 구현하는 데 필수적입니다. 만약 조건문이 없다면, 모든 코드는 순차적으로만 실행될 것이고, 우리가 원하는 다양한 기능을 구현하기 어려울 것입니다. 마치 자동차에 핸들, 브레이크, 액셀러레이터가 없으면 운전자가 원하는 대로 차를 움직일 수 없는 것과 같습니다.
Java에는 여러 종류의 조건문이 있지만, 가장 기본적이고 많이 사용되는 것이 바로 if문과 switch문입니다. 이 두 가지를 제대로 이해하면 Java 프로그래밍의 절반은 마스터했다고 해도 과언이 아닙니다.
조건문, 왜 중요할까요?
-
프로그램 흐름 제어: 특정 조건에 따라 다른 코드를 실행시켜 프로그램의 동작 방식을 결정합니다.
-
다양한 기능 구현: 사용자 입력 처리, 데이터 검증, 오류 처리 등 복잡하고 동적인 기능을 구현할 수 있습니다.
-
효율적인 코드 작성: 불필요한 코드를 줄이고, 상황에 맞는 최적의 코드를 실행하도록 합니다.
이번 글에서는 이 두 가지 핵심 조건문인 if문과 switch문에 대해 자세히 알아보고, 실제 예제를 통해 어떻게 활용하는지 살펴보겠습니다.
1. if문: 가장 기본적인 조건 분기
if문은 “만약 ~라면, ~를 실행하라”라는 의미를 가집니다. 가장 직관적이고 유연하게 조건을 설정할 수 있어 프로그래밍에서 가장 많이 사용되는 조건문입니다.
1.1. if문의 기본 구조
if문은 다음과 같은 기본 구조를 가집니다.
if (조건식) {
// 조건식이 true일 때 실행될 코드
}
-
if: 키워드입니다. -
(조건식): 괄호 안에 true 또는 false로 평가되는 논리 표현식을 작성합니다. 비교 연산자(==,!=,>,<,>=,<=)나 논리 연산자(&&,||,!) 등이 사용될 수 있습니다. -
{}: 중괄호 안에는 조건식이true일 때 실행될 하나 이상의 Java 문장을 작성합니다. 만약 실행될 문장이 하나뿐이라면 중괄호를 생략할 수도 있지만, 가독성과 실수를 줄이기 위해 일반적으로 중괄호를 사용하는 것이 좋습니다.
예시:
int age = 20;
if (age >= 19) {
System.out.println("성인입니다.");
}
이 코드에서는 age 변수의 값이 19 이상인지 확인합니다. age가 20이므로 조건식 age >= 19는 true가 되고, 따라서 중괄호 안의 System.out.println("성인입니다."); 문장이 실행되어 “성인입니다.”가 출력됩니다.
1.2. if-else문: 두 가지 경우의 수 처리
if문만 사용하면 조건이 true일 때만 특정 코드가 실행됩니다. 하지만 “만약 ~라면 A를 실행하고, 그렇지 않다면 B를 실행하라”와 같이 두 가지 경우를 모두 처리해야 할 때가 많습니다. 이때는 else를 함께 사용합니다.
if (조건식) {
// 조건식이 true일 때 실행될 코드
} else {
// 조건식이 false일 때 실행될 코드
}
else:if문의 조건식이false일 때 실행될 코드 블록을 지정합니다.
예시:
int score = 75;
if (score >= 90) {
System.out.println("A 학점입니다.");
} else {
System.out.println("A 학점이 아닙니다.");
}
score가 75이므로 score >= 90은 false가 됩니다. 따라서 if 블록은 건너뛰고 else 블록의 System.out.println("A 학점이 아닙니다.");가 실행되어 “A 학점이 아닙니다.”가 출력됩니다.
1.3. if-else if-else문: 여러 조건 처리
세 가지 이상의 경우를 처리해야 할 때는 else if를 여러 번 사용하여 조건을 추가할 수 있습니다.
if (조건식1) {
// 조건식1이 true일 때 실행될 코드
} else if (조건식2) {
// 조건식1은 false이고, 조건식2가 true일 때 실행될 코드
} else if (조건식3) {
// 조건식1, 2는 false이고, 조건식3이 true일 때 실행될 코드
} else {
// 위의 모든 조건식이 false일 때 실행될 코드
}
-
else if: 앞선if또는else if의 조건이false일 때, 다음 조건을 검사합니다. -
else: 위의 모든if및else if조건이false일 때 실행되는 마지막 블록입니다.else블록은 생략할 수도 있습니다.
예시:
int temperature = 25;
if (temperature >= 30) {
System.out.println("날씨가 매우 덥습니다.");
} else if (temperature >= 20) {
System.out.println("날씨가 따뜻합니다.");
} else if (temperature >= 10) {
System.out.println("날씨가 선선합니다.");
} else {
System.out.println("날씨가 춥습니다.");
}
temperature가 25이므로 첫 번째 if (temperature >= 30)은 false입니다. 다음 else if (temperature >= 20)은 true이므로 해당 블록의 “날씨가 따뜻합니다.”가 출력되고, 나머지 조건들은 더 이상 검사하지 않습니다.
1.4. 중첩 if문: 조건 안에 또 다른 조건
if문 안에서 또 다른 if문을 사용할 수도 있습니다. 이를 중첩 if문이라고 합니다. 복잡한 조건을 단계별로 나누어 처리할 때 유용합니다.
예시:
int hour = 14;
boolean isWeekend = false;
if (hour >= 9 && hour <= 18) { // 근무 시간인지 확인
if (!isWeekend) { // 주말이 아닌지 확인 (즉, 평일인지 확인)
System.out.println("업무 중입니다.");
} else {
System.out.println("주말이지만 근무 시간입니다.");
}
} else {
System.out.println("업무 시간이 아닙니다.");
}
이 예제에서는 먼저 hour가 9시에서 18시 사이인지 확인합니다. 만약 그렇다면, 다시 isWeekend가 false인지 (즉, 평일인지) 확인하여 “업무 중입니다.”를 출력합니다. 만약 hour가 근무 시간이 아니거나 주말이라면 해당 else 블록이 실행됩니다.
1.5. if문 사용 시 흔한 실수
=와==혼동: 할당 연산자=를 조건식에 사용하여 오류가 발생하는 경우가 많습니다.=는 변수에 값을 할당하는 연산자이고,==는 두 값이 같은지 비교하는 연산자입니다.
// 잘못된 예
if (x = 5) { // x에 5를 할당하므로 항상 true로 평가될 가능성 높음 (컴파일 오류 발생 가능)
// ...
}
// 올바른 예
if (x == 5) { // x가 5와 같은지 비교
// ...
}
-
논리 연산자 사용 오류:
&&(AND),||(OR),!(NOT) 연산자를 잘못 사용하면 예상과 다른 결과가 나올 수 있습니다. -
중괄호 생략 시 문장 하나만 실행:
if뒤에 문장이 하나만 올 경우 중괄호를 생략할 수 있지만, 이 경우if문에 속하는 문장은 딱 하나뿐입니다. 그 다음 줄은if문과 상관없이 항상 실행됩니다. 이를 혼동하여 버그를 만들 수 있으니 주의해야 합니다.
int a = 10;
int b = 5;
if (a > b)
System.out.println("a가 b보다 큽니다."); // 이 문장만 if에 속함
System.out.println("이 문장은 if와 상관없이 항상 실행됩니다."); // if 조건과 상관없이 실행됨
2. switch문: 특정 값에 따른 다중 분기
switch문은 하나의 변수나 표현식의 값이 여러 가능한 상수 값 중 하나와 일치하는 경우, 해당 코드 블록을 실행하도록 하는 조건문입니다. if-else if-else 구조로 여러 조건을 나열하는 것보다 코드가 간결하고 가독성이 높아지는 경우가 많습니다.
switch문은 정수형(byte, short, char, int), 열거형(enum), 문자열(String) 타입에 사용할 수 있습니다. (Java 7부터 문자열도 지원합니다.)
2.1. switch문의 기본 구조
switch (표현식) {
case 값1:
// 표현식의 값이 값1과 같을 때 실행될 코드
break; // switch 문을 빠져나옴
case 값2:
// 표현식의 값이 값2와 같을 때 실행될 코드
break;
// ...
default:
// 위의 어떤 case와도 일치하지 않을 때 실행될 코드 (선택 사항)
break;
}
-
switch: 키워드입니다. -
(표현식): 비교 대상이 되는 변수나 값을 넣습니다. 이 값은 상수여야 합니다. -
case 값::표현식의 값이값과 일치하는지 비교합니다.값은 반드시 상수여야 합니다. -
break;: 매우 중요합니다.break문은 해당case블록의 실행을 마치고switch문 전체를 빠져나가도록 합니다.break가 없으면 다음case로 “떨어진다(fall-through)”고 하여, 일치하는case이후의 모든 코드 블록이 실행되어 버립니다. -
default::switch문의case값들과 일치하는 것이 없을 때 실행됩니다.default는 필수는 아니며, 순서도 맨 마지막이 아니어도 상관없지만 관례적으로 마지막에 둡니다.
2.2. switch문 예제
예시 1: 요일에 따른 메시지 출력
int dayOfWeek = 3; // 1: 월요일, 2: 화요일, ..., 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("목요일입니다. 곧 주말입니다!");
break;
case 5:
System.out.println("금요일입니다. 불금을 즐기세요!");
break;
case 6:
System.out.println("토요일입니다. 신나는 주말!");
break;
case 7:
System.out.println("일요일입니다. 편안한 휴식!");
break;
default:
System.out.println("잘못된 요일 입력입니다.");
break;
}
dayOfWeek가 3이므로 case 3:에 해당하는 “수요일입니다. 벌써 주중 절반이 지났네요!”가 출력되고, break 문에 의해 switch 문이 종료됩니다.
예시 2: break가 없을 때의 동작 (Fall-through)
char grade = 'B';
switch (grade) {
case 'A':
System.out.println("훌륭합니다!");
// break; // break가 없으면 다음 case로 떨어진다.
case 'B':
System.out.println("좋은 성적입니다.");
// break;
case 'C':
System.out.println("노력이 필요합니다.");
// break;
default:
System.out.println("성적이 좋지 않습니다.");
}
만약 grade가 ‘B’라면,
-
case 'B'가 일치합니다. -
System.out.println("좋은 성적입니다.");가 실행됩니다. -
break가 없으므로, 다음case 'C'로 넘어갑니다. -
System.out.println("노력이 필요합니다.");가 실행됩니다. -
break가 없으므로,default로 넘어갑니다. -
System.out.println("성적이 좋지 않습니다.");가 실행됩니다.
결과적으로 “좋은 성적입니다.”, “노력이 필요합니다.”, “성적이 좋지 않습니다.”가 모두 출력됩니다. 이처럼 break는 switch문에서 매우 중요하게 사용됩니다.
예시 3: switch문에서 여러 case를 하나로 묶기
switch문에서 여러 case가 동일한 동작을 해야 할 경우, break를 생략하여 여러 case를 하나의 블록으로 묶을 수 있습니다.
int month = 12;
String season;
switch (month) {
case 12:
case 1:
case 2:
season = "겨울";
break;
case 3:
case 4:
case 5:
season = "봄";
break;
case 6:
case 7:
case 8:
season = "여름";
break;
case 9:
case 10:
case 11:
season = "가을";
break;
default:
season = "잘못된 월입니다.";
break;
}
System.out.println("현재 계절은 " + season + "입니다.");
month가 12이면 case 12:에 해당하고, break가 없으므로 다음 case 1:로 떨어집니다. 마찬가지로 case 2:까지 떨어진 후, case 2:에 해당하는 season = "겨울";과 break;가 실행됩니다.
2.3. switch문 사용 시 주의사항
-
break필수 (대부분의 경우):fall-through현상을 의도한 경우가 아니라면, 각case끝에break를 반드시 넣어주어야 합니다. -
비교 대상은 상수:
case뒤에는 반드시 상수나 리터럴 값이 와야 합니다. 변수나 복잡한 표현식은 올 수 없습니다. (Java 14부터switch표현식과 패턴 매칭이 도입되면서 좀 더 유연해졌지만, 기본적인switch문에서는 상수가 요구됩니다.) -
타입 호환성:
switch문의 표현식 타입과case값의 타입은 호환되어야 합니다. -
문자열
switch: Java 7부터 문자열(String)을switch문에서 사용할 수 있게 되었습니다.
3. if문 vs switch문: 언제 무엇을 사용할까?
| 구분 | if문 | switch문 |
| :———– | :—————————————— | :—————————————– |
| 조건 | 범위, 논리 연산(>, <, ==, !=, &&, ||) 등 복잡한 조건 가능 | 특정 상수 값과의 동등 비교 (==)만 가능 |
| 비교 대상 | boolean 값, 숫자, 문자열 등 다양함 | 정수형, 열거형, 문자열 |
| 가독성 | 복잡한 조건일수록 if-else if가 길어짐 | 특정 값에 대한 분기가 많을 때 간결하고 명확함 |
| 성능 | 일반적으로 switch보다 약간 느릴 수 있음 | 최적화 시 if-else if보다 빠를 수 있음 |
| 사용 시점|
– 특정 범위나 복잡한 논리 조건
– 두 가지 이상의 경우를 명확히 구분할 때
– boolean 값을 기반으로 분기할 때 |
– 하나의 변수 값이 여러 상수 중 하나와 일치할 때
– 메뉴 선택, 상태 코드 처리 등
– 여러 case가 동일한 동작을 할 때 |
간단한 예시:
-
if문이 적합한 경우: -
“점수가 80점 이상이고 90점 미만이면 B학점”
-
“사용자 ID가 비어있거나 비밀번호가 8자 미만이면 오류”
-
switch문이 적합한 경우: -
“사용자 등급이 ‘관리자’이면 관리자 메뉴, ‘회원’이면 회원 메뉴”
-
“에러 코드가 100이면 ‘페이지 없음’, 200이면 ‘성공’, 404이면 ‘찾을 수 없음'”
물론 switch문으로 구현 가능한 모든 로직은 if-else if로도 구현할 수 있고, 그 반대도 마찬가지입니다. 하지만 어떤 문법을 사용하는지에 따라 코드의 가독성, 유지보수성, 효율성이 달라질 수 있으므로, 상황에 맞는 적절한 조건문을 선택하는 것이 중요합니다.
4. Java 조건문 활용 팁
4.1. 조건을 명확하게 작성하기
-
의미 있는 변수명 사용:
score,temperature,userRole등 변수 이름만 보고도 어떤 조건인지 짐작할 수 있도록 작성합니다. -
주석 활용: 복잡한 조건이나 특별한 로직에는 주석을 달아 설명합니다.
-
가독성 좋은 들여쓰기: 코드 블록을 명확하게 구분하여 읽기 쉽게 만듭니다.
4.2. 불필요한 조건문 줄이기
-
중복 조건 제거: 여러
if나case에서 동일한 조건을 반복해서 검사하지 않도록 합니다. -
논리적으로 단순화: 복잡한 조건을 더 간단하게 만들 수 있는지 고민해봅니다.
4.3. switch문의 break 활용법
앞서 강조했듯, break는 switch문의 핵심입니다. 의도적으로 fall-through를 사용해야 하는 경우가 아니라면, 각 case 끝에 break를 넣어주세요.
4.4. Java 14+의 switch 표현식
Java 14부터 switch 표현식이 도입되어, switch 문을 더 간결하게 사용할 수 있게 되었습니다. switch 문이 문장(statement)이라면, switch 표현식은 값(expression)을 반환합니다.
// Java 14+ Switch Expression
int dayOfWeek = 3;
String dayName;
dayName = switch (dayOfWeek) {
case 1 -> "Monday";
case 2 -> "Tuesday";
case 3 -> "Wednesday";
case 4 -> "Thursday";
case 5 -> "Friday";
case 6 -> "Saturday";
case 7 -> "Sunday";
default -> "Invalid day";
};
System.out.println(dayName); // Wednesday 출력
이처럼 ->를 사용하여 값을 바로 반환하고, break 없이도 자동으로 switch 표현식이 종료됩니다. 이는 코드를 훨씬 간결하게 만들어 줍니다.
결론
Java의 if문과 switch문은 프로그램의 흐름을 제어하는 강력하고 필수적인 도구입니다.
if
