Java Lombok | 생성자 자동 생성 - @NoArgsConstructor @RequiredArgsConstructor @AllArgsConstructor
생성자를 자동 생성해 주는 어노테이션 3가지에 대한 사용법과 주의 사항에 대해서 알아 본다.
생성자 자동 생성
생성자를 자동 생성해 주는 어노테이션은 3가지가 존재한다.
@NoArgsConstructor
: 인수가 없는 생성자를 자동 생성해 준다.@RequiredArgsConstructor
:final
로 선언된 필드만 생성자 인수로 자동 생성해 준다.@AllArgsConstructor
: 모든 인수를 가진 생성자를 자동 생성해 준다.
@NoArgsConstructor
사용
@NoArgsConstructor
어노테이션을 선언하여 인수가 없는 생성자를 생성할 수 있다.
package com.devkuma.tutorial.lombok;
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class NoArgsConstructorTutorial {
public NoArgsConstructorTutorial(String string) {
}
public static void main(String[] args) {
new NoArgsConstructorTutorial();
}
}
@RequiredArgsConstructor
사용
@RequiredArgsConstructor
어노테이션을 선언하여 final
로 선언된 필드만 인수로 받는 생성자를 자동으로 생성할 수 있다.
package com.devkuma.tutorial.lombok;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class RequiredArgsConstructorTutorial {
private String optional;
private final int required;
public static void main(String[] args) {
new RequiredArgsConstructorTutorial(1);
}
}
@AllArgsConstructor
사용
@AllArgsConstructor
어노테이션을 선언하여 모든 필드를 인수받는 생성자를 자동으로 생성 할 수 있다.
package com.devkuma.tutorial.lombok;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class AllArgsConstructorTutorial {
private String string;
private int number;
public static void main(String[] args) {
new AllArgsConstructorTutorial("devkuma", 999);
}
}
static
팩토리 메소드 정의
각 어노테이션 staticName
속성을 지정하는 것으로, static
팩토리 메소드를 자동 생성 할 수 있다.
package com.devkuma.tutorial.lombok;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor(staticName="of")
public class StaticFactoryOfTututorial {
private final String required;
private int optional;
public static void main(String[] args) {
StaticFactoryOfTututorial tututorial = StaticFactoryOfTututorial.of("devkuma");
}
}
사용시 주의 사항
@AllArgsConstructor
, @RequiredArgsConstructor
는 매우 편리하게 생성자를 생성해 주지만, 별 생각 사용하다 보면, 치명적 버그가 발생할 수 있다.
문제 코드
아래 예제는 @AllArgsConstructor
를 선언하여, x
, y
인자를 순서대로 받아 자동 생성해 주도록 하였다.
package com.devkuma.tutorial.lombok.warning;
import lombok.AllArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
@ToString
public class ConstructorWarning {
private String x;
private String y;
public static void main(String[] args) {
ConstructorWarning warning = new ConstructorWarning("x", "y");
System.out.println(warning);
}
}
실행 결과:
ConstructorWarning(x=x, y=y)
문제 발생
이때, 코드에 정리를 하다가 x
, y
인자의 순서를 아래와 같이 변경하게 되면, 두 인자의 값은 변경되어 버린다.
private String y;
private String x;
실행 결과:
ConstructorWarning(x=y, y=x)
이는 에러가 발생하지도 않고, 개발자가 인지도 못한 상태에 버그가 되어 버리는 것이다.
해결 방법
이를 해결 방법은 @Builder
어노테이션을 사용하면 해결 할 수 있다.
package com.devkuma.tutorial.lombok.warning;
import lombok.Builder;
@Builder
public class ConstructorSolve {
private String x;
private String y;
public static void main(String[] args) {
ConstructorSolve warning = ConstructorSolve.builder()
.x("x")
.y("y")
.build();
System.out.println(warning);
}
}
이렇게 작성하므로써 x
, y
인자의 순서가 변경되어도, 두 인자의 값은 변경되지 않게 된다.
참고
최종 수정 : 2024-01-18