[JAVA] Lombok 라이브러리

DANI·2023년 11월 30일
0

JAVA를 공부해보자

목록 보기
14/29
post-thumbnail

💻 인텔리제이 설정

  • setting > Editor > General > Auto Import

✅ 롬복 애너테이션

  • @Getter, @Setter
  • @ToString : toString() 재정의
  • @NonNull : not null
  • @Data : @Tostring + @Getter + @Setter + @EqualsAndHashCode

📑 생성자

  • @AllArgsConstructor
    👉 모든 필드에 생성자를 만들어줌
  • @NoArgsConstructor
    👉 기본 생성자를 만들어줌
  • @RequiredArgsConstructor
    👉 final 필드, @NonUll 필드에 대한 생성자를 만들어 줌

💾 Book 클래스
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;
}

💾 Book Main
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=출판사)



📑 @EqualsAndHashCode : equals, hashcode 메서드 자동 생성

💾 Book Main
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

💾 Book 클래스 + @EqualsAndHashCode 추가
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

클래스에 작성하면 모든 필드에 대한 빌더를 만들어준다. 원하는 필드에 대해서만 빌더를 작성하고 싶은 경우 생성자를 작성하고 그 위에 @Builder를 붙여주면 된다.

💾 Book 클래스

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;
        }
    }
}

💾 Book Main

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='출판사'}


💾 Student 클래스

package ex04;

import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Student {

    private String name;
    private String age;
    private String major;

}

💾 StudentMain

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

0개의 댓글

관련 채용 정보