22.5.13 [HackerRank]Java Singleton Pattern

서태욱·2022년 5월 13일
0

Algorithm

목록 보기
44/45
post-thumbnail

✅ 문제 분석

문제에 주어진 싱글톤 클래스를 완성해야 한다.
다음 항목들을 포함해야 한다.
1. 매개변수화 되지 않은 비공개 싱글톤 생성자
2. 변수명 str인 public string 인스턴스
3. getSingleInstance 이름으로 정적 메소드를 작성하고,
싱글톤 클래스의 단일 인스턴스를 반환하도록 한다.

여기서 입,출력은 없고 제출하면 숨겨진 Solution 클래스가
문자열을 입력받아 싱글톤 클래스를 사용해 샘플이 출력되는지를 확인한다.

🌱 배경지식

싱글톤 패턴

클래스의 인스턴스화를 하나의 개체로 제한하는 디자인 패턴이다.
시스템 전체에서 작업을 조정하기 위해 정확히 하나의 객체가 필요할 때 유용하다. 예를 들면 회사에 대한 정보를 저장하는 클래스를 생성할 때, 회사명은 하나만 존재하면 된다. 이럴 때 싱글톤 패턴을 사용할 수 있다.

어떤 클래스가 최초 한번만 메모리를 할당(Static)하고, 그 메모리에 객체를 만들어 사용하는 디자인 패턴이다. 생성자 호출이 반복적으로 이루어져도 실제로 생성되는 객체는 최초 생성된 객체를 반환한다.

한번의 객체 생성으로 재사용이 가능하기 때문에 메모리 낭비를 방지할 수 있다. 이미 생성된 인스턴스를 활용하기 때문에 속도 측면에서도 이점이 있다. 또 싱글톤으로 생성된 객체는 한번 생성되면 무조건 전역성을 띄므로 다른 객체와 공유하기 용이하다.

아래 예시에서는 객체를 미리 생성하고 가져오는, 단순하고 안전한 방법으로 싱글톤 패턴을 구현하고 있다. static 키워드로 instance 객체를 생성한 후 해당 인스턴스를 가져올 때마다 static 메소드인 getInstance()를 통해 가져오도록 설정하는 것이다.

public class Singleton {

    private static Singleton instance = new Singleton();
     // 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
    private Singleton() {
       
    }
	// 이부분은 외부에서 getinstance()메소드를 사용해 가져오기 위해서 static으로 생성한다.
    public static Singleton getInstance() {
        return instance;
    }
}

인스턴스를 가져오고 싶으면 직접 호출을 통해 해당 값을 바로 가져올 수 있다. 2개의 객체를 생성하고 인스턴스를 가져올 경우 출력하면 동일한 값이 출력된다.

public class SingleTest{
	public static void main(String[] args){
    	Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        
        System.out.println("singleton1: " + singleton1);
        System.out.println("singleton2: " + singleton2);
    }
}

//출력 결과

✏️ 해설

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
import java.lang.reflect.*;


class Singleton{
	//인스턴스, instance라는 전역 변수를 선언할 때 static을 주어 인스턴스화 하지 않고 사용할 수 있지만, 
    //접근 제한자가 private이므로 직접적인 접근은 불가하다.
    // 생성자를 외부에서 호출할 수 없도록 지정한 것.
	private static Singleton instance = new Singleton();
    private Singleton() {} 
    //기본 생성자를 private으로 사용해 new를 통한 생성을 막고, getInstance 메소드를 통해서만 생성하도록 한다.
    
    public String str; // 
    public static Singleton getSingleInstance() { 
    // getSingleInstance 메소드를 통해서만 해당 인스턴스를 얻을 수 있고, 인스턴스는 한개 이상 생성 불가하다.
        return instance;
    }
}

👉 참고

profile
re:START

0개의 댓글