(Effective Java) 인스턴스 생성 막기

2022. 9. 20. 17:48독서

반응형

인스턴스 생성을 막는다니 무슨말인가?

 

 

인스턴스가 필요 없다니! 

 

 

그런 클래스가 필요해?라는 의문이 든다면

 

 

자바 기본 패키지를 한 번도 까보지 않은 것임이 틀림 없다.

 

 

책에서 소개하는 Collections나 Arrays처럼 인스턴스 생성을 막아놓은 클래스가 존재하기 때문이다.

 

 

🧐 인스턴스 생성을 막는 방법


인스턴스 생성은 어떻게 하면 막을 수 있을까?

 

 

먼저 인스턴스가 어떻게 생성되는지를 알면 쉽다.

 

 

인스턴스를 생성하려면 '생성자'가 필요하다.

 

 

다른 클래스에서 생성자 호출이 가능하려면(최소 같은 패키지)

 

 

생성자가 private이면 안 된다.

 

 

그럼 간단하다.

 

 

생성자를 private으로 만들어버리면 된다.

 

 

아래 코드를 보자.

 

public class Calculator {
    private Calculator() {}
    
    public static int sum(int ...param) {
        int total = 0;
        for(int i = 0; i < param.length; i++) {
            total += param[i];
        }
        return total;
    }
}

 

만약 sum이라는 메서드가 여러 패키지에서 사용되고 있고,

 

 

Calculator에 sum을 포함한 여러 개의 메서드가 있다면

 

 

인스턴스 생성 비용이 클 것이기 때문에

 

 

이렇게 static 메서드로 사용하면서 private 생성자를 통해서 인스턴스 생성을 명시적으로 막는 것이 더욱 효율적이다.

 

 

 

🧐 추상 클래스는?


당연하게도 추상 클래스로 만드는 것은 인스턴스 생성에 아무런 영향을 주지 못한다.

(물론 그 클래스에 대한 인스턴스 생성은 못하겠지만)

 

 

왜냐하면 상속하면 끝이다.

 

 

상위 클래스는 하위 클래스의 인스턴스로 초기화 할 수 있다.

 

List<String> a = new ArrayList<>();

 

 

이게 가능하다.

 

 

그렇기 때문에 추상 클래스로 만드는 것은 인스턴스화를 완전히 막지 못한다.

반응형