1382 단어
7 분
[ OOP ] static, singleton, nested class

Static, Singleton, 그리고 내포 클래스#

프로그래밍에서 종종 헷갈릴 수 있는 개념 중 하나가 바로 static싱글턴 패턴(Singleton)이다. 둘 다 인스턴스 관리를 어떻게 할지에 대한 고민에서 나왔고, 어느 정도 유사한 부분도 있지만, 근본적으로 다른 점들이 있다.

싱글턴 패턴#

// 싱글턴 패턴 구현 예시
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // private constructor to prevent instantiation
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

싱글턴 패턴은 말 그대로 한 클래스에서 오직 하나의 인스턴스만 만들도록 제한하는 패턴이다. 프로그램 내에서 단 하나의 인스턴스만 필요하거나, 그 인스턴스에 전역적으로 접근해야 할 때 많이 사용한다. 대표적인 예로 프로그램 설정 정보나 파일 시스템 관리 객체가 있다. 왜냐하면, 이러한 요소들은 중복으로 생성되면 안 되는, 프로그램 전체에서 유일하게 관리되어야 하는 자원이기 때문이다.

어떤 경우에 싱글턴을 사용할까?

  1. 프로그램 실행 중에 오직 하나의 인스턴스만 있어야 할 때
    • 예를 들어, 로그 관리 시스템은 여러 개의 인스턴스가 존재하면 충돌이 발생할 수 있다.
  2. 그 인스턴스에 전역적으로 접근할 필요가 있을 때
    • 이 말은 객체가 모든 곳에서 접근 가능해야 한다는 뜻이다. 싱글턴으로 만들어진 인스턴스는 보통 전역적으로 접근 가능하도록 설계된다.

static과 싱글턴의 차이#

많은 사람들이 static 키워드만으로 싱글턴의 역할을 할 수 있지 않냐고 묻곤 한다. 하지만 실제로는 둘 사이에는 꽤 중요한 차이점들이 존재한다.

static으로 못하는 일

  1. 다형성을 사용할 수 없다.
    static 메서드는 정적(static) 바인딩이 되기 때문에 다형성(polymorphism)을 구현할 수 없다. 반면 싱글턴은 클래스로 구현되기 때문에 다형성을 지원한다.
  2. **멀티턴(multiton)**으로 바꿀 수 없다.
    싱글턴은 기본적으로 하나의 인스턴스만 허용하지만, 이를 수정해 여러 개의 인스턴스를 허용하는 멀티턴 패턴으로 변형이 가능하다. 반면 static은 한 번 정의하면 유연하게 변형하기 어렵다.
  3. 객체의 생성 시점을 제어할 수 없다.
    static 멤버는 프로그램이 실행될 때 자동으로 초기화되지만, 싱글턴은 getInstance() 메서드를 호출할 때 인스턴스가 만들어진다. 즉, 싱글턴은 조금 더 유연하게 객체의 생성 시점을 관리할 수 있다.

싱글턴 객체의 생성 시점과 순서#

싱글턴 패턴의 인스턴스는 처음 getInstance()가 호출될 때 생성된다. 이 방법은 객체의 메모리 사용을 최적화하고, 실제로 필요할 때까지 인스턴스를 생성하지 않는 점에서 유리하다.

하지만 여러 개의 싱글턴을 사용하는 상황에서는 그 객체들이 초기화되는 순서가 중요할 수 있다. 예를 들어, 외부 API와 연결하는 경우 B, C, A 순으로 초기화해야만 제대로 동작할 수 있는 상황이 있다고 가정해보자. 이런 경우, 단순히 무작위로 초기화되면 문제가 발생할 수 있다. 그래서 실무에서는 종종 프로그램 시작 시 여러 싱글턴의 getInstance()를 특정 순서대로 호출하는 방식으로 초기화 순서를 보장한다.

B.getInstance();
C.getInstance();
A.getInstance();

내포 클래스 (Nested Classes)#

// 내포 클래스 구현 예시
public class OuterClass {
    private String outerField = "Outer Field";

    public class InnerClass {
        public void display() {
            System.out.println("Accessing: " + outerField);
        }
    }
}

내포 클래스는 말 그대로 클래스 안에 클래스를 정의하는 것이다. 이걸 왜 쓰냐고 물어볼 수도 있지만, 꽤 유용한 상황이 많다. 내포 클래스를 사용하면 서로 밀접하게 연관된 클래스들을 하나로 묶을 수 있다. 물론 패키지로도 그룹화할 수 있지만, 내포 클래스는 더욱 긴밀한 관계를 표현할 수 있다.

내포 클래스의 특징

  1. 바깥 클래스의 private 멤버에 접근 가능
    내포 클래스는 바깥 클래스의 모든 멤버에 접근할 수 있다. 이는 private 멤버도 포함된다. 반대로, 바깥 클래스는 내포 클래스의 멤버에 접근할 수 없다. 이 특징은 바깥 클래스가 내포 클래스의 내부 구조를 직접적으로 다루지 않도록 보호해주는 역할을 한다.

내포 클래스는 보통 바깥 클래스와 굉장히 밀접한 연관성을 가지는 경우에 쓰인다. 예를 들어, 어떤 클래스가 특정 데이터 구조나 알고리즘을 처리하는데 필요한 보조 역할을 하는 클래스를 내포시킬 수 있다.




출처

  • 개체지향 프로그래밍 및 설계 - 유데미 강의
[ OOP ] static, singleton, nested class
https://blog-full-of-desire-v3.vercel.app/posts/oop/-oop--static-singleton-nested-class/
저자
SpeculatingWook
게시일
2024-10-17
라이선스
CC BY-NC-SA 4.0