// Lombok 사용 전
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// Lombok 사용 후
@Getter @Setter
public class User {
private String name;
private int age;
}
@NoArgsConstructor // 매개변수가 없는 기본 생성자
@AllArgsConstructor // 모든 필드를 매개변수로 받는 생성자
@RequiredArgsConstructor // final 또는 @NonNull 필드만을 매개변수로 받는 생성자
public class User {
private final String name; // final 필드는 RequiredArgsConstructor에 포함
private int age;
}
public class User {
private final String name;
private int age;
// @NoArgsConstructor
// final 필드가 있어서 기본 생성자를 만들 수 없음
// 만약 name이 final이 아니었다면 아래처럼 생성 가능
// public User() {}
// @RequiredArgsConstructor
// final 또는 @NonNull 필드만을 매개변수로 받는 생성자
public User(String name) {
this.name = name;
}
// @AllArgsConstructor
// 모든 필드를 매개변수로 받는 생성자
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
@AllArgsConstructor
모든 필드를 매개변수로 받는 생성자를 자동으로 생성한다.
@AllArgsConstructor
public class User {
private String name;
private int age;
private String email;
}
// 사용할 때
User user = new User("홍길동", 25, "hong@gmail.com");
@NoArgsConstructor
매개변수가 없는 기본 생성자를 생성한다.
@NoArgsConstructor
public class User {
private String name;
private int age;
private String email;
}
// 사용할 때
User user = new User();
@RequiredArgsConstructor
final이나 @NonNull로 표시된 필드만을 매개변수로 받는 생성자를 생성한다.
@RequiredArgsConstructor
public class User {
private final String name; // 생성자에 포함됨
private int age; // 생성자에 포함되지 않음
@NonNull
private String email; // 생성자에 포함됨
}
// 사용할 때
User user = new User("홍길동", "hong@gmail.com");
빌더 패턴 구현
@Builder
public class User {
private String name;
private int age;
private String email;
}
// 사용할 때
User user = User.builder()
.name("홍길동")
.age(25)
.email("hong@gmail.com")
.build();
빌더 패턴
복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴
빌더 패턴을 사용하는 이유
생성자의 제약사항 해결
// 생성자를 사용할 경우의 문제점
User user1 = new User("John", 25, "john@email.com", "123-456"); // 매개변수가 많으면 가독성이 떨어짐
User user2 = new User("Jane", null, "jane@email.com", null); // null을 직접 넣어야 함
불변성 보장
객체를 생성한 후에는 변경할 수 없게 만들 수 있음
setter 메서드가 필요 없어짐
유연성
선택적 매개변수가 많을 때 유용
필요한 값만 설정 가능
@Builder
public class User {
private String name;
private int age;
private String email;
private String phone;
// Lombok이 아래의 코드를 자동으로 생성
public static class UserBuilder {
private String name;
private int age;
private String email;
private String phone;
UserBuilder() {}
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder email(String email) {
this.email = email;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public User build() {
return new User(this);
}
}
}
// 빌더 패턴 사용 예시
User user = User.builder()
.name("John")
.age(25)
.email("john@email.com")
// .phone() // 선택적으로 제외 가능
.build();
빌더 활용
필수 값 지정
@Builder
public class User {
@NonNull private String name; // 필수값으로 지정
private int age;
private String email;
}
기본값 설정
@Builder
public class User {
private String name;
@Builder.Default
private int age = 20; // 기본값 설정
private String email;
}
특정 필드만 빌더 생성
@Builder(builderMethodName = "customBuilder")
public class User {
private String name;
@Builder.Include // 이 필드만 빌더에 포함
private int age;
private String email;
}
@Builder와 @NoArgsConstructor를 함께 사용할 때는 @AllArgsConstructor도 같이 사용해야한다!