@NoArgsConstructor 와 @AllArgsConstructor 는 Lombok 라이브러리에서 제공하는 어노테이션으로,
개발자가 직접 생성자를 일일이 만들지 않아도 자동으로 생성해주는 기능입니다.
1. @NoArgsConstructor
뜻 : 매개변수가 없는 기본 생성자를 자동으로 만들어 줌
즉, new 클래스명() 형태로 객체를 만들 수 있게 해줌
예제 코드
import lombok.NoArgsConstructor;
@NoArgsConstructor // 기본 생성자 자동 생성
public class User {
private String name;
private int age;
}
// 위 어노테이션이 붙으면 컴파일 시 아래 코드가 자동으로 추가됨
// public User() {}
사용 예시
public class Main {
public static void main(String[] args) {
User user = new User(); // 기본 생성자 호출 가능
// user.setName("철수");
// user.setAge(20);
}
}
2. @AllArgsConstructor
뜻 : 모든 필드를 매개 변수로 받는 생성자를 자동으로 만들어줌
즉, 객체를 만들 때 값을 한 번에 넣을 수 있음NoArgsConstructor 와 @AllArgsConstructor 는 Lombok 라이브러리에서 제공하는 어노테이션으로,
개발자가 직접 생성자를 일일이 만들지 않아도 자동으로 생성해주는 기능입니다.
1. @NoArgsConstructor
뜻 : 매개변수가 없는 기본 생성자를 자동으로 만들어 줌
즉, new 클래스명() 형태로 객체를 만들 수 있게 해줌
예제 코드
import lombok.NoArgsConstructor;
@NoArgsConstructor // 기본 생성자 자동 생성
public class User {
private String name;
private int age;
}
// 위 어노테이션이 붙으면 컴파일 시 아래 코드가 자동으로 추가됨
// public User() {}
사용 예시
public class Main {
public static void main(String[] args) {
User user = new User(); // 기본 생성자 호출 가능
// user.setName("철수");
// user.setAge(20);
}
}
2. @AllArgsConstructor
뜻 : 모든 필드를 매개 변수로 받는 생성자를 자동으로 만들어줌
즉, 객체를 만들 때 값을 한 번에 넣을 수 있음
예제 코드
import lombok.AllArgsConstructor;
@AllArgsConstuctor // 모든 필드를 받는 생성자 자동 생성
public class User {
private String name'
private int age;
}
// 위 어노테이션이 붙으면 컴파일 시 아래 코드가 자동으로 추가됨
// public User(String name, int age) {
// this.name = name;
// this.age = age;
사용 예시
public calss Main
public static void Main {
User user = new User("철수", 20); // 모든 필드 값을 넣어 생성 가능
}
}
정리
@NoArgsContructor
아무 것도 안 받는 생성자 자동 생성
@AllArgsConstructor
모든 필드를 받는 생성자 자동 생성
실무에서는 두 개를 함께 사용하는 경우가 많다
예를 들어 JPA(Entity 클래스)는 기본 생성자가 꼭 필요해서, @NoArgsconstructor 를,
DTO나 VO 같은 경우는 한 번에 값을 넣기 위해 @AllArgsConstructor 를 씁니다.
3. @RequiredArgsConstructor
뜻 : final 이거나 @NonNull 이 붙은 필드만을 매개변수로 받는 생성자를 자동 생성 해줌
즉, 꼭 필요한 필드들만 생성자 파라미터로 받게 만들어줌
import lombok.RequiredArgsConstructor;
import lombok.NonNull;
@RequiredArgsConstructor
public class User {
private final String name; // final -> 반드시 생성 시 필요
@NonNull
private String email; // @NonNull -> 반드시 생성 시 필요
private int age; // 선택 사항
}
// 위 어노테이션이 붙으면 자동으로 이런 생성자가 추가됨
// public User(String name, String email) {
// this.name = name;
// this.email = email;
// }
사용 예시
public class Main {
public static void main(String[] args) {
User user = new User("철수", "chulsu@email.com");
// age 는 생성자에 없음 -> 필요하면 setter로 나중에 넣을 수 있음
}
}
정리 (세 가지 차이점)
@NoArgsConstructor -> 아무것도 안 받는 생성자
-> new User()
@AllArgsConstructor -> 모든 필드를 받는 생성자
-> new User("철수", 20, "email@...")
@RequiredArgsConstructor -> final 또는 @NonNull 필드만 받는 생성자
-> new User("철수", "email.@...")
실무에서는 보통 다음과 같이 사용합니다.
Entity(JPA) ->
@NoArgsConstructor (기본 생성자 필수) + @RequiredArgsConstructor (필수값만 받도록)
DTO ->
@AllArgsConstructor (필드 전체를 한 번에 세팅)
예제 코드 : JPA 엔티티
java
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.*;
@Entity
@Getter
@NoArgsConstructor // JPA에서 프록시 생성을 위해 반드시 필요
@AllArgsConstructor // 모든 필드를 받는 생성자
@RequiredArgsConstructor // final, @NonNull 필드만 받는 생성자
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // DB에서 자동 생성 -> 생성자에서 제외하는 경우 많음
@NonNull
private String username; // 반드시 필요
@NonNull
private String email; // 반드시 필요
private int age; // 선택 사항
}
생성자 사용 방법
public class Main {
public static void main(String[] args) {
// 1. @NoArgsConstructor -> 기본 생성자
User user1 = new User();
// user1.setUsername("철수"); // setter 나 다른 방식으로 값 설정
// user1.setEmail("test@test.com");
// 2. @AllArgsConstructor -> 모든 필드 받는 생성자
User user2 = new User(1L, "영희", "younghee@test.com", 25);
// 3. @RequiredArgsConstructor -> 필수값(final, @NonNull)만 받는 생성자
User user3 = new User("민수", "minsu@Test.com);
}
}
정리
@NoArgsConstructor
JPA에서 필수 (프록시, 리플렉션 때문에 기본 생성자 필요)
@AllArgsConstructor
DTO 변환 같은 경우에 유용 (모든 값 한 번에 세팅)
@RequiredArgsConstructor
필수 필드만 강제할 때 유용
'알게된것,복습한것,헷갈렸던것 정리' 카테고리의 다른 글
| LIKE와 =(등호) 차이 (0) | 2025.10.03 |
|---|---|
| 오버로딩(Overloading) 이란? (0) | 2025.09.27 |
| 파라미터와 기본생성자 (4) | 2025.08.01 |
| 테스트코드, 단위테스트 (2) | 2025.07.17 |
| JPA 정의와 설정 (1) | 2025.07.15 |