@NoArgsConstructor(access = AccessLevel.PROTECTED) 의미

동철·2023년 8월 16일
0

무의식적으로 계속 쓰던 코드 중 하나는, 롬복에서 지원하는 NoArgsConstructor 어노테이션이였다. 그 중, @NoArgsConstructor(access = AccessLevel.PROTECTED) 는 어떤 의미를 말해주는 코드인지를 간략하게 내 글로 적고 넘어가 보려 한다.

  • lombok 라이브러리가 필요합니다!

기본적으로 자바는 클래스 생성 시, 기본 생성자를 통해 객체를 만들 수 있게 된다.

public class OrderMatching {

    private String title;
    
}

OrderMatching orderMatching = new OrderMatching(); // ok

다만, 자바의 이러한 기본적인 부분이 객체를 생성해 개발할때, 오해를 불러일으킬 수 있는 코드가 될 수 있다.

'난 title 파라미터를 받는 생성자만 사용해서 객체를 생성할꺼야' 라고 했을때를 가정해보자.

public class OrderMatching {

    private String title;
	
    public OrderMatching(String title) {
        this.title = title;
    }
}

OrderMatching orderMatching1 = new OrderMatching("테스트1"); // ok
OrderMatching orderMatching2 = new OrderMatching(); // 의도하지 않음

우리가 의도한 객체 생성자는 orderMatching1 이였지만, orderMatching2 방식으로 할 수 있는걸 볼 수 있다. orderMatching2 방식은 쓰지 않으니 명시적으로 막아두는게 좋을 수 있다.

public class OrderMatching {

    private String title;
	
    protected OrderMatching() { }
    
    public OrderMatching(String title) {
        this.title = title;
    }
}

OrderMatching orderMatching1 = new OrderMatching("테스트1"); // ok
OrderMatching orderMatching2 = new OrderMatching(); // 컴파일 에러

이걸 롬복 어노테이션을 통해 의미를 상단에 명시해줄 수 있다.

@NoArgsConstructor(access = AccessLevel.PROTECTED) // 추가
public class OrderMatching {

    private String title;
	
    // protected OrderMatching() { } // 삭제
    
    public OrderMatching(String title) {
        this.title = title;
    }
}

OrderMatching orderMatching1 = new OrderMatching("테스트1"); // ok
OrderMatching orderMatching2 = new OrderMatching(); // 컴파일 에러

느낀점

코드라는건 말하는 것, 글을 쓰는 것과 같다고 생각한다. 그렇기 때문에 무의식적으로 코드를 써내려가기 보다, 그 의미를 곱씹으면서 써 내려가는것이 좋겠다. 다른 사람들이 봤을때, 이 코드의 의도를 알 수 있게끔.

이상한점이 있다면 꼭 알려주세요!

profile
세상에 기여하는 사람이 되고 싶습니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

글 잘 봤습니다.

답글 달기