저는 이펙티브 자바의 내용을 그대로 열거하는 것이 아닌,

제가 직접 궁금하고 느낀 점을 기준으로 포스팅을 진행하도록 하겠습니다.

이 장에서는 public static을 이용한 정팩 팩토리 메소드의 장점에 대해 나열하고 있습니다.

이 장을 공부하면서 생겼던 실시간 의문점은 다음과 같습니다.

팩토리 메소드가 정확히 뭐지?
정적 팩토리 메소드랑은 무슨 차이지?
정적 메소드는 뭐였지?
static이 붙으면 뭐가 달라지지?
static이 정확히 어떤 역할을 해준거지?

일단 팩토리 메소드가 무엇인지 알고 넘어가야하는데 위키백과의 정의로는

팩토리 메서드 패턴(Factory method pattern)은 객체지향 디자인 패턴이다. 
Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 
자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 
부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.

라고 합니다.

한마디로 상속과 다형성(extends, implements)을 이용하여 객체를 사용자에 입맛에 맞게 생성한다는 의미입니다.

그래서 정적 팩토리 메소드랑은 무슨 차이지? 라고 생각 하는 순간 책에서 바로 말해 줍니다.

지금 얘기하는 정적 팩토리 메소드는 디자인 패턴에서의 팩토리 메소드와는 다르다.

아, 생각이 그만 앞서나가고 말았습니다. 그러나 이 기회에 팩토리 메소드에 대해 정확히 알고 넘어가는 기회가 되어 좋았습니다.

 

다시 돌아와서, 그렇다면 정적 팩토리 메소드의 정의는 무엇일까요?

책에서는 "클래스의 인스턴스를 반환하는 단순한 정적 메소드" 라고 합니다.

즉, "정적 메소드"인데 그 역할이 인스턴스를 생성(공장에서 처럼)해줘서 정적 팩토리 메소드 라는 이름이 붙은것 같습니다.

 

메소드는 뭘까요?

일반 적으로 메소드는 반복적인 작업을 단순화 하기 위한 '함수'를 의미합니다.

 

정적이다는 의미는 뭘까요?

우리는 기본적으로 변수 타입을 컴파일 시점에 확인하는지(정적), 런타임에 확인하는지(동적)를 기준으로 나눕니다.

 

그렇다면 정적 메소드는 뭘까요?

static으로 변수나 메소드를 선언하게 되면 프로그램 시작 시점에 메모리에 올라가 종료가 될때까지 변하지 않습니다.

객체가 생성될 때 마다 따로 생성된는것이 아닌(= 객체를 생성해야만 부를 수 있는것이 아닌)것입니다.

이 차이는 다음 사진을 보면 쉽게 이해 하실 수 있습니다.

 

num과 staticNum을 호출하는 방법

 

위 사진은 메소드를 호출하는 것은 아니지만 static을 다루는 방법의 차이를 보여줍니다.

 

이렇게 정적 메소드를 이해하는 순간 앞서 정적 팩토리 메소드를 설명한 문장인

"클래스의 인스턴스를 반환하는 단순한 정적 메소드"를 비로소 이해 할 수 있게 되었습니다.

저자는 정적 팩토리 메소드의 장/단점을 이렇게 말했습니다.

장점

  1. 이름을 가질 수 있다.
  2. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.
  3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
  4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
  5. 정적 팩토리 메소드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

단점

  1. 상속을 하려면 public이나 protectec 생성자가 필요하니 정적 팩토리 메소드만 제공하면 하위 클래스를 만들 수 없다.
  2. 정적 팩토리 메소드는 프로그래머가 찾기 어렵다.

장점의 대부분은 개발의 '객체 생성의 유연성'에 대해 서술하고 있는데

제가 이해한 정적 팩토리 메소드를 활용한 예시를 보여드리겠습니다.

 

 

RGB는 색의 삼원색입니다. Red, Green, Blue의 값에 0~255중 임의의 값을 넣으면

숫자에 맞는 Color가 출력되게 하고 싶습니다.

 

 

그러나 일반 사람들은 256 x 256 x 256개의 숫자 조합을 다 외우고 다니지 못합니다.

그러니 특정 색의 경우 이름을 알면 바로 객체를 생성할 수 있게 정적 팩토리 메소드를 만들어줍니다.

 

 

이렇게 만들게 되면 우리는 RGB값을 모른채 black과 white만 알고 있어도 색의 객체를 얻을 수 있습니다.

쉬운 예제였지만 정적 팩토리 메소드가 말하고자 하는 것은

결국 '너가 인스턴스를 만들 때 생성자를 사용하는 것이 최선이냐'를 물어보는 챕터였던 것 같습니다.

 

 

피드백은 언제나 환영입니다. 감사합니다.

+ Recent posts