[테크 톡 - 7~8주차] 싱글톤 패턴과 정적 클래스

728x90

📌싱글톤 패턴이란?

 

출처 : https://montoo.tistory.com/entry/JAVA-Basic-static-%EC%9D%91%EC%9A%A9-%EC%8B%B1%ED%81%B4%ED%86%A4-%ED%8C%A8%ED%84%B4

  • 어떤 회사의 직원들을 프로그램으로 구현했다고 가정을 하면, 직원은 여러명이므로 여러개의 인스턴스가 필요하지만, 회사는 하나이므로 하나의 인스턴스만 생성한다. 이 때 회사가 싱글톤 패턴이 된다.
  • 이처럼 싱글톤은 객체의 인스턴스가 오직 1개만 생성되는 디자인 패턴을 의미한다.
    → 디자인 패턴 : 프로그램을 설계할때 발생했던 문제점들을 객체 간 상호관계 등을 통해 해결할 수 있도록 하나의 '규약' 형태로 만들어 놓은 것
  • 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
  • 프로그램에서 하나의 객체만 존재해야할 때 , 프로그램 내에서 여러 부분에서 해당 객체를 공유하여 사용 해야 할 때 싱글톤 패턴을 사용한다.



◾ 싱글톤 패턴 구현방법

1. private 생성자만을 정의하여 외부 클래스로부터 인스턴스 생성을 차단한다.

package test;

public class Company {

	private Company() {
    
	}
}

2. 클래스 내부에 멤버 변수로써 private static 유일한 인스턴스를 만든다.

  • 프로그램을 사용하기 위해서는 하나 이상의 인스턴스가 필요하기 때문에
    여기서 만드는 인스턴스는 프로그램 전체에서 사용할 유일한 인스턴스가 되며,
    private로 선언하였기 때문에 외부에서 접근이 불가능하다.
package test;

public class Company {
	
	private Company() {
		
	}
	
	private static Company instance = new Company();
    //유일한 인스턴스, private로 선언
	
}

3. 외부에서 참조 할 수 있는 public 메서드를 만든다

  • 외부에서 쓸 수 있도록 static을 사용한다.
    getInstance()는 인스턴스 생성과 상관없이 호출 할 수 있어야 하기 때문
package test;

public class Company {
	
	private Company() {
		
	}
	
	private static Company instance = new Company();
	
	public static Company getInstance() {
		if(instance == null) {
			instance = new Company();
		}
		return instance;
	}
}

4. 실제로 사용하는 코드 작성

package test;

public class CompanyTest {

	public static void main(String[] args) {
    
		//getInstance()를 호출해 c1, c2에 넣는다.	
		Company c1 = Company.getInstance();
		Company c2 = Company.getInstance();
	
		System.out.println(c1);
		System.out.println(c2);
	}
}



◾ 장점

  • 메모리 낭비 방지 : new 연산자를 통해 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접긴 시 메모리 낭비를 방지한다.
  • 데이터 공유가 쉬움 : 싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용 할 수 있다. but 동시성 문제 발생 가능



◾ 단점

  • 테스트가 어려움 : 인스턴스 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화 시켜줘야함.
  • 클라이언트가 구체 클래스에 의존 : new 키워드를 직접 사용하여 클래스안에서 객체를 생성 → 단일 책임 원칙을 위반



📌정적클래스란?

  • new 키워드를 사용하여 인스턴스를 만들 수 없다.
  • class 키워드 앞에 static 키워드를 선언해서 만든다.
  • 정적 클래스의 모든 멤버는 static으로 선언되어야 함.
  • 정적 클래스는 생성자를 포함 할 수 없다.
  • 정적 클래스는 객체들이 처음 호출될 때 생성되고 프로그램이 종료될 때 해제
    → 정적 클래스는 어디서든 접근 가능하며 전역적으로 접근해야 하는 유틸리티 클래스를 만들 때 유용하게 사용 가능

◾ 정적 클래스 선언 방법

  • static 키워드를 추가적으로 붙여 준다.
  •  

// Outer class
public class Outer {

// Static inner class
public static class Inner {
    
}

}


```java
// Outer class
public class Outer {

    // Instance inner class
    public class InstanceInner {
        private int var1;
        private static int var2;    // 불가 - 컴파일 에러
    }
    
    // Static inner class
    public static class StaticInner {
        private int var1;
        private static int var2;    // 가능
    }
}
  • outer class와 다른 inner class의 instance 멤버에는 접근 할 수 없으며, static 멤버는 접근 제어자가 private여도 접근 할 수 있다.



💌 Reference

 
728x90