싱글톤 패턴이란?

- 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴

- static변수, 메서드를 활용하여 구현할 수 있음

 

** 디자인 패턴?

객체지향 프로그램에서 어떻게 하면 좀 더 효율적으로 객체지향 프로그램을 구현해서 추후 유지보수 하는 데에서 수정이 쉽고(확장성이 좋고) 좀 더 객체지향에 적합하게 코딩을 할 것인가에 대해 여러가지 패턴으로 정리해 놓은 것. 23가지 정도 있음. 그 중 하나가 싱글톤 패턴!

 

ex) 하나의 회사가 있고, 직원이 여러명인 상황

 

- 싱글톤 패턴 코드

1
2
3
4
5
6
7
8
9
10
11
public class Company {
    private static Company instance = new Company();
 
    private Company() {}
 
    // 외부에서 사용할 수 있도록 public으로 getter 생성
    public static Company getInstance() {
        if(instance == null) instance = new Company();
        return instance;
    }
}
cs

 

- 사용하는 코드 : new를 사용하여 인스턴스를 새로 생성하는것이 아니고, static으로 이미 만들어진 인스턴스를 가져가다 쓰는 것. 따라서 클래스를 활용하여 호출하고, 호출된 Company의 주소값은 동일함!(같은것을 가져다가 쓰기 때문)

1
2
3
4
5
public static void main(String[] args) {
    Company company1 = Company.getInstance;
    Company company2 = Company.getInstance;
    // company1 과 company2의 주소값은 동일함!
}
cs

 

 

=> Company는 외부에서 생성할 수 없고, private으로 내부에서 생성되어 있으며, getInstance() 메서드로만 제공되고 있다. 따라서 getInstance()로 내부에서 생성되어있는 Company만 사용할 수 있다. 이것이 싱글톤 패턴이다!

 

유일한 객체를 제공할 때 싱글톤 패턴을 쓴다.

 

대표적인 예로 java.util.Calendar 가 있다. 아래 코드처럼 불러와서 사용한다.

1
Calendar calendar = Calendar.getInstance();
cs

출처 : 패스트캠퍼스

여러 인스턴스에서 공통으로 사용하는 변수를 선언하는 것.

 

공통으로 사용하는 변수가 필요한 경우

- 여러 인스턴스가 공유하는 기준 값이 필요한 경우

- 값을 변경할 수 있음

ex. 학생마다 새로운 학번 생성 - 학번의 기준

ex. 카드회사에서 카드를 새로 발급할때마다 새로운 카드 번호를 부여 - 카드 번호 기준

ex. 회사에 사원이 입사할때마다 새로운 사번이 부여 - 사번 기준

 

staic 변수

- 인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당

  : 따라서 heap 메모리에 올라오지 않음. 프로그램이 메모리에 할당되어 프로세스가 되는 순간 Data영역(static, 상수 라고도 함)에 저장되고, 프로그램이 전부 끝난 후 메모리에서 unload되는 순간 없어짐

- 클래스 변수, 정적변수 라고도 함.

- 인스턴스 생성과 상관없이 사용 가능하므로 클래스 이름으로 직접 참조

 

 

** 짚고 넘어가는 메모리 할당

- java 뿐만 아니라 다른 프로그램 언어도 마찬가지로 프로그램은 보통 아래 세 가지 영역의 메모리를 사용하게 됨

- 힙 메모리 : 동적 메모리, 다 쓰고나면 free, release 시키는 메모리, java는 GC(Garbage Collector)가 알아서 처리해줌

- 스택 메모리 : function이 호출될 때마다 함수(메서드) 안에서 사용하는 지역변수 메모리

- 데이터 영역(constant 영역) 메모리 : 처음 프로그램이 메모리에 load되는 순간부터 할당되어 공유되다가 프로그램이 unload될 때 사라지는 영역

 

 

출처 : 패스트캠퍼스

 

 

this가 하는 일

 

- 인스턴스 자신의 메모리를 가리킴

- 생성자에서 또 다른 생성자를 호출할 때 사용

- 자신의 주소(참조값)을 반환함

 

 

생성된 인스턴스 메모리의 주소를 가짐

- 클래스 내에서 참조변수가 가지는 주소값과 동일한 주소값을 가지는 키워드

1
2
3
4
public static void main(String[] args) {
    BirthDay day = new BirthDay();
    day.setYear(2000);
}
 
1
2
3
public void setYear(int year) {
    this.year = year;
}
cs

 

stack메모리
메서드, 함수가 호출되면 메서드, 함수의 지역변수 메모리 공간은 스택 메모리에 잡히게 된다.

 

heap메모리

객체(인스턴스)가 생성되면 힙 메모리에 잡히게 된다.

나중에 GC(Garbage Collector)에 의해 메모리가 수거됨

 

this가 생성된 인스턴스 힙 메모리의 주소를 가리킴

 

 

생성자에서 다른 생성자를 호출하는 this

자신의 주소를 반환하는 this

 

 

출처 : 패스트캠퍼스

+ Recent posts