본문 바로가기

Java/공부공부

[JAVA] record (java 14 이상)

 

* record 

불변(immutable) 데이터를 간결하게 표현하기 위한 클래스 타입.
생성자, getter, equals(), hashCode(), toString() 등이 자동 생성.
(Java 14에 도입, Java 16부터 정식 기능으로 채택)

 

아래처럼 선언한다면,

public record CommandResult(String status, String msg) {}

다음과 같은 클래스가 자동 생성되는 것과 동일하다.

import java.util.Objects;

public final class Result {

// final필드
    private final String status;
    private final String msg;

// 생성자
    public Result(String status, String msg) {
        this.status = status;
        this.msg = msg;
    }

// getter 
    public String status() {
        return status;
    }
// getter 
    public String msg() {
        return msg;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Result)) return false;
        Result other = (Result) o;
        return Objects.equals(status, other.status) &&
               Objects.equals(msg, other.msg);
    }

    @Override
    public int hashCode() {
        return Objects.hash(status, msg);
    }

    @Override
    public String toString() {
        return "Result[status=" + status + ", msg=" + msg + "]";
    }
}

 

* 자동 생성 기능

  • private final 필드들
  • 모든 필드를 받는 생성자
  • getter 역할의 메서드 (이름이 필드명과 동일: status(), msg())
  • equals(), hashCode(), toString() 지원.

 

 


 

아래처럼 활용해봄.
공통메소드의 결과값을 record 클래스로 반환.

// record 클래스 선언
public record CommandResult(String status, String msg) {}

// 공통메서드
public CommandResult commonMethod(String param1 , boolean param2) {


	// record로 결과값 반환
	return new CommandResult(status, msg);
}

 

다른 여러 메서드에서 공통메서드를 사용하고
결과값을 아래처럼 record 클래스로 받아서 활용.

CommandResult result = commonMethod(test , true);
log.info("result: {}{} ", result.status(), result.msg());

String status = result.status();
String msg = result.msg();

record는 getter 메서드를 지워하기 때문에
별도 캐스팅 없이 미리 선언된 String타입으로 바로 활용 가능.

 

자바스크립트의 구조분해할당이나 파이썬의 언패킹같은 느낌으로
값을 쉽게 꺼내쓰기 좋은 자바 문법인듯!!