@Getter
, @Setter
@ToString
: toString() 재정의@NonNull
: not null @Data
: @Tostring
+ @Getter
+ @Setter
+ @EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
package ex01;
import lombok.*;
@Getter
@Setter
@ToString
// @NoArgsConstructor(access = AccessLevel.PRIVATE) // 기본 생성자, 생성자의 범위 지정
@RequiredArgsConstructor
@AllArgsConstructor
public class Book {
private String name;
private String author;
@NonNull private String publisher;
}
package ex01;
public class BookMain {
public static void main(String[] args) {
Book bk2 = new Book("스프링6", "최범균", "출판사");
System.out.println(bk2);
Book bk1 = new Book("출판사");
System.out.println(bk1);
}
}
Book(name=스프링6, author=최범균, publisher=안녕)
Book(name=null, author=null, publisher=출판사)
package ex01;
public class BookMain {
public static void main(String[] args) {
// Book bk2 = new Book("스프링6", "최범균", "출판사");
// System.out.println(bk2);
Book bk1 = new Book("출판사");
Book bk2 = new Book("출판사");
System.out.println(bk1==bk2); // 주소 비교, 동일성 비교
System.out.println(bk1.equals(bk2)); // 동등성 비교
System.out.println(bk1.hashCode() + " " + bk2.hashCode()); // 해시코드
}
}
false
false
1324119927 990368553
package ex01;
import lombok.*;
@Getter
@Setter
@ToString
// @NoArgsConstructor(access = AccessLevel.PRIVATE) // 기본 생성자, 생성자의 범위 지정
@RequiredArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Book {
private String name;
private String author;
@NonNull private String publisher;
}
false
true
52665111 52665111
@With
setter의 불변 버전이다. 필드에 @With를 명시한 경우 withFieldName(newValue) 형태로 메소드를 추가해준다.
@With는 객체를 생성하기 위해서 생성자에 의존한다. 만약 적절한 생성자가 존재하지 않는다면 @With는 컴파일 오류를 발생시킨다.
@Setter처럼 AccessLevel을 사용해서 접근 수준을 설정할 수 있으며 기본값은 public이다.
public class Book {
private String name;
@With private String author;
@NonNull private String publisher;
}
@Value
@Data의 불변 클래스 버전이다. 모든 필드를 private / final로 만들고 setter는 생성되지 않는다. 클래스 또한 final로 만듦
@Data처럼 toString(), equals(), hashCode()를 자동으로 생성해주고 각 필드에 대한 getter와 생성자 또한 만들어 준다.
클래스에 작성하면 모든 필드에 대한 빌더를 만들어준다. 원하는 필드에 대해서만 빌더를 작성하고 싶은 경우 생성자를 작성하고 그 위에 @Builder를 붙여주면 된다.
package ex04;
import lombok.*;
// @Builder 메서드 체이닝
@Getter
@Setter
public class Book {
private String title;
private String author;
private String publisher;
private Book() {}
@Override
public String toString() {
return "Book{" +
"title='" + title + '\'' +
", author='" + author + '\'' +
", publisher='" + publisher + '\'' +
'}';
}
// @Builder
public static Builder builder(){
return new Builder();
}
protected static class Builder{
private Book instance = new Book();
public Builder title(String title){
instance.title = title;
return this;
}
public Builder author(String author){
instance.author = author;
return this;
}
public Builder publisher(String publisher){
instance.publisher = publisher;
return this;
}
public Book build(){
return instance;
}
}
}
package ex04;
public class BookMain {
public static void main(String[] args) {
Book b1 = Book.builder()
.title("제목")
.author("저자")
.publisher("출판사")
.build();
System.out.println(b1);
Book b2 = Book.builder()
.publisher("출판사")
.title("제목")
.build();
b2.setTitle("타이틀 변경");
b2.setAuthor("작가 추가");
System.out.println(b2);
}
}
Book{title='제목', author='저자', publisher='출판사'}
Book{title='타이틀 변경', author='작가 추가', publisher='출판사'}
package ex04;
import lombok.Builder;
import lombok.ToString;
@Builder
@ToString
public class Student {
private String name;
private String age;
private String major;
}
package ex04;
public class StudentMain {
public static void main(String[] args) {
Student s2 = Student.builder().name("홍길동").age("23").major("컴공").build();
System.out.println(s2);
}
}
Student(name=홍길동, age=23, major=컴공)
참고 : https://projectlombok.org/features/
https://www.korecmblog.com/blog/lombok
https://dev-jhl.tistory.com/entry/Lombok-%EC%98%AC%EB%B0%94%EB%A5%B8-Lombok-%EC%82%AC%EC%9A%A9%EB%B2%95-Builder