생성자 대신 static 팩토리(factory)메소드를 사용하라는게 무슨말인가요?
조회수 2932회
1 답변
-
보통 클래스의 객체를 생성할때 public 생성자를 사용하는데요. 꼭 이런 방법 말고도 public static factory메소드를 만드는 방법도 있습니다. 이 메소드는 해당 클래스의 인스턴스를 하나 생성하여 반환해주는 메소드인데 생성자를 대신해서 static 팩토리 메소드를 사용하면 다음과 같은 장단점이 있습니다.
1.자기만의 이름을 가질 수있다. 생성자와는 다르게 자기 고유의 이름이 있기때문에 다른 사용자들이 이 메소드가 어떤 일을 하는지 보다 쉽게 이해 할 수 있습니다.
호출 될 때마다 새로운 객체를 생성하는 것을 막을 수 있다.
불필요하게 중복된 인스턴스의 생성을 막기 위해 이미 생성된 인스턴스들을 저장했다가 반복 사용할 수 있게해주고 이미 생성된 인스턴스를 다시 사용하게 만들 수 있다.반환 할 수있는 객체 타입의 제약이 없다. static 팩토리 메소드는 반환할 자료형을 선택 할 수 있어서 객체의 클래스를 선택해야 할 때 뛰어난 유연성을 제공한다.
매개변수화 타입의 인스턴스를 생성하는 코드를 간결하게 해준다. static 팩토리 메소드를 사용하면 컴파일러가 타입 매개변수를 해결해준다. 이를 타입 추론이라고 하며 아래 소스를 보면 이해가 쉽다.
Map<String, List<String>> m = new HashMap<String, List<String>>();
타이핑 힘들고 복잡하다. 이때 HashMap에서 아래와 같은 static 팩토리 메소드가 제공된다고 가정하면 가정이다 가정 실제 존재하지는 않는다.public static <K,V> HashMap<K,V> newInstance(){ return new HashMap<K,V>(); } Map<String, List<String>> m = new HashMap.newInstance();
타입 매개변수를 연달아 두번 주었지만 static 메소드 제공으로 한번으로 줄어듬을 확인할 수 있다.
그렇다면 단점은 어떤게 있을까?
- 인스턴스 생성을 위해 static 팩토리 메소드만 갖고 있으면서 public이나 protected 생성자가 없는 클래스의 경우 서브 클래스를 가질 수 없다. 이럴 경우 상속이 불가능하하며 컴포지션 패턴 사용.
- 다른 static 메소드와 쉽게 구별할 수 없다.
댓글 입력