본문 바로가기
프로그래밍/자바

[effective java2]규칙1. 생성자 대신 정적 팩터리 메소드를 사용할 수 없는지 생각해 보라

by 카라미 2017. 9. 6.

객체의 생성과 삭제

규칙1. 생성자 대신 정적 팩터리 메소드를 사용할 수 없는지 생각해 보라

클래스를 통해 객체를 만드는 가장 일반적인 방법은 public 한 생성자를 이용하는 것 또 알아야 할 방법은 정적 팩토리 메소드를 추가하는것 <정적팩토리메소드의 예>
public static Boolean valueOf(boolean b){
       return b ? Boolean.TRUE : Boolean.FALSE;
}

public으로 선언된 생성자 대신 정적 팩토리 메소드를 제공하는 방법의 장단점!!
첫번째 장점 : 생성자와는 달리 정적 팩터리 메소드에는 이름이 있다.
- 생성자에 전달되는 인자들은 어떤 객체가 생성되는지를 설명하기 힘들다.
- 정적팩토리 메소드는 이름을 잘 짓기만 하면 사용하기도 쉽고, 코드의 가독성도 높아진다.

예> BigInteger(int, int, Random) VS BigInteger.probablePrime

두번째 장점 : 생성자와는 달리 호출할 때마다 새로운 객체를 생성할 필요는 없다.

- 미리 만들어 둔 객체를 활용하거나, 만든 객체를 캐시해놓고 재사용하여 같은 객체가 불필요하게 생성되는 일을 피할 수도 있다.
예 : Boolean.vlaueOf(Boolean) 이 기법을 활용한 좋은 사례
-같은 객체를 반복해서 반환할 있으므로, 어떤 시점에 어떤 객체가 얼마나 존재하는지 정밀하게 제어가능!! 이런 기능을 갖춘 클래스를 개체통제클래스(instance-controlled class)라고 부름.. 이렇게 작성하면 좋은 이유. 1) 개체 수를 제어하면 싱글턴 패턴을 따르도록 할 수 있다. 2) 객체 생성이 불가능한 클래스를 만들 수 있다. 3) 변경이 불가능한 클래스의 경우 두개의 같은 객체가 존재하지 못하도록 할 수도 있다. 즉 a == b 일때만 a.equals(b)가 참이 되도록 만들 수 있다. (비교성능이 좋아짐)
세번째장점 : 생성자와는 달리 반환값 자료형의 하위 자료형 객체를 반환할 수 있다.

- 반환되는 클래스를 훨씬 유연하게 결정 할 수 있다.

네번째 장점 : 형인자 자료형(parameterized type) 객체를 만들 때 편하다.

첫번째 단점 : public 이나 protected로 선언된 생성자가 없으므로 하위 클래스를 만들 수 없다.

두번째 단점 : 정적팩터리 메소드가 다른 정적 메소드와 확연히 구분되지 않는다.
- 현재는 정적 팩토리 메소드 이름을 지을 때 조심하는 수밖에 없다.
- 보통 정적 팩토리 메소드를 사용할 때 아래와 같은 것들을 사용한다.
1) valueOf : 인자로 주어진 값과 같은 값을 갖는 객체를 반환
2)Of : valueOf를 더 간단하게 쓴 것.
3)getInstance : 인자에 기술된 객체를 반환하지만, 인자와 같은 값을 갖지 않을 수 있다. 싱글턴 패턴을 따를 경우, 이 메소드는 인자없이 항상 같은 객체반환
4)newInstance : getInstance와 같지만 호출할 때마다 다른 객체를 반환한다.
5)getType : getInstance와 같지만, 반환될 객체의 클래스와 다른 클래스에 팩터리 메소드가 있을 때 사용. Type은 팩터리 메서드가 반환할 객체의 자료형!!
6)newType : newInstance와 같지만 반환될 객체의 클래스와 다른 클래스에 팩터리메소드가 있을때 사용. Type은 팩터리 메서드가 반환할 객체의 자료형!!

요약
public 생성자와 정적팩터리 메소드는 용도가 서로 다름. 차이와 장단점을 이해하는 것이 중요!!!
정적 팩터리 메소다가 효과적인 경우가 많으니 항상 먹저 고려해보는것이 좋음!!!!

'프로그래밍 > 자바' 카테고리의 다른 글

[effective java2]규칙2. 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라.  (0) 2017.09.07
Exception 예제  (0) 2016.02.23
ChatClient  (0) 2016.01.22
EchoThreadServer  (0) 2016.01.22
Echo  (0) 2016.01.22