자동으로 생성자와 멤버를 가지는 클래스를 만들어준다.
쓸데없이 잔뜩 뭔가를 많이 코딩해야 하는 java인데 이걸 좀 줄여보겠다고 만든거라고 한다.
kotlin의 data class와 거의 비슷하다고 한다.
JDK14에서 preview로 처음 나왔고 JDK16에서 정식 스펙으로 포함되었다. 처음 나왔을 때와 지금 정식으로 포함된 내용이 조금 달라서 기존에 쓰여진 글들의 내용이 안맞는 경우도 있다.
class 대신에 record라고 keyword를 사용한다.
이렇게 쓰면,
record Point(int x, int y) { }
이 뜻이다.
record Point(int x, int y) {
// 이렇게 필드가 암묵적으로 생성된다.
private final int x;
private final int y;
// Getter, equals, hashCode, toString 등등도 자동으로 암묵적으로 생성된다.
// Getter는 getXXX 모양이 아니라, public int x() 처럼 필드명을 메소드명으로 해서 만들어진다.
// 생성자도 암묵적으로 생성된다.
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Setter는 자동으로 만든 생성자를 이용하게끔 되어 있다.
record Point(int x, int y) {
// 이렇게 생성자를 사용할 수 있다.
Point {
x *= 50;
y *= 100;
// this.x = x 라고 코딩하지 않아도 알아서 해준다.
}
}
쓸 때에는 new 하면 된다.
Point p = new Point(3, 4);
모든 record는 java.lang.Record 을 상속받은 클래스이다.
record는 final class이고 선언할 때 적은 멤버들도 final이다.
static 멤버를 만들 수도 있다.
native 메소드는 만들 수 없다.
제네릭 된다.
interface를 구현할 수 있다.
annotation도 걸 수 있다.
inner class는 좀 복잡하다. JDK 버전이 올라가면 바뀔 여지도 있는 듯하다.
이 외에도 온갖 규칙이 있다 ;;;
참고