- 불변 객체, lombok @Value 와 Java Record2023년 05월 07일
- starryeye
- 작성자
- 2023.05.07.:30
lombok 의 @Value 를 이용한 불변객체 만들기와
Java 14 ~ 16 부터 도입된 record 타입을 활용한 불변객체 만들기를 알아보자..
lombok @Value
롬복은 자바 개발을 단순화하고 가독성을 높이기 위한 라이브러리이다.
(annotation 방식으로 boilerplate code 를 줄여준다.)
예를 들면 어떤 클래스에 @Getter 어노테이션을 적용하면
빌드 후 ".class 파일"을 까보면 해당 클래스의 모든 필드에 대한 getXXX 메서드가 만들어져 있다.
그러면 @Value는 개발자 대신 어떤 것을 해줄까..
1. 모든 필드를 private final 로 만들어 준다.
-> 이로써 필드의 값을 변경할 수 없게 되어 불변성이 보장된다.
2. 모든 인자를 받는 생성자를 만들어준다.
-> 기본생성자는 만들어지지 않는다.
3. 모든 필드에 대한 Getter 메서드를 만들어준다.
-> 메서드 명은 getXXX 이다.
4. equals(), hashCode() 메서드를 만들어준다.
5. toString() 메서드를 만들어준다.
예제 코드
import lombok.Value; @Value public class Person { String firstName; String lastName; int age; }
.class
public final class Person { private final String firstName; private final String lastName; private final int age; public Person(final String firstName, final String lastName, final int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } public String getFirstName() { return this.firstName; } public String getLastName() { return this.lastName; } public int getAge() { return this.age; } public boolean equals(final Object o) { if (o == this) { return true; } else if (!(o instanceof Person)) { return false; } else { Person other = (Person)o; if (this.getAge() != other.getAge()) { return false; } else { Object this$firstName = this.getFirstName(); Object other$firstName = other.getFirstName(); if (this$firstName == null) { if (other$firstName != null) { return false; } } else if (!this$firstName.equals(other$firstName)) { return false; } Object this$lastName = this.getLastName(); Object other$lastName = other.getLastName(); if (this$lastName == null) { if (other$lastName != null) { return false; } } else if (!this$lastName.equals(other$lastName)) { return false; } return true; } } } public int hashCode() { int PRIME = true; int result = 1; result = result * 59 + this.getAge(); Object $firstName = this.getFirstName(); result = result * 59 + ($firstName == null ? 43 : $firstName.hashCode()); Object $lastName = this.getLastName(); result = result * 59 + ($lastName == null ? 43 : $lastName.hashCode()); return result; } public String toString() { String var10000 = this.getFirstName(); return "Person(firstName=" + var10000 + ", lastName=" + this.getLastName() + ", age=" + this.getAge() + ")"; } }
Java record
java record 는 롬복 라이브러리에 의존하지 않아도 되며..
java 에서 자체적으로 제공되는 불변 객체 타입이다.
java 컴파일러가 아래를 수행한다.
1. 모든 필드는 private final 으로 된다.
-> 불변성 보장
2. 모든 인자를 받는 생성자를 만들어 준다. (canonical contructor, 표준 생성자..)
3. 모든 필드에 대한 getter 메서드를 만들어 준다. (메서드 명은 필드명이다.)
4. equals(), hashCode() 메서드를 만들어 준다.
5. toString() 메서드를 만들어 준다.
6. 기본 생성자 없음 (모든 필드가 final 이므로..)
-> 일반 클래스에서는 기본 생성자가 no argument contructor 였지만..
-> record 에서는 기본 생성자가 all argument contructor 로 생각해야한다.
7. final 변수 이므로 setter 메서드 없음
8. final 클래스 (상속해줄 수 없음, 추상 클래스 아님)
9. 다른 클래스를 상속 불가 (인터페이스 구현은 가능)
참고
생성자와 메서드를 재정의 할 수 있다.
-> 다음 포스팅에서 계속
참고
https://www.baeldung.com/java-record-keyword
예시 코드
public record User( String firstName, String lastName, int age ) { }
결론..
@Value, record 모두 불변 객체를 생성하는데 사용된다.
@Value 는 롬복의 다른 어노테이션과 조합하여 추가 기능을 구현할 수 있다.
(ex. @Builder)
record 는 Java 에서 제공되며, 롬복 라이브러리 의존성에서 자유롭다.
롬복 라이브러리와 호환성이 없다.
'Java' 카테고리의 다른 글
Java 9, 10 주요 변경점 (0) 2023.05.19 불변 객체 validation (1) 2023.05.07 [Java 정리] ThreadLocal (0) 2022.10.19 [Java 정리] Thread 6 (0) 2022.08.22 [Java 정리] Thread 5 (0) 2022.08.22 다음글이전글이전 글이 없습니다.댓글