3. 조건문과 제어 흐름

header


조건문이란?

프로그램은 조건에 따라 다른 동작을 수행해야 할 때가 많습니다. 조건문은 프로그램의 실행 흐름을 제어하는 가장 기본적인 도구입니다.

💡 일상 속 조건문

"만약 비가 오면 우산을 챙긴다, 그렇지 않으면 우산을 챙기지 않는다"
이런 일상의 논리를 프로그램으로 표현한 것이 바로 조건문입니다.

조건문의 종류

Java에서 제공하는 조건문은 다음과 같습니다:

조건문 용도
if 조건이 참일 때만 실행
if-else 조건이 참/거짓일 때 각각 다른 코드 실행
if-else if-else 여러 조건을 순차적으로 검사
switch 값에 따라 여러 경우의 수 중 하나 선택
삼항 연산자 간단한 조건문을 한 줄로 표현

if 문

if 문은 가장 기본적인 조건문으로, 조건이 참(true)일 때만 코드를 실행합니다.

기본 문법

if (조건식) {
    // 조건이 true일 때 실행되는 코드
}

단일 if 문 예제

int age = 20;

if (age >= 18) {
    System.out.println("성인입니다.");
}
// 출력: 성인입니다.
int score = 85;

if (score >= 90) {
    System.out.println("A학점입니다.");
}
// 출력 없음 (조건이 false)

중괄호 생략

조건문 안에 문장이 하나만 있으면 중괄호를 생략할 수 있습니다.

int num = 10;

// 중괄호 있음
if (num > 0) {
    System.out.println("양수입니다.");
}

// 중괄호 생략 (권장하지 않음)
if (num > 0)
    System.out.println("양수입니다.");
⚠️ 중괄호 생략 주의

문장이 하나만 있어도 중괄호를 사용하는 것을 권장합니다. 나중에 코드를 추가할 때 실수를 방지할 수 있습니다.


if-else 문

if-else 문은 조건이 참일 때와 거짓일 때 각각 다른 코드를 실행합니다.

기본 문법

if (조건식) {
    // 조건이 true일 때 실행
} else {
    // 조건이 false일 때 실행
}

if-else 예제

int age = 15;

if (age >= 18) {
    System.out.println("성인입니다.");
} else {
    System.out.println("미성년자입니다.");
}
// 출력: 미성년자입니다.
int number = -5;

if (number >= 0) {
    System.out.println("양수입니다.");
} else {
    System.out.println("음수입니다.");
}
// 출력: 음수입니다.

실습: 짝수/홀수 판별

public class EvenOddTest {
    public static void main(String[] args) {
        int number = 17;

        if (number % 2 == 0) {
            System.out.println(number + "는 짝수입니다.");
        } else {
            System.out.println(number + "는 홀수입니다.");
        }
    }
}
// 출력: 17는 홀수입니다.

if-else if-else 문

여러 조건을 순차적으로 검사할 때 사용합니다.

기본 문법

if (조건1) {
    // 조건1이 true일 때 실행
} else if (조건2) {
    // 조건1이 false이고 조건2가 true일 때 실행
} else if (조건3) {
    // 조건1, 조건2가 false이고 조건3이 true일 때 실행
} else {
    // 모든 조건이 false일 때 실행
}

성적 등급 판별

int score = 85;
String grade;

if (score >= 90) {
    grade = "A";
} else if (score >= 80) {
    grade = "B";
} else if (score >= 70) {
    grade = "C";
} else if (score >= 60) {
    grade = "D";
} else {
    grade = "F";
}

System.out.println("학점: " + grade);
// 출력: 학점: B

시간대에 따른 인사말

int hour = 14;  // 오후 2시
String greeting;

if (hour < 12) {
    greeting = "좋은 아침입니다!";
} else if (hour < 18) {
    greeting = "좋은 오후입니다!";
} else {
    greeting = "좋은 저녁입니다!";
}

System.out.println(greeting);
// 출력: 좋은 오후입니다!
💡 조건 검사 순서

if-else if-else 문은 위에서 아래로 순차적으로 검사하며, 조건이 참인 블록을 실행한 후 나머지는 건너뜁니다.


중첩 if 문

if 문 안에 또 다른 if 문을 넣을 수 있습니다.

기본 문법

if (조건1) {
    if (조건2) {
        // 조건1과 조건2 모두 true일 때 실행
    }
}

중첩 if 예제

int age = 25;
boolean hasLicense = true;

if (age >= 18) {
    if (hasLicense) {
        System.out.println("운전할 수 있습니다.");
    } else {
        System.out.println("면허증이 필요합니다.");
    }
} else {
    System.out.println("나이가 부족합니다.");
}
// 출력: 운전할 수 있습니다.

학점 세부 판정

int score = 95;
String grade;

if (score >= 90) {
    if (score >= 95) {
        grade = "A+";
    } else {
        grade = "A";
    }
} else if (score >= 80) {
    if (score >= 85) {
        grade = "B+";
    } else {
        grade = "B";
    }
} else {
    grade = "C";
}

System.out.println("학점: " + grade);
// 출력: 학점: A+
⚠️ 중첩 if 문 대안

중첩이 깊어지면 코드가 복잡해집니다. 논리 연산자(&&)를 사용하면 더 간결하게 표현할 수 있습니다.

논리 연산자로 개선:

int age = 25;
boolean hasLicense = true;

if (age >= 18 && hasLicense) {
    System.out.println("운전할 수 있습니다.");
} else if (age >= 18) {
    System.out.println("면허증이 필요합니다.");
} else {
    System.out.println("나이가 부족합니다.");
}

switch 문

switch 문은 변수의 값에 따라 여러 경우 중 하나를 선택하여 실행합니다.

기본 문법

switch (변수) {
    case 값1:
        // 변수가 값1과 같을 때 실행
        break;
    case 값2:
        // 변수가 값2와 같을 때 실행
        break;
    default:
        // 모든 case에 해당하지 않을 때 실행
        break;
}

switch 문 기본 예제

int day = 3;
String dayName;

switch (day) {
    case 1:
        dayName = "월요일";
        break;
    case 2:
        dayName = "화요일";
        break;
    case 3:
        dayName = "수요일";
        break;
    case 4:
        dayName = "목요일";
        break;
    case 5:
        dayName = "금요일";
        break;
    case 6:
        dayName = "토요일";
        break;
    case 7:
        dayName = "일요일";
        break;
    default:
        dayName = "잘못된 요일";
        break;
}

System.out.println(dayName);
// 출력: 수요일

break의 중요성

break를 생략하면 다음 case로 계속 실행됩니다 (Fall-through).

int month = 3;
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);
// 출력: 봄

switch 문 vs if-else

switch 문 사용 가능 조건:

  • 변수가 정수형(byte, short, int, char)
  • 문자열(String) - Java 7 이상
  • 열거형(enum)

사용할 수 없는 경우:

  • 실수형(float, double)
  • 범위 비교(>=, <= 등)
// ✅ switch 사용 가능
String grade = "A";
switch (grade) {
    case "A":
        System.out.println("우수");
        break;
    case "B":
        System.out.println("양호");
        break;
    default:
        System.out.println("보통");
        break;
}

// ❌ switch 사용 불가 (범위 비교)
int score = 85;
// switch (score >= 90) { ... }  // 오류!

// ✅ if-else 사용
if (score >= 90) {
    System.out.println("A");
} else if (score >= 80) {
    System.out.println("B");
}

Java 14+ Enhanced Switch (참고)

Java 14 이후에는 화살표(->) 문법을 사용할 수 있습니다.

int day = 3;
String dayName = switch (day) {
    case 1 -> "월요일";
    case 2 -> "화요일";
    case 3 -> "수요일";
    case 4 -> "목요일";
    case 5 -> "금요일";
    case 6 -> "토요일";
    case 7 -> "일요일";
    default -> "잘못된 요일";
};

System.out.println(dayName);
// 출력: 수요일

삼항 연산자

삼항 연산자는 간단한 if-else 문을 한 줄로 표현할 수 있는 연산자입니다.

기본 문법

조건식 ? 값1 : 값2
  • 조건식이 true이면 값1 반환
  • 조건식이 false이면 값2 반환

삼항 연산자 예제

int age = 20;
String result = (age >= 18) ? "성인" : "미성년자";
System.out.println(result);
// 출력: 성인
int a = 10, b = 20;
int max = (a > b) ? a : b;
System.out.println("최댓값: " + max);
// 출력: 최댓값: 20

if-else 문과 비교

if-else 문:

int score = 85;
String result;

if (score >= 60) {
    result = "합격";
} else {
    result = "불합격";
}

삼항 연산자:

int score = 85;
String result = (score >= 60) ? "합격" : "불합격";

중첩 삼항 연산자

삼항 연산자를 중첩해서 사용할 수 있지만, 가독성이 떨어질 수 있습니다.

int score = 85;
String grade = (score >= 90) ? "A" :
               (score >= 80) ? "B" :
               (score >= 70) ? "C" : "F";
System.out.println(grade);
// 출력: B
💡 삼항 연산자 사용 팁

• 간단한 조건문은 삼항 연산자로 표현하면 코드가 간결해집니다.
• 복잡한 조건이나 여러 문장이 필요한 경우 if-else 문을 사용하세요.
• 중첩 삼항 연산자는 가독성이 떨어지므로 주의하세요.


종합 실습

문제 1 - if 문 기초 (기초)

문제 1

다음 Java 프로그램의 실행 결과는 무엇입니까?

조건문
public class Test {
    public static void main(String[] args) {
        int number = 15;
        if (number > 10) {
            System.out.println("10보다 큽니다.");
        }
    }
}

문제 2 - if-else 문 (기초)

문제 2

다음 Java 프로그램의 실행 결과는 무엇입니까?

조건문
public class Test {
    public static void main(String[] args) {
        int age = 16;
        if (age >= 18) {
            System.out.println("성인");
        } else {
            System.out.println("미성년자");
        }
    }
}

문제 3 - if-else if-else (기초)

문제 3

다음 Java 프로그램의 실행 결과는 무엇입니까?

조건문
public class Test {
    public static void main(String[] args) {
        int score = 75;
        if (score >= 90) {
            System.out.println("A");
        } else if (score >= 80) {
            System.out.println("B");
        } else if (score >= 70) {
            System.out.println("C");
        } else {
            System.out.println("D");
        }
    }
}

문제 4 - switch 문 (중급)

문제 4

다음 Java 프로그램의 실행 결과는 무엇입니까?

조건문
public class Test {
    public static void main(String[] args) {
        int month = 8;
        String season;
        switch (month) {
            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);
    }
}

문제 5 - 삼항 연산자 (중급)

문제 5

다음 Java 프로그램의 실행 결과는 무엇입니까?

조건문
public class Test {
    public static void main(String[] args) {
        int num = 7;
        String result = (num % 2 == 0) ? "짝수" : "홀수";
        System.out.println(result);
    }
}

문제 6 - 중첩 if 문 (중급)

문제 6

다음 Java 프로그램의 실행 결과는 무엇입니까?

조건문
public class Test {
    public static void main(String[] args) {
        int score = 92;
        if (score >= 90) {
            if (score >= 95) {
                System.out.println("A+");
            } else {
                System.out.println("A");
            }
        }
    }
}

문제 7 - break 없는 switch (고급)

문제 7

다음 Java 프로그램의 실행 결과는 무엇입니까? (줄바꿈 포함)

조건문
public class Test {
    public static void main(String[] args) {
        int num = 2;
        switch (num) {
            case 1:
                System.out.println("one");
            case 2:
                System.out.println("two");
            case 3:
                System.out.println("three");
                break;
            default:
                System.out.println("other");
        }
    }
}

문제 8 - 복합 조건 (고급)

문제 8

다음 Java 프로그램의 실행 결과는 무엇입니까?

조건문
public class Test {
    public static void main(String[] args) {
        int x = 10;
        int y = 20;
        String result = (x > 5 && y < 30) ? "조건1" :
                        (x > 15 || y > 15) ? "조건2" : "조건3";
        System.out.println(result);
    }
}

실전 프로그래밍

과제 1: BMI 계산기

체질량 지수(BMI)를 계산하고 비만도를 판정하는 프로그램을 작성하세요.

요구사항:

  • 몸무게(kg)와 키(m)를 변수에 저장
  • BMI = 몸무게 / (키 * 키)
  • BMI에 따른 판정:
    • 18.5 미만: 저체중
    • 18.5 이상 25 미만: 정상
    • 25 이상 30 미만: 과체중
    • 30 이상: 비만
예시 답안 보기
public class BMICalculator {
    public static void main(String[] args) {
        double weight = 70.0;  // kg
        double height = 1.75;  // m

        double bmi = weight / (height * height);
        String status;

        if (bmi < 18.5) {
            status = "저체중";
        } else if (bmi < 25) {
            status = "정상";
        } else if (bmi < 30) {
            status = "과체중";
        } else {
            status = "비만";
        }

        System.out.printf("BMI: %.2f\n", bmi);
        System.out.println("판정: " + status);
    }
}

출력:

BMI: 22.86
판정: 정상

과제 2: 계산기 프로그램

두 숫자와 연산자를 입력받아 계산하는 간단한 계산기 프로그램을 작성하세요.

요구사항:

  • 두 개의 정수 변수 선언 (예: 10, 5)
  • 연산자 변수 선언 (‘+’, ‘-‘, ‘*’, ‘/’, ‘%’)
  • switch 문을 사용하여 연산 수행
  • 결과 출력
예시 답안 보기
public class Calculator {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 5;
        char operator = '*';
        int result;

        switch (operator) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                result = num1 / num2;
                break;
            case '%':
                result = num1 % num2;
                break;
            default:
                System.out.println("잘못된 연산자입니다.");
                return;
        }

        System.out.printf("%d %c %d = %d\n", num1, operator, num2, result);
    }
}

출력:

10 * 5 = 50

과제 3: 학점 세부 판정 시스템

점수를 입력받아 학점과 세부 등급(+, 0)을 판정하는 프로그램을 작성하세요.

요구사항:

  • 0~100 점수를 변수에 저장
  • 학점 판정:
    • 90 이상: A
    • 80 이상: B
    • 70 이상: C
    • 60 이상: D
    • 60 미만: F
  • 각 구간에서 상위 50%는 +, 하위 50%는 0 (F 제외)
    • 예: 95점 이상은 A+, 90~94는 A
예시 답안 보기
public class GradeSystem {
    public static void main(String[] args) {
        int score = 87;
        String grade;

        if (score >= 90) {
            grade = (score >= 95) ? "A+" : "A";
        } else if (score >= 80) {
            grade = (score >= 85) ? "B+" : "B";
        } else if (score >= 70) {
            grade = (score >= 75) ? "C+" : "C";
        } else if (score >= 60) {
            grade = (score >= 65) ? "D+" : "D";
        } else {
            grade = "F";
        }

        System.out.println("점수: " + score);
        System.out.println("학점: " + grade);
    }
}

출력:

점수: 87
학점: B+

핵심 요약

이번 챕터에서 배운 내용

  1. if 문
    if (조건) {
        // 조건이 true일 때 실행
    }
    
  2. if-else 문
    if (조건) {
        // true일 때
    } else {
        // false일 때
    }
    
  3. if-else if-else 문
    if (조건1) {
        // 조건1 true
    } else if (조건2) {
        // 조건2 true
    } else {
        // 모두 false
    }
    
  4. switch 문
    switch (변수) {
        case 값1:
            // 실행 코드
            break;
        case 값2:
            // 실행 코드
            break;
        default:
            // 기본 코드
            break;
    }
    
  5. 삼항 연산자
    조건 ? 값1 : 값2
    
  6. 주요 포인트
    구분 용도
    if 계열 범위 비교, 복잡한 조건
    switch 값의 일치 비교 (정수, 문자열, enum)
    삼항 연산자 간단한 조건, 값 할당
  7. 중요 사항
    • switch 문에서 break를 빠뜨리면 Fall-through 발생
    • 중괄호 생략은 권장하지 않음
    • 중첩이 깊어지면 논리 연산자 사용 고려
    • 삼항 연산자는 간단한 경우에만 사용

다음 챕터 예고

다음 챕터에서는 반복문을 배웁니다.

  • for 문
  • while 문
  • do-while 문
  • 중첩 반복문
  • break와 continue
  • 무한 루프

🎯

조건문 학습 완료!

조건에 따라 프로그램의 흐름을 제어하는 방법을 배웠습니다.
이제 반복문을 배우면 더욱 강력한 프로그램을 만들 수 있습니다!