인프런 커뮤니티 질문&답변

최승혁님의 프로필 이미지
최승혁

작성한 질문수

스프링 핵심 원리 - 기본편

롬복과 최신 트랜드

@RequiredArgsConstructor를 포함한 생성자 2개

해결된 질문

작성

·

243

0

[질문 내용]

@RequiredArgsConstructor //필수값(ex final)으로 생성자를 제공
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy; //final을 붙이면 값이 무조건 필요하다는 뜻

    public OrderServiceImpl() {
        System.out.println("abc");
    }
}

이런식으로 @RequiredArgsConstructor 으로 final을 매개변수로 갖는 생성자와 매개변수가 없는 생성자를 따로 만들면

이런식으로 변수가 초기화 되지 않았다고 오류가 발생하는데

@RequiredArgsConstructor은 생성자가 없을 때만 사용할 수 있는거라서 매개변수 없는 생성자를 만들었기 때문에 @RequiredArgsConstructor` 가 작동을 안 하는건가요?

답변 1

1

안녕하세요. 최승혁님, 공식 서포터즈 코즈위버입니다.

final 로 선언한 변수는 불변으로, 선언과 동시에 초기화가 반드시 이루어져야 합니다.

다만, 클래스의 멤버변수에 final 이 붙은 경우, '선언과 동시에 초기화' 외에 초기화 할 수 있는 방법을 한 가지 더 제공하는데요, 바로 생성자 안에서 초기화 하는 방법입니다. 이 둘 중 하나는 반드시 지켜져야 하지요.

@RequiredArgsConstructor 는 final 인 멤버변수를 매개변수로 받는 생성자를 자동으로 생성합니다. 그런데 개발자가 임의로 매개변수가 없는 생성자를 추가할 경우, final 이 붙은 멤버변수가 초기화하지 않은채로 객체를 생성할 위험이 있습니다. 그래서 자바 컴파일러가 이것을 문법오류로 판단, 방지하고 있습니다.

감사합니다.

최승혁님의 프로필 이미지
최승혁

작성한 질문수

질문하기