Effective Java

Effective Java | Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

이진유진 2024. 4. 23. 15:20
반응형
Effective Java 3/E 판을 읽고 정리한 기록입니다.

클래스의 인스턴스화를 막기 위해 private 생성자를 사용하는 것은 객체 지향 프로그래밍에서 중요한 기술 중에 하나입니다. 

이를 통하여 클래스의 인스턴스화를 외부에서 제어할 수 있고, 불필요한 객체 생성을 방지할 수 있습니다. 

 

클래스의 생성자(constructor)

해당 클래스의 인스턴스를 생성할 때 호출되는 특별한 메서드입니다. 

일반적으로 클래스를 정의할 때 생성자를 public 으로 선언하여 외부에서 접근할 수 있게 합니다. 

그러나 때로는 특정한 이유로 인스턴스 생성을 외부에서 제한할 때가 있습니다. 

 

이럴 때는 private 생성자를 사용합니다. 

 

private 생성자 

클래스 내부에서만 호출할 수 있는 생성자입니다.

외부에서는 작접적으로 인스턴스를 생성할 수 없습니다. 

따라서 클래스를 상속하여 새로운 객체를 만들거나, 정적(static) 메서드를 통해 제공되는 인스턴스를 받아 사용하는 방법을 제공할 수 있습니다. 

 

public class Singleton {
    private static Singleton instance;

    // private 생성자
    private Singleton() {
        // 외부에서 호출할 수 없는 생성자
    }

    // 정적 메서드를 통한 인스턴스 반환
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

 

위의 코드에서 생성자가 private 로 선언 되었기 때문에, Singleton 클래스의 인스턴스를 직접적으로 생성할 수 없습니다. 

대신 getInstance() 메서드를 호출하여 Singleton 클래스의 유일한 인스턴스를 받아올 수 있습니다. 

 

이렇게 함으로써 클래스의 사용자는 항상 동일한 인스턴스를 사용하게 되며, 

여러 인스턴스가 생성되는 것을 방지할 수 있습니다. 

 

이러한 기법은 메모리 사용을 줄일 수 있고, 프로그램의 일관성을 유지하는데 도움을 줍니다. 

 

private 생성자를 사용해 클래스의 인스턴스화를 제어의 

장점

  • 인스턴스 제어 
    • private 생성자를 사용하면 클래스의 인스턴스화를 외부에서 제어할 수 있습니다. 
    • 이를 통해 개발자는 원하는 방식으로 객체를 생성하고, 불필요한 객체 생성을 방지할 수 있습니다. 
  • Singleton 패턴 구현 
    • private 생성자를 사용하여 Singleton 디자인 패턴을 구현할 수 있습니다. 
    • 이는 애플리케이션 내에서 단 하나의 인스턴스만을 유지할 수 있도록 보장하며, 자원 공유나 상태 관리에 유용합니다. 
  • 상수 클래스 
    • private 생성자를 사용하여 모든 멤버가 상수인 클래스를 구현할 수 있습니다. 
    • 이러한 클래스는 주로 상수 값이나 유틸리티 메서드를 제공하며, 인스턴스화할 필요가 없습니다. 
  • 정적 메서드 모음 클래스 
    • private 생성자를 사용하여 정적(static) 메서드만을 가지는 클래스를 만들 수 있습니다. 
    • 이러한 클래스는 주로 여러 유틸리티 메서드를 묶어 관리 시 유용합니다.

단점

  • 상속 불가능
    • private 생성자를 사용하면 하위 클래스에서 해당 클래스를 상속할 수 없습니다. 
    • 이는 상속을 통한 재사용성을 제한할 수 있습니다. 
  • 테스트 어려움
    • private 생성자로 인해 클래스 내부의 로직을 테스트하기 어려울 수 있습니다. 
    • 일부 테스트 프레임워크는 private 멤버에 접근하는 데 제약을 가져, 테스트 코드 작성에 어려움이 있을 수 있습니다.
  • 의도하지 않은 상속 방지
    • private 생성자로 인해 클래스를 상속할 수 없게 되면, 
    • 일부 개발자들이 이를 잘못 이해해 상속을 의도적으로 방지하는 것으로 오인할 수 있습니다. 
  • 디버깅 어려움
    • private 생성자가 있을 경우, 클래스 내부의 객체 생성 과정이 명시적이지 않을 수 있으며, 이는 디버깅을 어렵게 만들 수 있습니다. 

 오늘은 산군 CTO 준혁님이 선물해 주신 이펙티브 자바 4장을 공부하고 정리한 내용입니다 :>
요즘 바빠서 블로깅을 많이 못하였는데,
지금처럼 여유가 있을때 밀린 공부를 하려 합니다:)
우리 모두 개발 화이팅:> 

 

반응형