[1단계 - 로또(자동)] 유콩(김유빈) 미션 제출합니다. by kyukong · Pull Request #397 · woowacourse/java-lotto

[2단계 - 로또(수동)] 유콩(김유빈) 미션 제출합니다. by kyukong · Pull Request #486 · woowacourse/java-lotto

생성자 파라미터 타입 - 객체가 관리하는 상태값 타입

public Payment(final String payment) {
	validatePayment(payment);
  this.payment = Integer.parseInt(payment);
}

Untitled

Untitled

특별한 경우가 아니라면 주 생성자의 파라미터는 객체가 보유하는 상태값의 타입과 일치시킨다. 타입을 일치시킴으로써 다른 사용자가 가질 수 있는 혼동을 줄일 수 있고 부 생성자를 추가하여 확장할 경우 로직이 복잡해지지 않을 수 있다.

생성자의 파라미터 타입과 객체가 가지는 변수의 타입이 달라야 한다면 정적 팩토리 메소드를 사용해 달라질 수 있음을 나타낸다.

예) 로또 티켓 생성 시 중복값이 없으며 특정한 기준으로 정렬되어 있음을 알리기 위해 TreeSet 타입으로 값을 관리하였다. 하지만 사용자가 입력한 값에 중복값이 있을 경우 에러 메시지로 띄우기 위해 ArrayList 로 입력받아 검증하였다. 생성자의 파라미터 타입과 객체의 변수 타입이 다르기 때문에 정적 팩토리 메소드를 사용하였다.

캐싱 위치 - 객체 역할

static {
  lottoTotalNumbers.addAll(IntStream.range(Ball.MINIMUM_NUMBER, Ball.MAXIMUM_NUMBER + 1)
          .boxed()
          .collect(Collectors.toList()));
}

Untitled

45개의 로또 번호(Ball)가 프로그램 내에서 중복적으로 사용되므로 객체를 캐싱하였다. 로또 번호를 사용하는 주체인 로또 티켓(Lotto) 에서 캐싱하였는데 다음과 같은 피드백을 받았다. Lotto 는 검증된 Ball 객체 6개를 중복없이 가지는 객체일 뿐 모든 Ball 정보를 관리하지는 않는다. Ball 객체의 생성자를 호출할 때 내부적으로 캐싱된 객체를 반환하기 위해 캐싱하는 위치를 Ball 로 이동하였다.

객체 vs 인스턴스 변수 vs 메소드 내 변수

Untitled

특정한 값에 대한 로직이 존재한다고 무조건 객체로 생성하는 것은 옳지 않다. 사용하는 범위, 필요한 로직 등에 따라 값의 형식이 다를 수 있다. 어떤 상황에서 어떤 형식을 사용해야 하는지 정리해보았다.

객체

인스턴스 변수