Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 프라이빗 생성자(Private Constructor) 구현 방법 완벽 가이드

개요

이 글에서는 Java에서 private 생성자를 구현하는 방법을 알아보겠습니다. private 생성자를 사용하면 특정 클래스의 인스턴스(객체) 생성을 외부에서 제한할 수 있으며, 이는 유틸리티 클래스나 싱글톤(Singleton) 디자인 패턴을 구현할 때 매우 유용하게 활용됩니다.

아래 예제를 통해 실제 동작 방식을 단계별로 살펴보겠습니다.

입력 조건

입력값은 다음과 같습니다.

프로그램 실행

출력 결과

기대되는 출력은 다음과 같습니다.

프라이빗 생성자가 호출되었습니다.

알고리즘

전체 구현 과정은 다음 순서로 진행됩니다.

1단계 - 프로그램을 시작합니다.
2단계 - 'private' 키워드를 사용하여 private 생성자를 정의합니다.
3단계 - 생성자를 private으로 선언하면 해당 클래스의 객체를 외부에서 생성할 수 없습니다.
4단계 - private 생성자는 같은 클래스 내부에 있는 static 메서드와 함께 사용할 수 있습니다.
5단계 - private 생성자는 주로 싱글톤(Singleton) 디자인 패턴에서 활용됩니다.
6단계 - main 메서드에서 print 문으로 static 메서드를 호출합니다.
7단계 - 콘솔에 결과가 출력됩니다.

예제 1: private 생성자 호출하기

아래 예제에서는 private 생성자를 정의하고, 같은 클래스 내부의 static 메서드를 통해 해당 생성자를 호출하는 과정을 보여줍니다. 외부에서 직접 new 키워드로 객체를 생성할 수 없다는 점에 주목하세요.

class PrivateConstructor {
   private PrivateConstructor() {
      System.out.println("프라이빗 생성자가 호출되었습니다.");
   }
   public static void instanceMethod() {
      PrivateConstructor my_object = new PrivateConstructor();
   }
}
public class Main {
   public static void main(String[] args) {
      System.out.println("프라이빗 생성자 호출을 시도합니다");
      PrivateConstructor.instanceMethod();
   }
}

출력 결과

프라이빗 생성자 호출을 시도합니다
프라이빗 생성자가 호출되었습니다.

예제 2: 싱글톤 패턴으로 인스턴스 관리하기

다음 예제에서는 private 생성자와 static 메서드를 조합하여 싱글톤 패턴을 구현합니다. getInstance() 메서드를 여러 번 호출해도 동일한 인스턴스만 반환되는 것을 확인할 수 있습니다.

import java.io.*;
class PrivateConstructor {
    static PrivateConstructor instance = null;
    public int my_input = 10;
    private PrivateConstructor() { }
    static public PrivateConstructor getInstance() {
        if (instance == null)
            instance = new PrivateConstructor();
        return instance;
    }
}
public class Main {
    public static void main(String args[]) {
        PrivateConstructor a = PrivateConstructor.getInstance();
        PrivateConstructor b = PrivateConstructor.getInstance();
        a.my_input = a.my_input + 10;
        System.out.println("프라이빗 생성자 호출을 시도합니다");
        System.out.println("첫 번째 인스턴스의 값 = " + a.my_input);
        System.out.println("두 번째 인스턴스의 값 = " + b.my_input);
    }
}

출력 결과

프라이빗 생성자 호출을 시도합니다
첫 번째 인스턴스의 값 = 20
두 번째 인스턴스의 값 = 20

결과 분석

예제 2의 출력 결과에서 두 참조 변수(a와 b)의 값이 모두 20으로 동일하게 나타납니다. 이는 getInstance() 메서드를 두 번 호출했음에도 실제로는 하나의 객체만 생성되었기 때문입니다. 첫 번째 호출 시에만 private 생성자가 실행되어 객체가 만들어지며, 두 번째 호출부터는 이미 생성된 인스턴스가 그대로 반환됩니다. 따라서 a.my_input 값을 변경하면 같은 객체를 참조하는 b.my_input 값도 함께 변경된 것입니다. 이것이 바로 싱글톤 패턴의 핵심 원리입니다.

마무리: private 생성자의 활용 사례

private 생성자는 클래스 외부에서 임의로 객체가 생성되는 것을 막아야 하는 상황에서 필수적인 도구입니다. 대표적인 활용 사례는 다음과 같습니다.

  • 싱글톤 패턴 - 데이터베이스 연결 관리자처럼 애플리케이션 전체에서 단 하나의 인스턴스만 존재해야 할 때
  • 유틸리티 클래스 - Java의 Math 클래스처럼 static 메서드만 제공하고 인스턴스가 필요 없는 클래스
  • 팩토리 메서드 - 객체 생성 과정을 완전히 통제하고 생성 규칙을 강제하고 싶을 때

private 생성자를 적절히 활용하면 객체 생성에 대한 제어권을 개발자가 완전히 가질 수 있어, 더 안정적이고 예측 가능한 코드를 작성할 수 있습니다.