@NoArgsConstructor
파라미터가 없는 기본(디폴트) 생성자를 생성
@NoArgsConstructor
public class Member {
private String name;
private int age;
// public Member() {
// }
}
항상 초기화가 필요한 final이 붙은 필드가 있으면 다음과 같이 IDE에서 알려주거나 compile error 발생

@AllArgsConstructor
모든 필드 값을 파라미터로 받는 생성자를 생성
@AllArgsConstructor
public class Member {
private String name;
private int age;
// public Member(String name, int age) {
// this.name = name;
// this.age = age;
// }
}
생성자의 Parameter의 순서는 클래스 내부에 선언된 field 순서대로 매칭된다.
@RequiredArgsConstructor
final이나 @NonNull으로 선언된 필드만을 파라미터로 받는 생성자를 생성
@RequiredArgsConstructor
public class Member {
private final String name;
private final int age;
private String address;
// public Member(String name, int age) {
// this.name = name;
// this.age = age;
// }
}
생성자의 Parameter의 순서는 클래스 내부에 선언된 field 순서대로 매칭된다.
staticName
모든 생성자 어노테이션에 사용 가능
다음과 같이 staticName 옵션을 사용하면 Member.of()로 생성자를 호출할 수 있다.
@AllArgsConstructor(staticName = "of")
public class Member {
private String name;
private int count;
private int age;
// public static Member of(String name, int count, int age) {
// return new Member(name, count, age);
// }
}
Member.of("test", 3, 20);
access

• PUBLIC: 기본값이며, 모든 클래스에서 생성자에 접근 가능
• PROTECTED: 같은 패키지의 클래스와 상속받은 클래스에서 생성자에 접근 가능
• PACKAGE: 같은 패키지의 클래스에서 생성자에 접근 가능
• PRIVATE: 해당 클래스 내부에서만 생성자에 접근 가능
NONE과 MODULE 접근 제어자가 있지만, 일반적으로 사용하지 않는다.
force
@NoArgsConstructor 에서만 사용이 가능하다.
@NoArgsConstructor(force = true) 옵션을 주면, 모든 final 필드는 0 / false / null 로 초기화된다.
final이 아닌 @NonNull에 경우force = true 옵션을 주어도 생성자에 들어가지 않아 개발자가 할당 해주어야 한다.
주의 사항
@AllArgsConstructor, @RequiredArgsConstructor 를 사용할 때 버그 발생에 주의해야 한다.
다음과 같은 객체가 있을 때, @AllArgsConstructor는 name, count, age 순으로 생성자 파라미터를 생성한다.
@AllArgsConstructor
public class Member {
private String name;
private int count;
private int age;
}
Member member = new Member("name",3, 20);
그런데 count와 age 순서를 바꾸게 된다면 어떻게 될까?
@AllArgsConstructor
public class Member {
private String name;
private int age;
private int count;
}
IDE와 lombok도 변화를 알라차리지 못하며 동일한 type 이라 더욱 버그를 잡기 어렵다.
즉, 필드의 순서가 변경되는 경우 치명적일 수 있다.
그래서 @AllArgsConstructor, @RequiredArgsConstructor 의 사용를 금지하는 것이 좋다는 주장도 있다.
아니면 다음과 같이 @Builder를 사용하는 것도 하나의 방법이다.
public class Member {
private String name;
private int count;
private int age;
@Builder
public Member(String name, int age, int count) {
this.name = name;
this.age = age;
this.count = count;
}
}
Member member = Member.builder().name("name").age(20).count(3).build();
참고
'Spring' 카테고리의 다른 글
[JPA] @Column (0) | 2024.12.02 |
---|---|
[Spring] @PathVariable (0) | 2024.09.23 |
[Spring] @RequestMapping (0) | 2024.09.18 |
[Spring] @Controller, @RestController (0) | 2024.09.16 |
[Spring] @Transactional 안 되는 경우 (0) | 2024.09.13 |