레코드란?
ㆍ 불변(immutable) 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스
ㆍ JDK14에서 preview로 등장하여 JDK16에서 정식 스펙으로 포함
기존의 불변 데이터 객체
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
ㆍ 상태(name, age)를 보유하는 불변 객체를 생성하기 위한 많은 코드를 작성함
- 모든 필드에 final을 사용하여 명시적으로 정의
- 필드 값을 모두 포함한 생성자
- 모든 필드에 대한 접근자 메서드(getter)
- 상속을 방지하기 위해 클래스 자체를 final로 선언하기도함
- 로깅 출력을 제공하기 위한 toString 재정의
- 두 개의 인스턴스를 비교하기 위한 hashCode, equals 재정의
레코드를 이용한 불변 객체
public record Person(String name, int age) {
}
ㆍ레코드 클래스를 사용하면 훨씬 간결한 방식으로 동일한 불변 데이터 객체 정의할 수 있음
- 이름(Person), 헤더(String name, int age), 바디({})
ㆍ컴파일러는 헤더를 통해 내부 필드를 추론
- 생성자를 작성하지 않아도 되고 toString, equals, hashCode 메소드에 대한 구현을 자동으로 제공
▶ 예시 - Person 레코드 클래스의 사용법
public class RecordDemo {
public static void main(String[] args){
Person person = new Person("Ted", 100);
System.out.println("이름:"+ person.name() + " 나이:"+person.age());
System.out.println("객체 정보:"+person.toString());
Person person2 = new Person("Ted", 100);
Person person3 = new Person("Dean", 200);
if (person.equals(person2)) System.out.println("person, person2는 같은 사람");
else System.out.println("person, person2는 다른 사람");
if (person.equals(person3)) System.out.println("person, person3는 같은 사람");
else System.out.println("person, person3는 다른 사람");
}
}
ㆍ기본적인 동작을 재정의할 수 있음
▶ 예시 - 나이 제한하기
public record Person(String name, int age) {
public Person{
if(age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
}
}
ㆍ레코드의 제한
- 레코드는 암묵적으로 final 클래스(상속불가)이고, abstract 선언 불가
- 다른 클래스를 상속(extends) 받을 수 없음, 인터페이스 구현(implements)은 가능
출처
https://www.baeldung.com/java-15-new
https://mostadmired.tistory.com/133
https://openjdk.java.net/jeps/384
'자바' 카테고리의 다른 글
[Java] 자바 7의 새로운 기능 (0) | 2021.09.10 |
---|---|
[Java] 자바의 스트림(Stream) (0) | 2021.09.09 |
[Java] 자바의 모듈 시스템(module) (0) | 2021.09.09 |
[Java] 컬렉션 프레임워크(Collection Framework) (0) | 2021.09.05 |
[Java] Enum과 싱글톤(Singleton) (0) | 2021.08.31 |
댓글