반응형
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장을 공부하고 정리한 내용입니다 :>
요즘 바빠서 블로깅을 많이 못하였는데,
지금처럼 여유가 있을때 밀린 공부를 하려 합니다:)
우리 모두 개발 화이팅:>
반응형
'Effective Java' 카테고리의 다른 글
Effective Java | Item 6. 불필요한 객체 생성을 피해라 (0) | 2024.05.27 |
---|---|
Effective Java | Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2024.04.23 |
Effective Java | Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. (0) | 2024.03.28 |
Effective Java | Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라. (0) | 2024.03.27 |
Effective Java | Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라. (0) | 2024.03.13 |