ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [이펙티브 자바] 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라
    개발 공부/자바 2022. 1. 13. 00:32

    개념

    정적 변수는 프로그램이 종료되기 전까지 메모리가 유지되는 변수이다.

    정적 팩터리 메서드는 팩토리 패턴에서 유래한 단어로 객체 생성의 역할을 분리해주는 메서드이다.

    장점

    1. 이름을 가질 수 있다

    생성자는 클래스의 이름을 따르기 때문에 메서드를 사용하여 이름을 지을 수 있다는 장점이 있다. 또한 이름을 가질 수 없기 때문에 생성자는 똑같은 타입을 2개 만들 수 없는 단점도 가지고 있다.

    다음을 보면 정적 팩터리 메서드는 이름을 각각 다르게 지어 똑같은 타입을 받을 수 있다는 것을 알 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class Main {
     
        public Main(int number){
            this.number = number;
        }
        public Main(int index){
            this.index = index;
        }
     
        public static Main getNumber(int number){
            return new Main(number);
        }
        public static Main getIndex(int index){
            return new Main(index);
        }
     
        public static void main(String[] args) {
            Main main = new Main(1);
            Main number = getNumber(1);
            Main index = getIndex(1);
        }
    }
     
    cs

     

    2. 호출될 때 마다 인스턴스를 생성하지 않아도 된다

    생성자는 항상 인스턴스를 생성해야 하지만 정적 팩터리 메서드는 다시 호출될 때 메모리에 남아있는 인스턴스를 사용하기 때문에 생성할 필요가 없다.

    다음과 같은 경우에도 결과가 정해져 있기 때문에 생성자를 써서 인스턴스를 다시 만들 필요가 없다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Main {
     
        public int Main(){
            return 1;
        }
     
        public static int getNumber(){
            return 1;
        }
     
        public static void main(String[] args) {
            new Main();
            new Main();
            getNumber();
            getNumber();
        }
    }
     
    cs

     

    3. 반환 타입의 하위 타입 객체를 반환할 수 있다

    다음과 같은 경우 하위 클래스를 생성자로 리턴하는 것은 불가능하지만 정적 팩터리 메서드로 리턴하는 것은 가능하다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class Calculator {
     
        public Calculator(){
            return new add();
        }
     
        public static add add(add number){
            return new add();
        }
     
        public static void main(String[] args) {
        }
    }
    public class add extends Calculator {
        private int number;
    };
    cs

     

    4. 입력 매개변수에 따라 매 번 다른 클래스의 객체를 반환할 수 있다

    반환 타입의 하위 타입이기만 하면 어떤 클래스의 객체를 반환해도 상관없다. 그래서 클라이언트는 어떤 객체가 들어오든 알 필요가 없기 때문에 인터페이스 기반의 구현을 할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Calculator {
     
        public static add add(add number){
            return new add();
        }
     
        public static equal eq(equal number){
            return new equal();
        }
     
        public static void main(String[] args) {
        }
    }
    public class add extends Calculator {
    };
     
    public class equal extends Calculator {
    };
    cs

     

    5. 정적 팩터리 메서드를 작성할 때 반환할 객체의 클래스가 존재하지 않아도 된다

    객체의 클래스를 얼마든지 나중에 만들 수 있고 프로그램이 실행될 때 가져올 수도 있다.

    단점

    1. 정적 팩터리 메서드만으로는 하위 클래스를 만들 수 없다

    상속보다 컴포지션 사용을 유도하기 때문에 장점이 될 수도 있는 단점이다.  상속은 하위 클래스가 상위 클래스에 의존하기 때문에 좋지 않다.

    • 컴포지션 - 다른 객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 메서드로 호출하는 기법

     

    2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다

    생성자는 상단에 JavaDoc를 다뤄주지만 정적 팩터리 메서드는 특별히 다뤄주지 않기 때문에 클래스나 인터페이스 문서 상단에 정적 팩터리 메서드 문서를 제공해야 한다.

     


    참고

     

    https://book.naver.com/bookdb/book_detail.nhn?bid=14097515

     

    이펙티브 자바

    자바 플랫폼 모범 사례 완벽 가이드 - JAVA 7, 8, 9 대응자바 6 출시 직후 출간된 『이펙티브 자바 2판』 이후로 자바는 커다란 변화를 겪었다. 그래서 졸트상에 빛나는 이 책도 자바 언어와 라이브

    book.naver.com

    https://www.youtube.com/watch?v=X7RXP6EI-5E - 백기선님 강의

Designed by Tistory.