본문으로 건너뛰기
Advertisement

12.4 레코드와 실드 클래스 (Record & Sealed Class)

Java 14(프리뷰) → 16(정식)에서 도입된 레코드(Record) 와 Java 17에서 정식 도입된 실드 클래스(Sealed Class) 는 모던 자바의 핵심 기능으로, 코드를 더 간결하고 안전하게 만들어줍니다.

1. 레코드 (Record)

데이터를 담기 위한 간단한 클래스를 만들 때, 기존에는 다음을 모두 직접 작성해야 했습니다:

  • private final 필드 선언
  • 생성자(Constructor)
  • getter 메서드
  • toString(), equals(), hashCode() 오버라이딩

레코드는 이 모든 것을 단 한 줄로 자동 생성 해줍니다!

// 기존 방식: 데이터 클래스 (코드가 매우 길다)
public class PersonOld {
private final String name;
private final int age;

public PersonOld(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }

@Override
public String toString() {
return "PersonOld[name=" + name + ", age=" + age + "]";
}
// equals(), hashCode() 생략...
}

// 레코드 방식: 딱 1줄!
public record Person(String name, int age) {}
public class RecordExample {
public static void main(String[] args) {
Person p = new Person("김민준", 25);

// getter는 필드명 그대로 메서드가 됩니다
System.out.println(p.name()); // 김민준
System.out.println(p.age()); // 25

// toString, equals, hashCode 자동 제공
System.out.println(p); // Person[name=김민준, age=25]

Person p2 = new Person("김민준", 25);
System.out.println(p.equals(p2)); // true (내용 비교)
}
}

레코드는 불변(Immutable) 데이터 객체입니다. 값을 바꾸는 setter가 없고, 생성 후에는 필드값을 변경할 수 없습니다. API 응답 데이터, DTO(Data Transfer Object) 등에 이상적입니다.

2. 실드 클래스 (Sealed Class)

실드(Sealed) 클래스는 "이 클래스를 상속할 수 있는 클래스를 딱 이것들로만 제한하겠다" 고 명시하는 방법입니다. sealed 키워드와 permits 절을 함께 씁니다.

// Shape 클래스는 Circle, Rectangle, Triangle만 상속 가능!
public sealed class Shape
permits Circle, Rectangle, Triangle {

public abstract double area();
}

// 각 서브클래스는 반드시 final, sealed, non-sealed 중 하나를 선택해야 함
public final class Circle extends Shape {
private final double radius;
public Circle(double radius) { this.radius = radius; }

@Override
public double area() { return Math.PI * radius * radius; }
}

public final class Rectangle extends Shape {
private final double width, height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

@Override
public double area() { return width * height; }
}

실드 클래스는 Java 21의 패턴 매칭(Pattern Matching)과 함께 쓸 때 특히 강력합니다.

// Java 21 - switch 패턴 매칭
static String describe(Shape shape) {
return switch (shape) {
case Circle c -> "원, 넓이: " + c.area();
case Rectangle r -> "직사각형, 넓이: " + r.area();
default -> "알 수 없는 도형";
};
}

레코드와 실드 클래스는 자바를 더 표현력 있고, 안전하며, 유지보수하기 쉽게 만드는 현대 자바의 핵심 기능들입니다.

Advertisement