본문 바로가기

Development Note

RTP Session 1. Replace Constructors with Creation Methods

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Replace Constructors with Creation Methods

하지만, 컴퓨터 생성자를 사용하면 둘중 하나만 구입하는 경우는 만들수가 없습니다. 왜냐면 사운드 카드를 추가하는 경우와 그래픽 카드를 추가하는 경우에 생성자 오버로딩의 원칙(타입과 갯수가 다른 경우)에 위배되기 때문입니다. 따라서 컴파일 에러가 발생합니다.

그럼 이런 경우에는 어떻게 해야될까요?? 참으로 난감한 일이 아닐 수 없습니다!! 책에 이런 내용이 있습니다. 이게 키워드가 될 수 있을까요?

어 떤 클래스의 인스턴스를 생성할 때 그것이 제공하는 여러 생성자 중 어떤 것을 호출해야 할지 결정하기가 어렵다면, 인스턴스를 생성해 리턴하는 생성 메서드(Creation Method)로 각 생성자를 대체하여 그 용도가 명확히 드러나도록 한다.
이 키워드를 보니 또하나의 문제점이 발생했습니다. 생성자가 메소드의 이름이 다 똑같은 Computer이기 때문에 사운드 카드를 달았는지, 그래픽 카드를 달았는지, 둘다 달았는지 명시적이지가 않습니다. 그럼 Computer라는 메소드를 명시적으로 바꿔주면 되지 않겠느냐고요 -_-? 여러분도 아시다시피 생성자 메소드는 클래스 명과 동일하게만 만들 수 있기 때문에 불가능 하지만, Creation Method 을 사용하여 리팩토링이 가능하다고 합니다!!

어떻게 바뀌는지 한번 보시지요!

public class Computer {

     private int cost;

     private String mainBoard;

     private String cpu;

     private String ram;

     private String hdd;

     private String graphicDevice;

     private String soundCard;

      // Full-argument Constructor

      public Computer(int cost, String mainBoard, String cpu, String ram,

                   String hdd, String graphicDevice, String soundCard) {

            this.cost = cost;

            this.mainBoard = mainBoard;

            this.cpu = cpu;

            this.ram = ram;

            this.hdd = hdd;

            this.graphicDevice = graphicDevice;

            this.soundCard = soundCard;

      }

      // 기본 사양 컴퓨터

      public static Computer createDefaultComputer(int cost, String mainBoard,

                   String cpu, String ram, String hdd) {

            return new Computer(cost, mainBoard, cpu, ram, hdd, null, null);

      }

      // 그래픽 카드를 추가한 컴퓨터

      public static Computer createComputerWithGraphicDevice(int cost,

                   String mainBoard, String cpu, String ram, String hdd,

                   String graphicDevice) {

            return new Computer(cost, mainBoard, cpu, ram, hdd, graphicDevice, null);

      }

      // 사운드 카드를 추가한 컴퓨터

      public static Computer createComputerWithSoundCard(int cost,

                   String mainBoard, String cpu, String ram, String hdd,

                   String soundcard) {

            return new Computer(cost, mainBoard, cpu, ram, hdd, null, soundcard);

      }

}


인스턴스를 반환하는 팩토리 메소드를 만들어서, 이름을 멋지게 만들어 줬습니다. 좀 더 구체적으로 어떤 옵션의 컴퓨터 객체를 생성하는지 명시적으로 변했고, 불필요하게 많은 생성자 오버로딩을 하거나, 예기치 않게 타입과 갯수가 똑같은 경우에 오버로딩이 안되서 골치 아프던 경우도 사라졌습니다.

이렇게 객체 생성 팩토리 메소드를 사용해서 생성자를 대체하는 방법은 다음과 같은 장단점이 있다고 합니다.

+ 그 용도를 생성자보다 명확히 드러낼 수 있다.
+ 동일한 수와 타입의 파라미터를 받는 생성자를 두 개 이상 만들 수 없었던 제한이 사라진다.
+ 사용되지 않는 생성 코드를 찾기가 쉬워진다.

- 객체를 생성할 때 표준이 아닌 방식을 사용하게 된다. 어떤 클래스에 대해서는 new 연산자를 사용하고, 어떤 클래스에 대해서는 생성 메서드를 통하게 된다.


확실하게 위의 두가지 장점을 보고 있는 것 같습니다. ^^ 어떤 예제를 사용하여 효과적으로 학습을 해야 할까 고민을 많이 했는데, 제대로 잘 설명이 되었는지 모르겠네요~ 부족한 점 있으면 지적해 주시면 감사하겠습니다!