본문 바로가기
Programming Language/Java

[Lombok] @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor 생성자 생성 애노테이션

by 델버 2022. 12. 25.

Lombok 생성자를 만들어주는 애노테이션

  • Lombok 기능 중에 생성자를 만들어주는 애노테이션이 있다. 파라미터가 있는지 없는지를 기준으로 기능이 3가지로 만들어진다.
  1. @NoArgsConstructor: 파라미터 없는 생성자 생성
  2. @RequiredArgsConstructor: 파라미터 있는 생성자 생성(final or @NonNull인 필드)
  3. @AllArgsConstructor: 파라미터 있는 생성자(모든 필드)

@NoArgsConstructor

  • 파라미터가 없는 생성자를 생성해준다.
    @NoArgsConstructor
    public class Member {
        private String name;
        private int age;
        private String mbti;
    
    	/* @NoArgsConstructor가 자동생성 
    		public void Member() {}
    	*/
    }
    Member member = new Member();
  • final 필드가 있으면 초기화하지 못해 컴파일 오류를 낸다.

  • @NonNull 필드는 널체크하지 않으므로 주의해서 사용해야한다.

  • @NoArgsConstructor(force = true) : 필드의 기본값을 0 / false / null로 초기화한다.
    @Slf4j
    public class LombokTest {
    
        @NoArgsConstructor(force = true)
        @Getter
        public class Member {
            private final String name;
            private int age;
            private String mbti;
        }
    
        @Test
        public void test() throws Exception {
            Member member = new Member();
            String name = member.getName();
            log.info("name={}", name);
        }
    }

@RequiredArgsConstructor

  • final 또는 @NonNull이 붙은 필드를 파라미터로 가진 생성자를 생성한다.
    @NoArgsConstructor
    public class Member {
        private final String name;
    		@NonNull
        private int age;
        private String mbti;
    
    /* @RequiredArgsConstructor가 자동생성 
        public void Member(String name, @NonNull int age) {
            this.name = name;
            this.age = age;
        }
    */
    }
    Member member = new Member("memberA", 24);
  • 스프링 DI에서 생성자 주입할 때 생성자를 생략하여 코드를 효율적으로 작성할 수 있다.
    @Service
    public class MemberService {
    	private final MemberRepository memberRepository;
    	private final OrderRepository orderRepository;
    
    	/* @RequiredArgsConstructor가 자동생성  
    	public void MemberService( MemberRepository memberRepository, 
    															OrderRepository orderRepository) {
    		this.memberRepository = memberRepository;
    		this.orderRepository = orderRepository;
    	}
    	*/
    
    }
  • @NonNull 필드는 파라미터 값으로 null이 들어오면 NullPointerException이 발생한다.
    @Slf4j
    public class LombokTest {
    
        @RequiredArgsConstructor
        @Getter
        public class Member {
            private final String name;
            @NonNull
            private int age;
            @NonNull
            private String mbti;
        }
    
        @Test
        public void test() throws Exception {
            assertThatThrownBy(() -> new Member("AA", 12, null))
                    .isInstanceOf(NullPointerException.class);
        }
    }

@AllArgsConstructor

  • 모든 필드 파라미터를 가진 생성자를 생성한다.
    @AllArgsConstructor
    public class Member {
        private final String name;
    		@NonNull
        private int age;
        private String mbti;
    
    /* @AllArgsConstructor가 자동생성 
        public void Member(String name, @NonNull int age, String mbti) {
            this.name = name;
            this.age = age;
            this.mbti = mbti;
        }
    */
    }
    Member member = new Member("memberA", 24, "ENFP");

정적 팩토리 매서드 static factory method @RequiredArgsConstructor(staticName= ”of”)

  • staticName을 사용해서 정적 팩토리 매서드를 추가할 수 있다. private 생성자를 생성하여 이것을 감싸는 정적 팩토리 매서드를 생성한다.
@RequiredArgsConstructor(staticName= ”of”)
public class Member {
    private final String name;
		@NonNull
    private int age;
    private String mbti;

    private Member(String name, @NonNull int age) {
        if (age == null) {
            throw new NullPointerException("age is null");	
        } else {
            this.name = name;
            this.age = age;
        }
    }

    public static Member of(String name, @NonNull int age) {
        return new Member(name,age);
    }
}

필드 순서 변경

  • 필드 순서가 변경되면 파라미터가 생성되는 순서도 바뀌기 때문에 주의해야 한다.

AccessLevel @NoArgsConstructor(access = AccessLevel.PRIVATE)

  • access를 사용해 생성되는 생성자의 접근 레벨을 지정할 수 있다.


매뉴얼

댓글