Java/Java 문법

[JAVA] record 불변 객체 타입 (feat Lombok @Value)

민돌v 2022. 6. 2. 00:36

java 14에서 preview로 등장했고, java 16때 정식 기능으로 나온 기능입니다.

새로운 java Type 이며, 자바에서 불변객체를 만들기위해, 필요한 코드의 중복을 줄여주는 기능을 합니다.

(👉 Lombok과 매우 비슷 := @Value)


기능

  • 모든 프로퍼티를 포함한 생성자 제공
  • 모든 프로퍼티에 private final 적용
  • 모든 프로퍼티의 getter 메소드 생성
  • toString, equals, hashCode 메소드 생성
  • 프로퍼티들에게 annotation을 붙일 수 있도록 허용

 


불변 객체 vs record 타입 vs @Value

 

 

✨[Record 타입을 사용하지 않은, 기존의 클래스]


불변 객체를 만들기 위해,  매개변수에 private final 을 붙힘

//Record를 사용하지 않은 클래스
public class Car {
	private final String name;
    private final int power;
    
    public Car(String name, int power) {
    	this.name = name;
        this.power = power;
    }
    
    public String getName() {
    	return this.name;
    }
    
    //setter는 Record에서 제공하지 않음
    public void setName(String name) {
    	this.name = name;
    }
    
    public int getPower() {
    	return this.power;
    }
    
    //setter는 Record에서 제공하지 않음
    public void setPower(int power) {
    	this.power = power;
    }
}

 

 

 

 

✨[Record 타입으로 정의한 클래스]


  1. 매개변수에 따른, 멤버변수 불변 자동생성
  2. 파라미터 별 생서자 자동 새엇ㅇ
  3. getter 제공(멤버변수 이름으로 호출)
  4. setter는 제공하지 않음 ➡️ 블변객체에는 Setter 사용 x
  5. toString제공
  6. euqals() 제공
  7. 모든 필드가 일치할 때 동일한 값을 반환하는 hashCode 메서드

 

//record 사용
public record Car(String name, int power) {}

 

 

✨[Lombok @Value]


  • @Data 어노테이션 제공 기능 : @Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode
  • @Value : 불변객체로 만들어주는, 롬복 어노테이션이다.
  • @Data 와 @Value 차이점
    1. @Value는 모든 필드를 private + final (불변)으로 만든다.
    2. @Value는 불변객체를 만드는 것이기 때문에 Setter를 사용할 수 없다.

 

-> Lombok의 @Value기능이 먼저 나왔고, 후에 자바에서 Record가 나왔다. 따라서 기능은 거의 비슷하고, 

-> Record는 자바 타입이기 때문에, 롬복처럼 따로 dependency를 해주지 않아도 사용할 수 있다. (jdk14 이후부터)

//Lombok을 사용한 클래스
@Value
public class Car {
    String name;
    int power;
}

 

 

 

 

 

*참고

https://marrrang.tistory.com/71

https://www.baeldung.com/java-record-keyword