Monday

8. Java 14 레코드와 17의 패턴 패칭 본문

언어/Java

8. Java 14 레코드와 17의 패턴 패칭

뉴비2 2024. 11. 10. 23:21

레코드(Record) 타입

레코드는 불변 데이터 객체를 간단하게 생성할 수 있는 특별한 클래스 유형입니다. 주요 특징은 다음과 같습니다:

// 레코드 정의 예시
public record Person(String name, int age) {
    // 컴팩트 생성자
    public Person {
        // 유효성 검사 로직 추가 가능
        if (age < 0) {
            throw new IllegalArgumentException("나이는 음수일 수 없습니다.");
        }
    }

    // 추가 메서드 정의 가능
    public boolean isAdult() {
        return age >= 18;
    }
}

// 사용 예시
Person john = new Person("John Doe", 30);
System.out.println(john.name()); // 자동 생성된 접근자 메서드
System.out.println(john.isAdult()); // 커스텀 메서드

패턴 매칭 for switch 문

패턴 매칭은 switch 문을 더욱 강력하고 표현력 있게 만드는 기능입니다:

// 타입 패턴 매칭
public static String describeObject(Object obj) {
    return switch (obj) {
        case Integer i -> "정수: " + i;
        case String s -> "문자열: " + s;
        case List<String> list -> "문자열 리스트: " + list.size() + "개";
        default -> "알 수 없는 타입";
    };
}

// 사용 예시
System.out.println(describeObject(42)); // "정수: 42"
System.out.println(describeObject(List.of("a", "b"))); // "문자열 리스트: 2개"

레코드 패턴

레코드 패턴을 사용하면 레코드의 구성 요소를 쉽게 분해할 수 있습니다:

public record Point(int x, int y) {}

public static String analyzePoint(Object obj) {
    return switch (obj) {
        case Point(int x, int y) when x == y -> 
            "대각선 상의 점: (" + x + ", " + y + ")";
        case Point(int x, int y) -> 
            "일반 점: (" + x + ", " + y + ")";
        default -> "알 수 없는 객체";
    };
}

// 사용 예시
Point point = new Point(5, 5);
System.out.println(analyzePoint(point)); // "대각선 상의 점: (5, 5)"

중첩 패턴 매칭

복잡한 객체 구조에서도 패턴 매칭을 활용할 수 있습니다:

public record Address(String street, String city) {}
public record Person(String name, Address address) {}

public static String processAddress(Object obj) {
    return switch (obj) {
        case Person(String name, Address(String street, String city)) -> 
            name + "의 주소: " + street + ", " + city;
        case Address(String street, String city) -> 
            "주소: " + street + ", " + city;
        default -> "알 수 없는 주소 정보";
    };
}

// 사용 예시
Address address = new Address("123 Main St", "New York");
Person john = new Person("John Doe", address);

System.out.println(processAddress(john)); 
// "John Doe의 주소: 123 Main St, New York"

주요 장점들:

  • 간결한 데이터 모델링
  • 불변성 보장
  • 자동 생성된 메서드 (equals(), hashCode(), toString())
  • 패턴 매칭을 통한 유연한 데이터 처리

주의사항:

  • 레코드는 암시적으로 final
  • 명시적 상속 불가
  • 필드는 모두 final이며 컴팩트 생성자로 검증 가능

이러한 기능들은 Java 14부터 점진적으로 도입되었습니다.

Comments