Java 16: Record Class

Letsdev·2023년 5월 14일
5

record

자바 Record Class

자바의 record 클래스는 불변 객체를 만들기 위한 특수한 형태의 클래스다.
쉽게 말해 모든 필드가 final이 된다.

DTO 같은 데에 쓰면 되고, 새로 나온 문법답게 쉽다.

자바 16에서 프로덕션으로 릴리스됐고, 자바 14부터 Preview로 제공됐었다.

호환

스프링 부트 3에서 나름대로 목적에 부합하는 경우에 쓰면 전부 호환되는 것 같다.
어지간한 여러 상황에서 써 보는 중인데, 범용적인 것들에선 다 쓸 수 있는 것 같다.

중요한 건 record 객체는 모든 멤버가 불변이니까, 데이터 변경을 열어 두어야 하는 엔티티 등에는 삼간다. 어차피 JPA Entity로는 쓸 수도 없다.

Syntax Base 1

선언

저기 소괄호에 속성을 나열하기만 하면 된다.
저렇게만 적으면 생성자도 알아서 생겨 있다.

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

우리가 DTO를 생각할 때 필요하다 싶은 것들은 얼추 알아서 생긴다.

  • All Arguments Contructor(모든 필드를 입력하는 생성자)
  • getter도 변수명과 동일한 메서드 이름으로 생성된다.
  • Serializable도 알아서 구현받아 놓는다.
  • toString, Equals/HashCode, ...
  • 여태 강조했듯 모든 field에는 final이 알아서 붙는다.

불필요한 구현부를 아주 쏙 빼 놨다.
'습관적으로 작성이 필요한 것들'은 거의 알아서 되어 있다.

사용

기본적으로 저렇게 한 줄만 써도 이렇게 사용할 수 있다.

Person person = new Person("홍길동", 12345);
System.out.println(person); 		// toString도 자동으로 생겨 있음.
System.out.println(person.name()); 	// getter
System.out.println(person.age()); 	// getter

Syntax Base 2

입력값을 검증할 수 있다.
이때 null 처리에 편하려면, int 같은 원시 타입보다는 Integer 같은 래퍼 클래스를 더 권장한다.

public record Person(String name, Integer age) {
	
    // 여기서 생성자 파라미터를 검증하거나, 변환할 수 있다.
	public Person { // <- 소괄호 안 쓰는 거 잘 보쇼.
    	// this, this.name, this.age는 사용하지 마쇼.
    	if (name == null) name = "noname";
        if (age == null) age = 0;
        name = name.trim();
    }
    
}

이러면 어디선가 null을 넣으면 기본값을 줄 수 있다.

new Person(null, null); // Person{name=noname, age=0}

Next >
Java 16 Record 사용처: DTO 클래스에는 어떻게 쓸까
Java 16 Record 사용처: 속성 파일을 쉽게 객체화한 Configuration Properties - @Value보다 ...

profile
아 성장판 쑤셔 (블로그 이전) https://letsdev.hashnode.dev

0개의 댓글