본문 바로가기
JAVA

JAVA: Case에 String 타입 사용, Null 선택자 변수[코딩백과 with JAVA]

by GangDev 2024. 12. 22.

1.8.3: Case 레이블에 String 타입 사용하기

Java SE 7 버전부터 Switch 문에서 case 레이블에 String 타입을 사용할 수 있게 되었습니다. 이 기능은 문자열 기반의 조건부 로직을 더 깔끔하고 효율적으로 구현할 수 있게 해주었습니다. 이 섹션에서는 String 타입을 case 레이블로 사용하는 방법과 이를 활용한 예제들을 상세히 살펴보겠습니다.

String 타입 case 레이블 사용법

String 타입을 case 레이블로 사용할 때는 다음과 같은 규칙을 따릅니다:

Switch 문의 표현식은 String 타입이어야 합니다.
각 case 레이블은 문자열 리터럴이어야 합니다.
문자열 비교는 equals() 메서드를 사용하여 수행됩니다.

기본 예제

  1. 사용자로부터 영어로 된 색상을 입력받습니다.
  2. Switch 문을 사용하여 입력된 색상에 따라 한국어로 번역합니다.
  3. 각 색상에 대해 적절한 한국어 번역을 출력합니다.
import java.util.Scanner;

public class ColorTranslator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("영어로 된 색상을 입력하세요: ");
        String colorEnglish = scanner.nextLine().trim().toLowerCase();

        String colorKorean;

        switch (colorEnglish) {
            case "red":
                colorKorean = "빨간색";
                break;
            case "blue":
                colorKorean = "파란색";
                break;
            case "green":
                colorKorean = "초록색";
                break;
            case "yellow":
                colorKorean = "노란색";
                break;
            case "purple":
                colorKorean = "보라색";
                break;
            case "orange":
                colorKorean = "주황색";
                break;
            default:
                colorKorean = "알 수 없는 색상";
        }

        System.out.println(colorEnglish + "은/는 한국어로 '" + colorKorean + "'입니다.");
    }
}

이 예제에서:

  1. Scanner 클래스의 nextLine() 메서드를 사용하여 전체 라인을 읽고, trim() 메서드로 앞뒤 공백을 제거합니다.
  2. toLowerCase() 메서드를 사용하여 입력된 색상을 소문자로 변환하여 대소문자를 구분하지 않고 비교합니다.
  3. Switch 문에서 각 case 레이블은 영어로 된 색상의 소문자 형태입니다.
  4. default 절은 알 수 없는 색상에 대한 처리를 합니다.

실용적인 예제: 계절 판별

import java.util.Scanner;

public class WeatherActivitySuggester {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("오늘의 날씨를 영어로 입력하세요 (예: sunny, rainy, cloudy): ");
        String weather = scanner.nextLine().trim().toLowerCase();

        String activity;

        switch (weather) {
            case "sunny":
                activity = "해변가나 공원에서 산책하기";
                break;
            case "rainy":
                activity = "영화관 가기 또는 집에서 책 읽기";
                break;
            case "cloudy":
                activity = "산책하거나 카페에서 차 마시기";
                break;
            case "windy":
                activity = "실내 운동이나 요리하기";
                break;
            case "snowy":
                activity = "스키장 가기 또는 눈싸움하기";
                break;
            default:
                activity = "날씨에 맞는 활동을 찾지 못했습니다.";
        }

        System.out.println("오늘의 날씨 '" + weather + "'에는 '" + activity + "'를 추천합니다.");
    }
}
  1. Scanner 클래스의 nextLine() 메서드를 사용하여 전체 라인을 읽고, trim() 메서드로 앞뒤 공백을 제거합니다.
  2. toLowerCase() 메서드를 사용하여 입력된 날씨 상태를 소문자로 변환하여 대소문자를 구분하지 않고 비교합니다.
  3. Switch 문에서 각 case 레이블은 영어로 된 날씨 상태의 소문자 형태입니다.
  4. default 절은 알 수 없는 날씨 상태에 대한 처리를 합니다.

주의사항 및 모범 사례

  1. 대소문자 구분: 문자열 비교 시 대소문자를 고려해야 합니다. 위의 예제에서는 toLowerCase()를 사용하여 이를 해결했습니다.
switch (month.toLowerCase()) {
    // ...
}
  1. null 안전성: Switch 문의 표현식이 null일 경우 NullPointerException이 발생할 수 있습니다. 따라서 null 체크를 수행하는 것이 좋습니다.
if (month != null) {
    switch (month.toLowerCase()) {
        // ...
    }
} else {
    System.out.println("월 정보가 없습니다.");
}
  1. 정규화: 입력된 문자열을 정규화하여 공백이나 특수 문자를 제거하는 것이 좋습니다.
String normalizedMonth = month.trim().replaceAll("[^a-zA-Z]", "");
switch (normalizedMonth.toLowerCase()) {
    // ...
}
  1. 국제화: 다국어 지원이 필요한 경우, 리소스 번들(Resource Bundle)을 사용하여 지역화된 문자열을 관리하는 것이 좋습니다.
  2. 성능 고려: 많은 case가 있는 Switch 문은 컴파일러에 의해 최적화될 수 있습니다. 하지만 매우 큰 수의 case가 있을 경우, HashMap과 같은 자료구조를 사용하는 것이 더 효율적일 수 있습니다.

String 타입을 case 레이블로 사용하면 문자열 기반의 조건부 로직을 더 깔끔하고 읽기 쉽게 만들 수 있습니다. 대소문자와 null 값 등에 주의를 기울이고, 필요에 따라 입력값을 정규화하는 것이 중요합니다.

1.8.4: Null Selector Variables

1.8.4: Null 선택자 변수

Null 선택자 변수는 Switch 문에서 특별히 주의해야 하는 사항입니다. 이 섹션에서는 Null 선택자 변수의 문제점과 이를 처리하는 방법에 대해 설명합니다.

Null 선택자 변수의 문제점

  1. NullPointerException: Switch 문의 선택자 변수가 Null인 경우, 실행 시 NullPointerException이 발생합니다.
  2. 예상치 못한 동작: Null 값은 어떤 case에도 매칭되지 않아 예상치 못한 결과를 초래할 수 있습니다.

Null 처리 방법

  1. Null 체크:
String month = getMonth(); // Null일 가능성이 있는 메서드

if (month != null) {
    switch (month.toLowerCase()) {
        case "january": 
            System.out.println("1월");
            break;
        // ...
    }
} else {
    System.out.println("월 정보가 없습니다.");
}
  1. Optional 클래스 사용 (Java 8 이상):
Optional<String> optionalMonth = Optional.ofNullable(getMonth());

optionalMonth.ifPresentOrElse(
    m -> {
        switch (m.toLowerCase()) {
            case "january": 
                System.out.println("1월");
                break;
            // ...
        }
    },
    () -> System.out.println("월 정보가 없습니다.")
);
  1. 디폴트 케이스 활용:
String month = getMonth();

switch (month != null ? month.toLowerCase() : "") {
    case "":
        System.out.println("월 정보가 없습니다.");
        break;
    case "january": 
        System.out.println("1월");
        break;
    // ...
}

  1. 항상 Null 체크를 수행하거나 Optional을 사용하여 Null 안전성을 보장하세요.
  2. 디폴트 케이스를 활용하여 Null 값에 대한 처리를 명시적으로 구현하세요.
  3. 메서드 문서화에서 Null 가능성을 명시하고, 호출자가 이를 인지할 수 있도록 하세요.

편히 모아진 글 보시려면 아래 위키독스 링크 >>
https://wikidocs.net/book/17111