Java 14 레코드 소개

JDK 14 릴리스에는 몇 가지 멋진 기능이 있습니다. 지금은 레코드만 살펴보겠습니다.

Java용으로 설정된 6개월 릴리스 케이던스가 작동하는 것으로 보이며 팀의 훌륭한 움직임이라고 생각합니다.

우리는 모든 릴리스에서 "멋진"기능을 기대해서는 안 되며 Java에 추가된 기능이 "멋진"또는 "멋진"기능을 만드는 것이 아니라 개발자 생산성을 높이고 버그를 줄이기 위한 것임을 이해해야 합니다.

아래 Java 코드를 고려하십시오.

    public static void main(String[] args) {

        var json = """
                {
                "statusCode" : 404,
                "statusMessage" : "Not Found"
                }
                """;

        var gson = new Gson();

        //var message = gson.fromJson(json, );

    }


JSON 문자열을 역직렬화하는 동안 사용할 Java 클래스만 있으면 됩니다. 일부 데이터만 보유하는 클래스입니다.

다음과 같이 작성해야 할 수도 있습니다.

public class Response {
    private final int statusCode;
    private final String statusMessage;

    public Response(int statusCode, String statusMessage) {
        this.statusCode = statusCode;
        this.statusMessage = statusMessage;
    }

    public int getStatusCode() {
        return statusCode;
    }

    public String getStatusMessage() {
        return statusMessage;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Response response = (Response) o;

        if (getStatusCode() != response.getStatusCode()) return false;
        return getStatusMessage() != null ? getStatusMessage().equals(response.getStatusMessage()) : response.getStatusMessage() == null;
    }

    @Override
    public int hashCode() {
        int result = getStatusCode();
        result = 31 * result + (getStatusMessage() != null ? getStatusMessage().hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Response{" +
                "statusCode=" + statusCode +
                ", statusMessage='" + statusMessage + '\'' +
                '}';
    }
}


이제 우리는 이 클래스를 우리의 라이브러리와 함께 사용할 수 있습니다:

    public static void main(String[] args) {

        var json = """
                {
                "statusCode" : 404,
                "statusMessage" : "Not Found"
                }
                """;

        var gson = new Gson();

        var message = gson.fromJson(json, Response.class);

    }


Response 클래스는 IDE로 쉽게 생성할 수 있지만 읽는 동안 문제가 될 수 있습니다. 이 클래스가 단순히 데이터를 저장하기 위해 만들어졌다는 것을 알기 위해 40줄 이상을 읽을 필요는 없습니다.

Record를 사용하여 Response 클래스의 모든 코드를 대체할 수 있습니다.

public record Response(int statusCode, String statusMessage) {

}


레코드는 각 상태 구성 요소에 대한 상태 설명, 비공개 최종 필드 및 getter 메서드와 서명이 일치하는 생성자를 자동으로 생성합니다.

예, 필드는 최종적이며 레코드는 다른 클래스를 확장할 수 없으며 레코드 자체는 최종적입니다. 레코드가 변경 가능한 JavaBean 클래스를 대체하기 위해 존재하지 않는다는 것을 깨닫기 시작해야 합니다.

레코드는 또한 equals(), hashCode() 및 toString() 메서드의 구현을 생성합니다. 그러나 원하는 경우 이러한 메서드를 자유롭게 재정의할 수 있습니다.

레코드는 일반 데이터를 모델링해야 하는 상황에서 유용합니다.

일반 클래스의 경우와 마찬가지로 메소드에서 레코드를 생성할 수 있습니다. 특정 방법으로 레코드를 사용하려는 경우에만 의미가 있습니다.

    public static void main(String[] args) {
        record Response(int statusCode, String statusMessage) {

        }

        var json = """
                {
                "statusCode" : 404,
                "statusMessage" : "Not Found"
                }
                """;

        var gson = new Gson();

        var message = gson.fromJson(json, Response.class);

    }


상태 코드가 200인 경우 생성자에서 일부 값을 설정하려고 한다고 가정해 보겠습니다. 일반적인 표준 생성자로 작업할 수 있는 옵션이 있습니다.

public record Response(int statusCode, String statusMessage) {
    public Response(int statusCode, String statusMessage) {
        this.statusCode = statusCode;
        this.statusMessage = statusMessage;

        if(statusCode==200){
            //extra code here
        }
    }
}


여기서 문제는 상태 설명에서 이미 파생된 코드를 반복해야 한다는 것입니다. 이것을 피하기 위해 우리는 생성자의 압축 버전을 사용할 수 있습니다:

public record Response(int statusCode, String statusMessage) {
    public Response {
        if (statusCode == 200) {
            //extra code here
        }
    }
}


컴팩트 버전을 사용하면 추가 코드를 읽는 데 집중할 수 있으며 Records에서 이미 생성한 상용구에 주의가 분산되지 않습니다.

요약



레코드는 Java에 제공되는 많은 멋진 기능 중 하나이며 6개월 릴리스 주기를 통해 이러한 기능에 더 빨리 액세스할 수 있습니다.

새로운 프로그래밍 언어는 새롭고 빛나는 묘기를 시도하고 부상을 입고 빠르게 치유할 수 있는 젊은 스포츠맨과 같은 반면, Java와 같은 언어는 부상을 피하고 어떤 움직임도 손상되지 않도록 해야 하는 보다 숙련된 운동 선수와 같습니다.

따라서 Java에서 보고 싶은 많은 기능이 있지만 이전 버전과의 호환성과 설계 실수 방지의 우선 순위는 추가되는 기능과 추가 시기에 영향을 미칩니다.

레코드 😉의 경우 JDK 14는 LTS 릴리스가 아니며 레코드는 JDK 14의 미리보기 기능입니다.

레코드는 다양한 상황에서 사용할 수 있습니다. 이제 막 표면을 긁었습니다. 아래 기사를 살펴보는 것이 좋습니다.

"Java 14 Feature Spotlight: Records" by Brian Goetz

JEP 359: Records (Preview)

좋은 웹페이지 즐겨찾기