자바에서 객체를 만들 때 가장 많이 사용하는 방법은 생성자를 부르는 것이다.
생성자 이외에도 인스턴스 정보를 보내주는 다른 방법이 있다.
책을 읽으면서 나름의 예제코드를 만들어보았다. 만든 예제코드로 한번 알아보자
먼저 예제로 이용할 클래스들이다.
- package homework;
- public class Tv {
- String screen;
- String audio;
- int button;
- public static Tv newInstance(String type){
- if (type.equals("SmartTv")) {
- return new SmartTv();
- } else if (type.equals( "NormalTv" )) {
- return new NormalTv();
- }
- return null;
- }
- public void testTv() {
- System.out.println(screen + "스크린, " + audio + "오디오, " + button + "button");
- }
- public String getScreen() {
- return screen;
- }
- public String getAudio() {
- return audio;
- }
- public int getButton() {
- return button;
- }
- }
TV클래스이다.
- package homework;
- public class SmartTv extends Tv {
- String screen = "High";
- String audio = "A등급 ";
- int button = 2;
- public String getScreen() {
- return screen;
- }
- public String getAudio() {
- return audio;
- }
- public int getButton() {
- return button;
- }
- }
스마트TV 클래스이다.
- package homework;
- public class NormalTv extends Tv {
- String screen = "Low";
- String audio = "B등급 ";
- int button = 1;
- public String getScreen() {
- return screen;
- }
- public String getAudio() {
- return audio;
- }
- public int getButton() {
- return button;
- }
- }
노멀TV 클래스이다.
- package homework;
- public class homework01 {
- public static void main(String[] args) {
- Tv tv1 = Tv.newInstance("SmartTv");
- System.out.println("스마트TV: " + tv1.getScreen()+"스크린, " +
- tv1.getAudio()+"오디오, " + tv1.getButton()+"개 버튼");
- Tv tv2 = Tv.newInstance("NormalTv");
- System.out.println("노멀TV: " + tv2.getScreen()+"스크린, " +
- tv2.getAudio()+"오디오, " + tv2.getButton()+"개 버튼");
- }
- }
마지막으로 구현 클래스이다.
결과는 위와 같다,
TV 클래스를 보면 생성자가 없다
9행을 보면 정적팩토리 메소드가 사용된 것을 볼 수 있는데
구현클래스에서 7행 Tv.newInstance(문자열) 을 통해서
인스턴스를 전해준 것이다.
이처럼 생성자를 통한 인스턴스 전달방법이 아닌
정적 팩토리 메소드를 통해 인스턴스를 전달하게 되면
먼저 첫번째 장점은 메소드에 이름을 붙일 수 있는 것이다.
알다시피 생성자는 클래스 이름이 들어갈 뿐 명명을 할 수 없다.
위에서는 새로운 인스턴스를 전달해 준다는 의미에서 newInstance로 지었다.
복잡한 클래스에서 어떤 생성자가 어떤 역할을 하는지 잘 알지 못하는 경우
정적 팩토리 메소드로 대체한다면 네이밍으로 인해 사용자를 훨씬 이해하기 쉽게끔 할 수 있다.
두번째는 객체를 생성하지 않을 수 있다는 점이다.
이 방법을 활용한다면 새로운 인스턴스를 전달하는 것 뿐만 아니라 기존에 만들어둔 객체를 활용할 수 있다.
세번째는 sub 타입의 객체도 전달할 수 있다는 점이다.
위 코드를 보면 TV 를 상속받는 Normal Tv와 SmartTV가 있다.
이들의 인스턴스를 TV라는 클래스에서 전달해 준 모습을 확인할 수 있다.
TV의 하위 자료형 객체를 TV라는 클래스에서 직접 전달해 준것이다.
'프로그래밍 > Java' 카테고리의 다른 글
이펙티브 자바 규칙 4 - 객체 생성은 private 생성자로 막자 (0) | 2018.01.27 |
---|---|
이펙티브 자바 규칙 3 - 싱글톤 (0) | 2018.01.27 |
이펙티브 자바 규칙 2 - Builder 패턴 (0) | 2018.01.24 |