1. 중첩 if의 기본 문법
현실에서는 하나의 기준만으로 결정을 내리는 경우가 드뭅니다. 보통 여러 조건을 한꺼번에 확인해야 하고, 이 조건들이 서로 의존적일 때가 많습니다. 예를 들어 콘서트에 입장하려면 성인이라는 사실만으로는 부족하고 — 초대 명단에 있어야 할 때도 있습니다. 여기서 등장하는 것이 바로 다층 로직이며, 이를 도와주는 것이 중첩된 if 문입니다.
중첩 조건이란 한 if가 다른 if 내부에 들어있는 것을 말합니다. 상자 속 상자를 떠올려 보세요: 바깥 조건이 만족될 때에만 안쪽 조건이 검사됩니다. 이는 제어 흐름을 다루는 강력한 도구입니다.
간단한 것부터 시작해 봅시다:
if (uslovieA)
{
// uslovieA가 true(참)일 때의 동작
if (uslovieB)
{
// 두 조건이 모두 참일 때의 동작
}
}
if 안에 또 다른
if 중첩
이것이 마트료시카를 떠올리게 된다면 — 제대로 이해하신 겁니다! 안쪽 if는 바깥쪽이 먼저 통과했을 때만 실행됩니다.
예시: 클럽 입장
이전에 사용자에게 이름과 나이를 입력받던 학습용 애플리케이션을 발전시켜 봅시다. 이제 두 번째 검증 단계를 추가합니다: 비공개 클럽에 들어가려면 21세 이상이어야 하고 초대 코드가 있어야 한다고 해봅시다.
System.out.print("이름을 입력하세요: ");
String name = console.nextLine();
System.out.print("나이를 입력하세요: ");
int age = console.nextInt();
if (age >= 21)
{
System.out.print("초대 코드를 입력하세요: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("환영합니다, " + name + "님, VIP 클럽에 오신 것을 환영합니다!");
}
else
{
System.out.println("죄송합니다, 코드가 올바르지 않습니다. 접근이 거부되었습니다.");
}
}
else
{
System.out.println("죄송합니다, 21세 이상만 입장할 수 있습니다!");
}
유의하세요: 안쪽 if는 나이 검사를 통과한 경우에만 코드를 확인합니다. 이는 자원(과 경비원의 신경)을 아껴 줍니다.
2. 중첩은 몇 단계까지가 적절할까요?
기술적으로는 — 제한이 없습니다. 하지만 실무에서는: 중첩 단계가 많아질수록 읽기와 유지보수가 어려워집니다. 보통 2–3단계로 제한하려고 합니다. 만약 4개 이상 중첩된 if로 “계단”이 생긴다면, 로직을 단순화하거나 검사를 메서드로 분리할 수 없는지 고민해 보세요.
3. 중첩 if와 else: 함정과 요령
초보자가 자주 하는 실수: 중괄호를 부주의하게 사용하는 것.
Java에서 else를 사용할 때는 엄격한 규칙이 있습니다: 중괄호 {}가 없으면 if 또는 else 뒤의 첫 번째 명령문 한 줄만 해당됩니다. 이는 자주 발생하는 성가신 버그의 원인입니다.
잠재적 오류가 있는 예시:
if (age >= 21)
if (code.equals("VIP2024"))
System.out.println("환영합니다!");
else
System.out.println("잘못된 코드입니다.");
많은 분들이 else가 나이 검사에 대응한다고 기대하지만, 실제로는 바로 앞의 if(초대 코드 검사)에 대응합니다. 따라서 메시지가 기대와 다르게 출력될 수 있습니다. 항상 중괄호를 사용하는 것이 좋습니다 — 안에 한 줄만 있더라도요!
오해가 없도록, 컴파일러는 이 코드를 다음과 같이 해석합니다:
if (age >= 21)
{
if (code.equals("VIP2024"))
System.out.println("환영합니다!");
else
System.out.println("잘못된 코드입니다.");
}
중요! 다시 한 번: if-else 구성에서 중괄호를 생략하면, else는 바로 앞(가장 가까운) if에 대응합니다.
4. 대안: 중첩 조건에서의 else if
때로는 바깥쪽 if 안에서 추가 조건을 확인하는 것뿐만 아니라, 대안을 마련하고 싶을 수 있습니다. 예를 들어 초대 코드가 맞지 않다면 게스트 접근을 제안하거나 거절할 수 있습니다.
if (age >= 21)
{
System.out.print("초대 코드를 입력하세요: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("클럽에 오신 것을 환영합니다!");
}
else if (code.equals("GUEST"))
{
System.out.println("게스트 모드: 23:00까지만 입장 가능합니다.");
}
else
{
System.out.println("유감이지만, 접근할 수 없습니다.");
}
}
else
{
System.out.println("21세 이상만 입장 가능합니다.");
}
여기서는 바깥 선택 흐름 안에서 세 가지 시나리오(VIP 코드, 게스트 코드, 거절) 중 하나를 고르는 중첩 선택을 수행합니다.
5. 실습: 다층 로직을 활용한 할인 계산기
사용자의 나이와 클럽 카드 보유 여부를 기반으로 할인을 부여한다고 가정해 봅시다.
- 사용자 나이가 60 이상이면 — 할인 15%.
- 그보다 어리지만 클럽 카드를 가지고 있으면 — 할인 7%.
- 그 외의 경우 — 할인 없음.
어떻게 작성할 수 있을까요?
System.out.print("나이를 입력하세요: ");
int age = console.nextInt();
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
System.out.print("클럽 카드를 가지고 계신가요 (예/아니오)? ");
String hasCard = console.nextLine();
if (hasCard.equals("예"))
{
discount = 0.07;
}
}
System.out.println("할인: " + (discount * 100) + "%");
여기서는 else 분기 안에 중첩된 if를 사용합니다: 나이가 기준에 못 미칠 때에만 카드 보유 여부를 묻습니다.
GO TO FULL VERSION