본문 바로가기
프로그래밍이야기/Java

[Lombok] Constructor 정리

by 사랑꾼이야 2022. 2. 1.
반응형

Lombok은 도메인 개발시 불필요한 코드의 사용을 줄여주고 강력한 기능을 제공하여 줍니다. 그만큼 잘 알고 써야 하는 것이 맞고 개인적으로는 잘 사용하지 못할것 같으면 사용을 하지 말고 직접 개발하는 것이 맞다고 생각합니다. 그래서 잘 사용하기 위해서 하나씩 정리해보려고 합니다.

자바로 개발을 진행하면서 생성자를 통하여 많은 내용을 진행하게 됩니다. Lombok 에서는 생성자를 생성하여 주는 기능 또한 제공하여 주는데 다음과 같은 어노테이션을 제공합니다.

  • @NoArgsConstructor : 기본 생성자를 만드는데 사용합니다.
  • @AllArgsConstructor : 모든 필드의 생성자를 만드는데 사용합니다.
  • @RequiredArgsConstructor : 필수 생성자를 만드는데 사용합니다.

각각의 기본 사용법에 대해서 알아보도록 하겠습니다.

@NoArgsConstructor

기본 사용법은 다음과 같습니다.

@NoArgsConstructor
public class BookWithLombok {

    private Long id;
    private String isbn;
    private String name;
    private String author;
}

자바로 표현하면 다음과 같습니다.

public class BookWithOutLombok {

    private Long id;
    private String isbn;
    private String name;
    private String author;

    public BookWithOutLombok() {

    }
}

@AllArgsConstructor

기본 사용법은 다음과 같습니다.

@AllArgsConstructor
public class BookWithLombok {

    private Long id;
    private String isbn;
    private String name;
    private String author;
    private boolean useYn;
}

자바로 표현하면 다음과 같습니다.

public class BookWithLombok {
    private Long id;
    private String isbn;
    private String name;
    private String author;
    private boolean useYn;

    public BookWithLombok(final Long id, final String isbn, final String name, final String author, final boolean useYn) {
        this.id = id;
        this.isbn = isbn;
        this.name = name;
        this.author = author;
        this.useYn = useYn;
    }
}

@RequiredArgsConstructor

기본 사용법은 다음과 같습니다.

@RequiredArgsConstructor
public class BookWithLombok {

    private final Long id;
    private final String isbn;
    private final String name;
    private final String author;
    private boolean useYn;
}

자바로 표현하면 다음과 같습니다.

public class BookWithLombok {
    private final Long id;
    private final String isbn;
    private final String name;
    private final String author;
    private boolean useYn;

    public BookWithLombok(final Long id, final String isbn, final String name, final String author) {
        this.id = id;
        this.isbn = isbn;
        this.name = name;
        this.author = author;
    }
}

 

기본 사용법은 알아보았습니다.

각 세부 옵션에 대해서 알아보도록 하겠습니다. 세부 옵션은 다음과 같습니다.

  • staticName : 정적 팩토리 메소드를 생성합니다.
  • access : 접근제한자를 지정합니다.
  • onConstructor : 생성자의 어노테이션을 지정합니다.

staticName - 정적 팩토리 메소드 생성

사용법은 다음과 같습니다.

@NoArgsConstructor(staticName = "of")
public class BookWithLombok {

    private Long id;
    private String isbn;
    private String name;
    private String author;
}

자바로 표현하면 다음과 같습니다.
정적 팩토리 메소드인 of 를 생성하고 내부 기본 생성자 생성을 위해서 pirvate으로 호출하게 됩니다.

public class BookWithOutLombok { 
    private Long id; 
    private String isbn; 
    private String name; 
    private String author; 

    private BookWithOutLombok() { 
    } 

    public static BookWithOutLombok of() { 
        return new BookWithOutLombok(); 
    } 
}

access - 접근제한자

생성자의 대해서 접근제한자를 지정할 수 있습니다. 기본 접근제한자는 public 입니다.
접근제한자 목록은 다음과 같습니다.

PUBLIC

모든 곳에서 접근 가능합니다.
다음과 같이 사용할 수 있습니다.

@NoArgsConstructor(access = AccessLevel.PUBLIC)

자바로 표현하면 다음과 같습니다.

public class BookWithLombok {
    private Long id;
    private String isbn;
    private String name;
    private String author;

    public BookWithLombok() {
    }
}

MODULE

같은 패키지내에서 접근 가능합니다.
다음과 같이 사용할 수 있습니다.

@NoArgsConstructor(access = AccessLevel.MODULE)

자바로 표현하면 다음과 같습니다.
default 와 동일하며 같은 Lombok에서는 package 와 동일합니다.

public class BookWithLombok { 
    private Long id; 
    private String isbn; 
    private String name; 
    private String author; 

    BookWithLombok() { 
    } 
}

PROTECTED

같은 패키지 또는 자식 클래스에서 사용할 수 있습니다.
다음과 같이 사용할 수 있습니다.

@NoArgsConstructor(access = AccessLevel.PROCTECTED)

자바로 표현하면 다음과 같습니다.

public class BookWithLombok {
    private Long id;
    private String isbn;
    private String name;
    private String author;

    protected BookWithLombok() {
    }
}

PACKAGE

같은 패키지안에서 접근 가능하며 MODULE 과 동일한 기능을 합니다.
다음과 같이 사용할 수 있습니다.

@NoArgsConstructor(access = AccessLevel.PACKAGE)

자바로 표현하면 다음과 같습니다.

public class BookWithLombok {
    private Long id;
    private String isbn;
    private String name;
    private String author;

    BookWithLombok() {
    }
}

PRIVATE

내부 클래스에서만 사용할 수 있습니다.
다음과 같이 사용할 수 있습니다.

@NoArgsConstructor(access = AccessLevel.PRIVATE)

자바로 표현하면 다음과 같습니다.

public class BookWithLombok {
    private Long id;
    private String isbn;
    private String name;
    private String author;

    private BookWithLombok() {
    }
}

NONE

기본값인 PUBLIC 과 동일합니다.
다음과 같이 사용할 수 있습니다.

@NoArgsConstructor(access = AccessLevel.NONE)

자바로 표현하면 다음과 같습니다.

public class BookWithLombok {
    private Long id;
    private String isbn;
    private String name;
    private String author;

    public BookWithLombok() {
    }
}

어노테이션 생성 - AnyAnnotation

생성자의 어노테이션을 붙일 수 있습니다.
다음과 같이 사용할 수 있습니다.

@AllArgsConstructor(onConstructor_={@Builder})
public class BookWithLombok {

    private Long id;
    private String isbn;
    private String name;
    private String author;
    private boolean useYn;
}

자바로 표현하면 다음과 같습니다.

public class BookWithLombok {
    private final Long id;
    private final String isbn;
    private String name;
    private String author;
    private final boolean useYn;

    public BookWithLombok(final Long id, final String isbn, final String name, final String author, final boolean useYn) {
        this.id = id;
        this.isbn = isbn;
        this.name = name;
        this.author = author;
        this.useYn = useYn;
    }
}

force - @NoArgsConstructor만 해당

final 필드가 선언된 경우 컴파일 타임에 기본값을 0 / null / false 로 설정합니다.
다음과 같이 작성할 수 있습니다.

@NoArgsConstructor(force = true)
public class BookWithLombok {

    private final Long id;
    private final String isbn;
    private String name;
    private String author;
    private final boolean useYn;
}

자바로 표현하면 다음과 같습니다.

public class BookWithLombok {
    private final Long id = null;
    private final String isbn = null;
    private String name;
    private String author;
    private final boolean useYn = false;

    public BookWithLombok() {
    }
}
  • 기본값이 null인 필드는 null로 초기화합니다.
  • 기본값이 0인 필드는 0으로 초기화합니다.
  • 기본값이 boolean 필드는 false로 초기화합니다.

 

장점

  • 잘 사용하면 중복되는 코드들을 줄일 수 있어서 간결하게 코드를 작성할 수 있습니다.

단점

  • 어노테이션 기반이다보니 코드의 가독성면에서 좋지 않을 수 있습니다.
  • @AllArgsConsturctor, @RequiredArgsConstructor의 필드 순서 변경 시 문제 발생
반응형

댓글