💻Today's Schedule
09:00 ~ 10:00 CODEKATA
10:00 ~ 11:00 개인 학습
11:00 ~ 12:00 팀미팅/코드리뷰
12:00 ~ 13:00 점심 식사
13:00 ~ 16:00 개인 학습
16:00 ~ 18:00 베이직 특강 8회차
18:00 ~ 19:00 저녁 식사
19:00 ~ 21:00 개인 학습
✍ Today I Learned
CODEKATA
- 알고리즘
- SQL
Spring 학습 : 객체 생성 제어하기 @NoArgsConstructor와 protected 생성자 사용법
1. @NoArgsConstructor 어노테이션
- @NoArgsConstructor는 롬복(Lombok) 라이브러리에서 제공하는 어노테이션으로, 클래스에 기본 생성자(매개변수가 없는 생성자)를 자동으로 생성해 준다.
기본 생성자란?
- 기본 생성자는 클래스의 필드들을 초기화하는 생성자로, 아무런 매개변수도 받지 않는 생성자다.
- 예를 들어, 다음과 같은 클래스가 있을 때 :
public class MyClass {
private int value;
// 기본 생성자
public MyClass() {
this.value = 0; // 또는 다른 기본 값
}
}
- 위의 코드에서 MyClass는 기본 생성자를 가진다. 이 생성자는 new MyClass()로 객체를 생성할 때 호출된다.
@NoArgsConstructor를 사용한 예시:
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class MyClass {
private int value;
// @NoArgsConstructor에 의해 자동으로 생성된 기본 생성자
// public MyClass() { }
}
- 위 예시에서, @NoArgsConstructor 어노테이션을 사용하면 롬복이 자동으로 기본 생성자를 생성해 준다. 따라서, 별도로 생성자를 작성할 필요가 없다.
2. protected 접근 제어자
- protected는 자바에서 제공하는 접근 제어자 중 하나로, 클래스의 멤버(필드, 메서드, 생성자)에 대한 접근 수준을 결정한다.
- protected의 의미
- 동일 패키지 내의 다른 클래스: protected로 선언된 멤버는 동일 패키지 내의 다른 클래스에서 접근할 수 있다.
- 상속 관계에 있는 하위 클래스: 하위 클래스가 상속받는 경우, 다른 패키지에 있더라도 protected 멤버에 접근할 수 있다.
- 외부 클래스: 동일 패키지에 있지 않거나, 상속 관계에 있지 않은 외부 클래스에서는 protected 멤버에 접근할 수 없다.
- protected 생성자
- protected로 선언된 생성자는 외부에서 직접 객체를 생성할 수 없게 보호하면서, 상속 관계에 있는 하위 클래스에서는 객체를 생성할 수 있게 해준다.
3. @NoArgsConstructor(access = AccessLevel.PROTECTED)
- @NoArgsConstructor(access = AccessLevel.PROTECTED)는 기본 생성자를 생성하되, 그 접근 제어자를 protected로 설정한다.
import lombok.NoArgsConstructor;
import lombok.AccessLevel;
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class MyClass {
private int value;
// 롬복이 생성한 protected 기본 생성자
// protected MyClass() { }
}
- 위 코드에서 @NoArgsConstructor(access = AccessLevel.PROTECTED)는 기본 생성자를 protected 접근 수준으로 생성한다. 이로 인해, 외부에서 직접 new MyClass()로 객체를 생성할 수 없으며, 동일 패키지나 하위 클래스에서만 이 생성자를 통해 객체를 생성할 수 있다.
왜 protected로 기본 생성자를 설정할까?
- JPA 엔티티 클래스: JPA는 엔티티 클래스를 관리하기 위해 기본 생성자가 필요하다. 하지만 이 생성자가 외부에서 호출되지 않도록 보호하고 싶을 때 protected 접근 제어자를 사용한다.
- 상속을 통한 확장 가능성 제공: 상속을 통해 클래스를 확장할 때, 하위 클래스에서만 기본 생성자를 사용할 수 있도록 제한하고 싶을 때 사용한다.
- 객체 생성 제어: 특정 클래스가 외부에서 인스턴스화되는 것을 방지하고 싶을 때 protected 생성자를 사용하여 인스턴스화 방법을 제어할 수 있다. 예를 들어, 팩토리 메서드를 통해서만 객체를 생성하도록 유도할 수 있다.