주 생성자, 부 생성자

June·2022년 2월 18일
0

우테코

목록 보기
9/84
    private int position = 0;

    private Position(int position) {
        this.position = position;
    }

    public static Position createStartPosition() {
        return new Position(START_POSITION_VALUE);
    }

정적 팩토리 메서드 잘 만들어주셨습니다 👍

이제 position을 직접 초기화 해주는 부분은 없어도 되지 않을까요? 😁

직접 초기화라고 말씀하신 부분이 private int position = 0; 이 부분 맞을까요?
위에서 말씀하신 독자에게 여지를 주지 않으려면 직접 초기화를 해줘야 하는 것 아닌가요??

해당 코멘트를 남길 때 코드에는 기본 생성자(빈 생성자)가 있었던 걸로 기억해요.

private int position;

public Position() {
}

이 경우에 position이 어떤 값으로 초기화되는지 명시적으로 확인할 수 있으면 좋겠다는 의미로 남긴 코멘트였습니다.

지금은 기본 생성자가 사라지고 해당 기능이 정적 팩토리 메서드에서 처리되고 있습니다.
팩토리 메서드는 주생성자를 사용해서 초기화 하고 있죠.
그래서 position = 0 코드는 동작에 영향을 주지 않습니다.
또, 만약 Position을 불변 객체로 만든다면 컴파일 에러도 날거구요.

얘기가 나온 김에 주생성자에 대해서 공부해볼까요?

주생성자, 부생성자

생성자에는 primary constructorsecondary constructor가 있다.
이름 대로 주생성자는 메인이고, secondary constructor는 단순히 주생성자를 호출하기 위한 단계일 뿐이다.

final class Cash {
  private final int cents;
  private final String currency;
  public Cash() { // secondary
    this(0);
  }
  public Cash(int cts) { // secondary
    this(cts, "USD");
  }
  public Cash(int cts, String crn) { // primary
    this.cents = cts;
    this.currency = crn;
  }
  // methods here
}

주생성자는 하나 뿐이고, 나머지는 secondary constructor**이다. secondary constructorthis(..)`를 통해서 주생성자를 호출하는 것이 역할이다.

잘 구성된 클래슨느 반드시 하나의 주생성자만 가지고 있어야하고, 모든 secondary constructor 이후에 선언되어야 한다. 그 이유는 코드의 중복을 줄여주기 때문이다.

주생성자가 없을 경우

final class Cash {
  private final int cents;
  private final String currency;
  public Cash() { // primary
    this.cents = 0;
    this.currency = "USD";
  }
  public Cash(int cts) { // primary
    this.cents = cts;
    this.currency = "USD";
  }
  public Cash(int cts, String crn) { // primary
    this.cents = cts;
    this.currency = crn;
  }
  // methods here
}

일반적으로 내가 짜오던 코드이다. 사실 인텔리제이에서 생성자를 만드는 것은 단축키 (Alt +Ins)를 누르면 쉽게 만들기 때문에 크게 귀찮음을 느끼지 못하고 있었다. 하지만 읽는 사람의 입장에서 보면 너무 많은 중복이다.

https://www.yegor256.com/2015/05/28/one-primary-constructor.html

0개의 댓글