언어/Java

레코드(Record)?

맨날체하는사람 2023. 6. 19. 15:48

*참조*

https://velog.io/@conatuseus/Java-Immutable-Object%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4

https://scshim.tistory.com/372

 

레코드란 뭘까?

프로젝트를 진행하던중 record라는 클래스를 사용하는걸 봤다.

매우 생소했고 뭐지? 음반같은건가? 하는 생각이 더 들었다.

당연히 그건 아니였고 레코드는 jdk14에서 추가된 클래스였다..

레코드

 불변(immutable) 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스라고 한다.

불변객체

2023.06.19 - [분류 전체보기] - 불변객체?

 

불변객체?

불변 객체란 뭘까? 말만 들으면 변하지않는 객체? 라는 생각이 든다. 먼저 객체는 언제 변할까? 더보기 인스턴스 변수 직접 수정: 객체의 인스턴스 변수가 변경 가능한 타입인 경우, 해당 변수에

notenoughtime.tistory.com

 

- 기존의 불변 객체

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 재정의

학원에서도 이렇게 배웠었다.

toString도 쓰고 getter,setter도 쓰고 이걸 써주는 lombok같은걸 써서 작업을 줄이는 것도 해봤다.

 

그렇지만 레코드를 사용하면?

public record Person(String name, int age) {
}

위와 같은 생성자들을 써줄 필요 없이 훨씬 간결한 방식으로 동일한 불변 데이터 객체 정의할 수 있다.

컴파일러는 헤더(타입과 이름)를 통해 내부 필드를 추론한다

     - 생성자를 작성하지 않아도 되고 toString, equals, hashCode 메소드에 대한 구현을 자동으로 제공

import lombok.Builder;

    public record BoardCommandDto() {
        public record BoardCreateRequestDto(
                String title,
                String content
        ){}
        @Builder
        public record BoardCreateResponseDto(
                boolean success
        ){}
}

이와 같이 프로젝트에서 작성할 수 있었다.

 

ㆍ레코드의 제한

     - 레코드는 암묵적으로 final 클래스(상속불가)이고, abstract 선언 불가

     - 다른 클래스를 상속(extends) 받을 수 없음, 인터페이스 구현(implements)은 가능

이라고 한다~