서노썬
sun noes sun
서노썬
전체 방문자
오늘
어제
  • 카테고리 (142)
    • Java (89)
      • Day1 (20)
      • Day2 (16)
      • Day3 (4)
      • Day4 (5)
      • Day5 (2)
      • Day6 (2)
      • Day7 (4)
      • Day8 (6)
      • Day9 (3)
      • Day10 (0)
      • Day11 (0)
      • Day12 (0)
      • Day13 (3)
      • Day14 (0)
      • Day15 (0)
      • Day16 (0)
      • Day19 (0)
      • Day20 (0)
      • Day21 (2)
      • Day22 (4)
      • Day23 (2)
      • Day24 (5)
      • Day25 (4)
      • Day27 (2)
      • Day28 (3)
      • Day29 (1)
      • Day30 (1)
      • Day31 (0)
      • Day32 (0)
      • Dat33 (0)
      • Day34 (0)
      • Day35 (0)
      • Day36 (0)
    • HTML (37)
      • Day36 (20)
      • Day37 (3)
      • Day38 (2)
      • Day39 (8)
      • Day40 (3)
    • SQL (4)
      • Day40 (4)
      • Day41 (0)
      • Day42 (0)
      • Day43 (0)
      • Day44 (0)
      • Day45 (0)
    • JSP (0)
      • Day46 (0)
      • Day75 (0)
    • PYTHON (0)
      • Day75 (0)
      • Day76 (0)
    • Photo (12)

블로그 메뉴

  • 홈
  • 방명록

인기 글

최근 글

태그

  • Java
  • java메뉴입력
  • 논리연산자
  • 자바연산자
  • 자바continue
  • java데이터타입
  • java자료형
  • 자바자료형
  • 자바
  • 자바break

티스토리

hELLO · Designed By 정상우.
서노썬

sun noes sun

Java/Day8

[Java] 싱글턴 패턴 Singleton Pattern

2021. 11. 11. 00:12

1. 싱글턴 패턴 Singleton Pattern

 

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

 

가끔 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있는데 이런 경우 객체를 단 한 개만 생성해야 하기 때문에 싱글턴이라고 한다.

 

(1) 싱글턴 패턴

 

- 싱글턴 패턴을 만들기 위해서는 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 차단해야 한다. 생성자를 호출한만큼 객체가 생성되기 때문이다. 

 

- 생성자를 외부에서 호출할 수 없도록 하려며 생성자 앞에 private 접근 제어 지시자를 붙여주면 된다.

 

- 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화 해준다. (클래스 내부에서는 new 연산자로 생성자 호출이 가능하다.) 정적 필드도 private 접근 지시자를 붙여 외부에서 필드값을 변경하지 못하도록 막아준다.

 

- 외부에서 호출할 수 있는 정적 메소드인  getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다.

 

 

2. 싱글턴 패턴 Singleton Pattern - 예시

 

싱글턴 패턴을 만드는 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
class 클래스명
{
    int num=0;
    private static 클래스명 inst = new 클래스명();
 
    private 클래스명() {}
 
    static 클래스명 getInstance()
    {
        return inst;
    }
}
Colored by Color Scripter
cs

 

외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법이다. getInstance() 메소드는 단 하나의 객체만 리턴하기 때문에 아래 코드에서 변수1과 변수2는 동일한 객체를 참조한다.

 

클래스명 변수1 =  클래스명.getInstance();

클래스명 변수2 =  클래스명.getInstance();

 

 

3. 싱글턴 패턴 Singleton Pattern - 문제

 

(1) 문제

 

SimpleNumber를 오직 인스턴스 하나만 생성되도록 하자.

 

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
class SimpleNumber
{
    int num=0;
    private SimpleNumber() {}    // 생성자 private
 
    public void addNum(int n) { num += n; }
 
    public void showNum() 
    { 
        System.out.println(num); 
    }
    public static SimpleNumber getSimpleNumberInst()
    {
        return new SimpleNumber();
    }
}
 
class OnlyOneINstance
{
    public static void main(String[] args)
    {
        SimpleNumber num1 = SimpleNumber.getSimpleNumberInst();
        num1.addNum(20);
 
        SimpleNumber num2 = SimpleNumber.getSimpleNumberInst();
        num2.addNum(30);
 
        num1.showNum();
        num2.showNum();
    }
}
Colored by Color Scripter
cs

 

(2) 풀이

 

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
class SimpleNumber
{
    int num=0;
    private static SimpleNumber inst = new SimpleNumber();
    
    private SimpleNumber() {}
 
    public void addNum(int n) { num += n; }
 
    public void showNum() 
    { 
        System.out.println(num); 
    }
    public static SimpleNumber getSimpleNumberInst()
    {
        return inst;
    }
}
class OnlyOneINstance
{
    public static void main(String[] args)
    {
        SimpleNumber num1 = SimpleNumber.getSimpleNumberInst();
        num1.addNum(20);
 
        SimpleNumber num2 = SimpleNumber.getSimpleNumberInst();
        num2.addNum(30);
 
        num1.showNum();
        num2.showNum();
    }
}
Colored by Color Scripter
cs

'Java > Day8' 카테고리의 다른 글

[Java] 아스키 코드 ASCII & 유니 코드  (0) 2021.11.12
[Java] Package 패키지 & import java.lang  (0) 2021.11.12
[Java] Java API 도큐먼트 & next와 nextLine  (0) 2021.11.12
[Java] 자바의 정석 Chapter3.연산자 - 연습문제  (0) 2021.11.10
[Java] 자바의 정석 Chapter2.변수 - 연습문제  (0) 2021.11.09
    'Java/Day8' 카테고리의 다른 글
    • [Java] Package 패키지 & import java.lang
    • [Java] Java API 도큐먼트 & next와 nextLine
    • [Java] 자바의 정석 Chapter3.연산자 - 연습문제
    • [Java] 자바의 정석 Chapter2.변수 - 연습문제

    티스토리툴바