Lombok 사용법 간단정리
이번 글에서는 자바 클래스를 작성할 때 필요한 코드량을 줄여주는 라이브러리인 Lombok의 사용법에 대해 간략히 정리해보고자 한다.
특별한 설명이 없는 한, 어노테이션의 적용 범위는 클래스이다.
@Getter / @Setter
클래스에 정의된 필드에 각각 getter, setter 메소드를 추가하는 역할을 한다.
특정 필드에 대한 getter, setter 메소드를 추가하고 싶은 경우 필드 위에 어노테이션을 적용해야 한다.
@EqualsAndHashCode
클래스에 대한 equals 메소드, hashCode 메소드를 추가한다.
of = {(필드명 배열)} 옵션을 통해 equals의 비교 조건을 설정할 수 있다.
예를 들어 of = {"name", "age"}가 옵션으로 부여된 경우 name과 age의 값이 같다면 두 객체는 같다고 볼 수 있으므로, 어노테이션에 의해 추가되는 equals 메소드는 True를 반환한다.
해당 어노테이션을 적용한 클래스가 서브 클래스인 경우, of 옵션이 상위 클래스에 적용되지 않도록 하기 위해 callSuper = false 옵션을 부여할 수 있다.
@EqualsAndHashCode(of = {"num", "str"})
@AllArgsConstructor
public class Ex {
int num;
String str;
String addr;
}
public class ExMain {
public static void main(String[] args) {
Ex e1 = new Ex(1, "23", "456");
Ex e2 = new Ex(1, "23", "333");
System.out.println(e1.equals(e2)); // true 출력
}
}
@ToString
클래스의 필드를 기반으로 toString 메소드를 자동으로 완성하여 추가한다.
출력을 원하지 않는 필드에 @ToString.Exclude 어노테이션을 붙이면 클래스의 @ToString에 의해 추가되는 toString 실행시 해당 필드 정보가 제외된 상태로 String이 반환된다.
생성자 관련 어노테이션
@NoArgsConstructor
파라미터도, 내용도 없는 기본 생성자를 추가한다.
@AllArgsConstructor
모든 필드 값을 파라미터로 받는 파라미터 생성자를 추가한다.
@RequiredArgsConstructor
final 필드, @NonNull이 적용된 필드의 값만 파라미터로 받는 파라미터 생성자를 추가한다.
(@NonNull은 null이 아님을 보장하는 스프링 프레임워크의 어노테이션)
@Builder
해당 어노테이션을 적용한 클래스의 객체에 Builder 패턴(객체를 생성하는 데 사용되는 디자인패턴)을 적용시킨다.
Builder 패턴을 사용해 모든 필드 값을 설정하고 싶다면 클래스 위에 @Builder를 적용하면 되지만, 특정 변수만을 설정하고 싶다면 특정 필드 값을 파라미터로 받는 생성자 위에 @Builder를 적용하면 된다.
@Data
@ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 클래스에 적용한 효과(자동완성)를 발생시킨다.
@Delegate
한 객체의 메소드를 다른 객체로 위임시키는 역할을 한다.
클래스 A에 B 타입의 필드가 정의된 상황에서 A에 @Delegate를 적용한 경우, B 타입 필드의 메소드를 A의 메소드인 것처럼 직접 호출할 수 있다.
(a.getB().bmethod()가 아닌, a.bmethod()를 호출해도 해당 필드의 bmethod가 호출된 것과 동일한 효과)
class DelObj {
public void printMessage(String arg) {
System.out.println("인자로 전달한 메시지 출력: " + arg);
}
}
@AllArgsConstructor
class Ex {
@Delegate
DelObj del; // Ex에서 del의 메소드 호출 가능
}
public class Main {
public static void main(String[] args) {
DelObj del = new DelObj();
Ex ex = new Ex(del);
ex.printMessage("Ex의 printMessage인 것처럼 잘 실행될 겁니다.");
}
}
로그 관련 어노테이션
@Log4j2와 같은 어노테이션을 클래스에 적용하면, 해당 클래스의 로그 클래스를 자동으로 완성한다고 한다.
로그 관련한 내용은 다음에 더 공부해보아야겠다.