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