목차
레코드(record)란
- "데이터 클래스"이며 순수하게 데이터를 보유하기 위한 특수한 종류의 클래스이다.
- 불변(immutable) 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스
- JDK14에서 preview로 등장하여 JDK16에서 정식 스펙으로 포함
- 코틀린의 데이터 클래스와 비슷한 느낌
- 탄생 배경: 일반 클래스는 상태(name, age)를 보유하는 불변 객체를 생성하기 위한 많은 코드를 작성함
- 모든 필드에 final을 사용하여 명시적으로 정의
- 필드 값을 모두 포함한 생성자
- 모든 필드에 대한 접근자 메서드(getter)
- 상속을 방지하기 위해 클래스 자체를 final로 선언하기도함
- 로깅 출력을 제공하기 위한 toString 재정의
- 두 개의 인스턴스를 비교하기 위한 hashCode, equals 재정의
- 기능이 거의 없이 데이터들만 표현하는 DTO 클래스를 생성할때 사용하면 좋다.
- toString, equals, hashCode 기능을 자동 지원
- 클래스에서는 매번 생성해줘야 하던 getter기능이 자동으로 추가된다.(다만 get000()형태가 아닌 000()의 이름을 가진다.
- 레코드는 암묵적으로 final 클래스(상속불가)이고, abstract 선언 불가
- 다른 클래스를 상속(extends) 받을 수 없음, 인터페이스 구현(implements)은 가능
- 각 필드는 private final 필드로 정의된다.
- 모든 필드를 초기화하는 RequiredAllArgument 생성자가 생성된다.
public record SampleRecord(
String name,
Integer age,
Address address
) {}
- 하지만 json serialize가 되기 위해서는 위와 같이 선언하면 안된다. 아래와 같이 jackson 어노테이션을 붙여줘야한다.
public record SampleRecord(
@JsonProperty("name") String name,
@JsonProperty("age") Integer age,
@JsonProperty("address") Address address
) {}
- record 클래스는 static 변수를 가질 수 있고, static&public method를 가질 수 있다. 또한 생성자를 명시적으로 넣어 validation 체크가 가능하다.
public record SampleRecord(
@JsonProperty("name") String name,
@JsonProperty("age") Integer age,
@JsonProperty("address") Address address
) {
public SampleRecord {
if (name == null || age == null || address == null) {
throw new IllegalArgumentException();
}
}
static String STATIC_VARIABLE = "static variable";
@JsonIgnore
public String getInfo() {
return this.name + " " + this.age;
}
public static String get() {
return STATIC_VARIABLE;
}
}
'I leaned > JAVA' 카테고리의 다른 글
접근자 (0) | 2024.02.05 |
---|---|
ArrayList VS LinkedList (0) | 2024.01.29 |
코딩테스트 문법 (0) | 2023.11.08 |
상수는 왜 static final로 선언할까? (0) | 2023.10.05 |
레코드(record)란
- "데이터 클래스"이며 순수하게 데이터를 보유하기 위한 특수한 종류의 클래스이다.
- 불변(immutable) 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스
- JDK14에서 preview로 등장하여 JDK16에서 정식 스펙으로 포함
- 코틀린의 데이터 클래스와 비슷한 느낌
- 탄생 배경: 일반 클래스는 상태(name, age)를 보유하는 불변 객체를 생성하기 위한 많은 코드를 작성함
- 모든 필드에 final을 사용하여 명시적으로 정의
- 필드 값을 모두 포함한 생성자
- 모든 필드에 대한 접근자 메서드(getter)
- 상속을 방지하기 위해 클래스 자체를 final로 선언하기도함
- 로깅 출력을 제공하기 위한 toString 재정의
- 두 개의 인스턴스를 비교하기 위한 hashCode, equals 재정의
- 기능이 거의 없이 데이터들만 표현하는 DTO 클래스를 생성할때 사용하면 좋다.
- toString, equals, hashCode 기능을 자동 지원
- 클래스에서는 매번 생성해줘야 하던 getter기능이 자동으로 추가된다.(다만 get000()형태가 아닌 000()의 이름을 가진다.
- 레코드는 암묵적으로 final 클래스(상속불가)이고, abstract 선언 불가
- 다른 클래스를 상속(extends) 받을 수 없음, 인터페이스 구현(implements)은 가능
- 각 필드는 private final 필드로 정의된다.
- 모든 필드를 초기화하는 RequiredAllArgument 생성자가 생성된다.
public record SampleRecord(
String name,
Integer age,
Address address
) {}
- 하지만 json serialize가 되기 위해서는 위와 같이 선언하면 안된다. 아래와 같이 jackson 어노테이션을 붙여줘야한다.
public record SampleRecord(
@JsonProperty("name") String name,
@JsonProperty("age") Integer age,
@JsonProperty("address") Address address
) {}
- record 클래스는 static 변수를 가질 수 있고, static&public method를 가질 수 있다. 또한 생성자를 명시적으로 넣어 validation 체크가 가능하다.
public record SampleRecord(
@JsonProperty("name") String name,
@JsonProperty("age") Integer age,
@JsonProperty("address") Address address
) {
public SampleRecord {
if (name == null || age == null || address == null) {
throw new IllegalArgumentException();
}
}
static String STATIC_VARIABLE = "static variable";
@JsonIgnore
public String getInfo() {
return this.name + " " + this.age;
}
public static String get() {
return STATIC_VARIABLE;
}
}
'I leaned > JAVA' 카테고리의 다른 글
접근자 (0) | 2024.02.05 |
---|---|
ArrayList VS LinkedList (0) | 2024.01.29 |
코딩테스트 문법 (0) | 2023.11.08 |
상수는 왜 static final로 선언할까? (0) | 2023.10.05 |