728x90
📌싱글톤 패턴이란?
- 어떤 회사의 직원들을 프로그램으로 구현했다고 가정을 하면, 직원은 여러명이므로 여러개의 인스턴스가 필요하지만, 회사는 하나이므로 하나의 인스턴스만 생성한다. 이 때 회사가 싱글톤 패턴이 된다.
- 이처럼 싱글톤은 객체의 인스턴스가 오직 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
- https://velog.io/@seongwon97/%EC%8B%B1%EA%B8%80%ED%86%A4Singleton-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80
- https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
- https://refactoring.guru/ko/design-patterns/singleton
- 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
- https://readystory.tistory.com/116
- https://kephilab.tistory.com/50
- https://atoz-develop.tistory.com/entry/JAVA-static-class%EC%99%80-Builder-Pattern%EB%B9%8C%EB%8D%94-%ED%8C%A8%ED%84%B4
- https://ssabi.tistory.com/27
728x90
'스터디 > 테크톡' 카테고리의 다른 글
[테크 톡 - 10주차] HTTPS (0) | 2023.08.10 |
---|---|
[테크 톡 - 9주차] 쿠키와 세션 (0) | 2023.08.10 |
[테크 톡 - 6주차] Restful API (0) | 2023.08.10 |
[테크 톡 - 5주차] Spring Security (0) | 2023.08.10 |
[테크 톡 - 3~4주차] 비동기 처리 + AJAX (0) | 2023.08.10 |