본문 바로가기

IT, 개발/JAVA

JAVA - 싱글톤(Singleton) 패턴 getinstance 사용법 예제

728x90
반응형

 

 

 

 

 

자바에서 프로그램을 개발하다 보면 데이터 관리를 클래스를 통해 하는 경우가 매우 많습니다. 이는 자바의 기본적인 개념으로도 많이 사용되고 있습니다.

 

1. 싱글톤 패턴의 필요성

예를 들어 '회사'라는 클래스를 생성하고 '회사명', '회사 위치' 등 회사의 정보성 데이터를 변수로 생성하고 관리하고자 한다면 

다른 클래스에서 '회사' 클래스에 접근할 때 getter, setter로 접근하여 수정 또는 반환하여 사용합니다.
이럴 경우에 다른 클래스에서 각자 인스턴스를 생성하게 된다면 다른 클래스들끼리 이 '회사'클래스의 정보를 공유하기가 어렵게 되는 문제가 생길 수 있습니다.

 

2. 싱글톤 패턴의 사용 목적

싱글톤 패턴을 사용하는 이유는 정보를 보관하고 공유하고자 하는 클래스(예시의 '회사'클래스)가 한 번의 메모리만 할당하고 그 할당한 메모리에 대해 객체로 관리하기 위함입니다. 
이렇게 되면 여러 클래스에서 각자 '회사'클래스의 생성자를 호출하더라도 처음 한 번 생성된 인스턴스를 반환해주기 때문에 정보 공유 차원에서의 변수 관리 즉 동기화에 용이합니다.

 

 

3. 싱글톤 패턴 사용 예시

3-1) 싱글톤 클래스 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class CompanyInfo 
{
    private static CompanyInfo innstance;
 
    private String companyName;
    private String companyAddr;
    
    
    private CompanyInfo()
    {
    }
    
    public static CompanyInfo getInstance()
    {
        if (innstance == null)
        {
            synchronized(CompanyInfo.class)
            {
                innstance = new CompanyInfo();
            }
        }
        
        return innstance;
    }
    
    
    // getter, setter 
    public String getCompanyName() {
        return companyName;
    }
 
    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
 
    public String getCompanyAddr() {
        return companyAddr;
    }
 
    public void setCompanyAddr(String companyAddr) {
        this.companyAddr = companyAddr;
    }    
}
cs

 

3-1) getInstance 호출 

외부에서 호출 시 new를 사용하지 않고 getInstance를 사용하여 객체를 생성하거나 반환받습니다.

 

CompanyInfo companyInfo = CompanyInfo.getInstance();

 

최초 호출이라면 new CompanyInfo()가 return 되어 사용할 것이고 두 번째 이후부터는 기존에 생성된 instance를 반환받을 것입니다.

 

예시를 보겠습니다.

 

 

반응형

 

  • TestClass1
1
2
3
4
5
6
7
8
9
10
11
public class TestClass1 {
    
    public static void main(String[] args) {
        CompanyInfo companyInfo1 = CompanyInfo.getInstance();
 
        // setter로 접근 
        companyInfo1.setCompanyName("회사명");
        companyInfo1.setCompanyAddr("회사주소");
    }
    
}
cs

 

  • TestClass2
1
2
3
4
5
6
7
8
9
10
11
public class TestClass2 {
    
    public static void main(String[] args) {
        CompanyInfo companyInfo2 = CompanyInfo.getInstance();
        
        // getter로 접근 
        System.out.println"companyName : " + companyInfo2.getCompanyName() );
        System.out.println"companyAddr : " + companyInfo2.getCompanyAddr() );
    }
    
}
cs

 

 

TestClass1에서는 '회사'클래스의 변수에 setter로 접근해서 수정하는 작업만 하고,
TestClass2에서는 '회사'클래스의 변수에 getter로 접근해서 수정된 데이터를 공유할 수 있는지 확인해보도록 하겠습니다.

 

TestClass1 -> TestClass2의 순서가 되도록 실행시키고 콘솔의 결과를 확인해보니 데이터 공유가 잘 되는 것으로 확인됩니다. 

companyName : 회사명
companyAddr : 회사주소

 

테스트해보시면서 다양하게 구성해보시면 더욱 도움이 되실 겁니다. ^^

 

 

 

 

 

728x90
반응형