• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 불변 객체, lombok @Value 와 Java Record
        2023년 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://openjdk.org/jeps/395

        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
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바