티스토리 뷰

반응형

이 글은 이펙티브 자바를 읽고 정리한 글입니다.

 

클래스의 인스턴스를 생성하는 방법

  • public 생성자
  • 정적 팩터리 메서드 (static factory method)

java의 Boolean 클래스에서 제공하는 정적 팩터리 메서드

 클래스는 public 생성자 외에도 정적 팩터리 메서드를 제공하여 객체를 생성할 수 있게 해준다.

 

 

정적 팩터리 메서드의 장점

1. 이름을 가질 수 있다

  public 생성자를 사용해서 인스턴스를 생성할 때 생성자와 생성자에 넘기는 매개변수로는 객체의 특성을 제대로 설명하기 어렵다.

  new BigInteger(int, int, Rnadom)과 BigInteger.probablePrime으로 BigInteger 객체를 생성한다고 했을 때, 후자의 이름을 보면 소수인 BigInteger를 생성하는 것을 알 수 있다.

 

 하나의 시그니처(접근 제어자, 클래스명, 매개변수)를 가지는 생성자는 단 하나만 존재한다. 매개변수의 순서를 다르게해서 생성자를 만들 수 있지만 타입이 모두 같은 경우에는 불가능한 방법이고, 의도한 생성자와는 다른 생성자를 호출할 위험이 있다.

  정적 팩터리 메서드에서 시그니처가 같은 생성자가 여러개 필요할 때, 정적 팩터리 메서드에 명확한 이름을 붙이는 방식으로 해결할 수 있다.

 

2. 호출할 때마다 인스턴스를 새로 생성하지는 않아도 된다

  인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 다시 사용하는 방식으로 불필요한 객체 생성을 만들수 있다. 

 

Boolean 클래스에서 미리 생성된 객체
Boolean 클래스의 정적 팩터리 메서드

  Boolean 클래스의 valueOf는 객체를 생성하지 않고, 클래스 내에 미리 생성된 객체를 사용한다. 동일한 객체가 자주 요청되는 상황에서는 성능이 좋아진다.

  동일한 요청에 같은 객체를 반환하면 인스턴스를 통제할 수 있다. 이런 클래스를 instance-controlled 클래스라고 한다. 인스턴스를 통제함으로써 클래스를 싱글턴으로 만들수도 있다. 인스턴스화가 불가능하게 만들수 있다. 그리고 o1 == o2 일 때만 o1.equals(o2)가 성립 같은 값을 가지는 인스턴스가 단 하나임이 보장된다.

 

3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다

  상위 객체 타입을 리턴 타입으로 지정하고 하위 객체 타입을 반환할 수 있다. 반환할 클래스의 타입을 자유롭게 설정할 수 있다.

 

  createVoucher은 Voucher 객체를 리턴하는 메서드이다. FixedAmountVoucher과 PercentDiscountVoucher는 Voucher 클래스를 상속받는다. 해당 메서드는 인자로 받은 VoucherType에 따라서 FixedAmountVoucher 또는 PercentDiscountVoucher를 생성하여 리턴한다. Voucher의 하위 객체 타입을 리턴하는 것이다.

  사용할 때는 어떻게 구현되어 있는지 모르고 그냥 리턴 받은 객체를 통해서 사용하면 된다.

 

4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다

EnumSet 클래스

  EnumSet 클래스는 파라미터 elementType에 따라 RegularEnumSet 또는 JumboEnumSet 클래스의 인스턴스를 반환한다. 이것도 호출시 어떤 하위 클래스를 리턴하는지는 알 수 없다.

 

5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다

  서비스 제공자 프레임워크를 만들 수 있는 근간이된다. 제공자는 서비스의 구현체이고 구현체들을 클라이언트에 제공하는 역할을 프레임워크가 통제하여 클라이언트를 구현체로부터 분리해준다.

 

 

단점

1. 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다

  상속을 위해서는 public 혹은 protected 생성자가 추가적으로 필요하다. 따라서 프레임워크의 유틸리티 클래스들은 상속할 수 없다.

 

2. 정적 팩토리 메서드는 개발자가 찾기 어렵다

  정적 팩토리 메서드에서 사용하는 명명 방식이다.

 

  • from: 매개변수를 받아서 해당 타입의 인스턴스를 반환하는 형변환 메서드
  • of: 여러 매개변수를 받아 적절한 타입의 인스턴스를 반환하는 집계 메서드
  • value of: from과 of의 상세한 버전
  • instance, getInstance: 매개변수로 받은 인스턴스를 반환하지만 같은 인스턴스임은 보장할 수 없음
  • create, newInstance: 매번 새로운 인스턴스를 생성해 반환
  • getType, newType: 다른 클래스에 팩터리 메서드를 정의할 때 사용
  • tyupe: getTyper과 newType의 간결한 버전

 

 

참고

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함