본문 바로가기

컴퓨터공학/여러가지 정보

싱글톤 패턴이란?

싱글톤 패턴이란?

싱글톤에 대해 위키피디아는 다음과 같이 정의하고 있다.

더보기

소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.

즉, 싱글톤 패턴은 특정 인스턴스가 오직 하나만 존재하도록 보장하는 소프트웨어 설계 패턴이다. 
전역 변수를 사용하지 않고도 해당 객체를 전역적으로 접근 할 수 있게 되며 공유 자원에 대한 
동시 접근을 제어할 수 있다.

싱글톤 패턴을 사용하는 이유는?

고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있고

또한 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 
데이터를 공유하기 쉽다.DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 
상황에서 많이 사용.(쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 
로그 기록 객체등)안드로이드 앱 같은 경우 각 액티비티나 클래스별로 주요 클래스들을 일일이 전달하기가 
번거롭기 때문에 싱글톤 클래스를 만들어 어디서나 접근하도록 설계하는 것이 편하기 때문이다.

싱글톤 패턴의 문제점은?

싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져
 "개방-폐쇄 원칙" 을 위배하게 된다. (=객체 지향 설계 원칙에 어긋남)따라서 수정이 어려워지고 테스트하기 어려워진다.
또한 멀티쓰레드환경에서 동기화처리를 안하면 인스턴스가 두개가 생성된다든지 하는 경우가 발생할 수 있다.

 

싱글톤 패턴 예시

 

싱글톤을 구현하기 위한 방법은 여러가지가 있으나, 주로 쓰는 방식인 inner static class 방식을 예시로 들어보겠다.

 

Student.java

// Student.java
public class Student {
    private static final String NAME = "jdg"; // 싱글톤 패턴 이름
    
    // 정적(inner static) 클래스를 이용한 싱글톤 패턴 구현
    private static class StudentSingletonHolder {
        private static final Student INSTANCE = new Student();
    }
    
    // private 생성자로 외부에서 인스턴스화 방지
    private Student() {}
    
    // 외부에서 접근 가능한 getInstance 메서드를 통해 인스턴스 반환
    public static Student getInstance() {
        return StudentSingletonHolder.INSTANCE;
    }
    
    public String getName() {
        return NAME;
    }
}

Main.java

// Main.java
public class Main {
    public static void main(String[] args) {
        // Student 클래스의 싱글톤 인스턴스를 가져옴
        Student student = Student.getInstance();
        
        // 학생 이름 출력
        System.out.println("Student Name: " + student.getName());
    }
}

 

출력 결과

Student Name: jdg

 

'컴퓨터공학 > 여러가지 정보' 카테고리의 다른 글

람다식(Lambda)이란?  (0) 2024.03.26
프로토콜(Protocol)에 대해 알아보자  (0) 2024.03.15