티스토리 뷰

JVM/Spring

[Java] record 이해해보기

글을 쓰는 개발자 2022. 10. 6. 15:52
반응형

쓰는 방식

public record MyRecordVo(
        Long id,
        String name,
        String phone
) {
    public String region() {
        return Arrays.stream(phone.split("-")).findFirst().orElseThrow(RuntimeException::new);
    }
}

 

  1. record로 설정한다.
  2. ( ) 괄호 안에 원하는 타입과 필드 이름을 설정한다.
  3. 추가적인 메소드는 {} 안에 작성하면 된다. (위의 메소드는 억지로 작성한 것이니 그냥 넘어가주셔도 됩니다 ㅎㅎ)

 

특성

https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html

https://docs.oracle.com/javase/specs/jls/se16/html/jls-8.html#jls-8.10

  • 기본적으로 정의된 타입과 이름에 따라 public 접근제어자와 return type 그리고 method name이 정해진다.
  • 해당 값들은 immutable 하다 ( 즉 Vo 에 쓰기 적절하다)
  • 암묵적으로 final 제어자가 붙게 된다.
  • 동일한 키워드가 레코드 선언의 수정자로 두 번 이상 나타나거나 레코드 선언에 public, protected 및 private 중 하나 이상의 액세스 수정자가 있는 경우 컴파일 시간 오류
  • equals, hashCode, toString 들은 멤버 변수에 맞게 정의된다.
  • 생성자를 정확히 하나만 지정하는 이유는 해당 변수 값들을 validate 하기 위함이다.

 

public void record(MyRecordVo vo) {
    log.info("record id = {}, name = {}, phone = {}", vo.id(), vo.name(), vo.phone());
    Class<?> superclass = vo.getClass().getSuperclass();
    log.info("classes = {}", superclass);
}

record로 정의한 java의 경우 상위 클래스가 뭔지 알아보기 위해 찍어봤다.

 

18:20:51.011 [Test worker] INFO com.playground.springplayground.java.RecordService - classes = class java.lang.Record

보통 클래스들은 extends를 하지 않는 이상 superClass는 Object 이다.

근데 record로 설정한 경우  java.lang.Record 이다

 

Record

public abstract class Record {
    
    protected Record() {}

    
    @Override
    public abstract boolean equals(Object obj);

    
    @Override
    public abstract int hashCode();

    
    @Override
    public abstract String toString();
}

해당 추상 클래스를 상속하여 구현하게 되는 것이다.

 

그렇기에 record로 설정한 경우 extends 를 사용할 수 없다는 것을 유념해야 한다.

사용처

  • 위에서 말한 것 처럼 Value Object로 사용할 경우 이용하기에 적절하다. 그 이유는 VO 의 경우 값이 바뀌면 안되고, 수정해서는 안되는 것이 기본이므로 왠만한 Vo 의 경우 record를 사용하기에 적절하다.
반응형

'JVM > Spring' 카테고리의 다른 글

[Spring] @EventListener  (0) 2022.10.06
[Spring] @Async 비동기로 처리하는 방법  (0) 2022.10.01
[Spring] @Scheduled, @EnableScheduling  (0) 2022.10.01
[Spring] Scope (Prototype & Singleton)  (2) 2022.09.13
[Hikari CP] 光 살펴보기 - 4  (0) 2022.04.29
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함