일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 데이터베이스
- 패캠챌린지
- 패스트캠퍼스후기
- 자바기초
- 디자인
- js
- 재택근무
- ncs
- java
- 자바
- linux
- DesignPattern
- 스프링
- 한번에끝내는JavaSpring웹개발마스터초격차패키지Online
- String
- 국비
- 자바예제
- DB
- 디자인패턴
- 자바연습문제
- 웹
- 직장인인강
- 직장인자기계발
- javabasic
- Spring
- 자바기본
- 패스트캠퍼스
- java기초
- 리눅스
- 한번에끝내는JavaSpring웹개발마스터초격차패키지Online강의
- Today
- Total
FIF's 코딩팩토리
패스트캠퍼스 챌린지 25일차 본문
static 응용 - 싱글톤 패턴
프로그래밍을 하다보면 단 하나만 존재하는 인스턴스가 존재할 수 있다.
예를들어 회사에 대한 정보를 저장하는 클래스를 생성한다고 가정하면 회사명은 하나만 존재하면 된다.
이렇게 인스턴스가 오직 1개만 생성되야 하는 경우에 사용하는 패턴이다.
싱글턴 패턴을 구현할 때 멀티 스레딩 환경에서도 동작이 가능해야 하기 때문에 Thread-safe가 보장되어야 한다.
static 키워드의 특징을 이용하여 프로그램이 시작하는 시점에서 정적 바인딩을 통해 해당 공유 인스턴스를 메모리에 올려 사용하는 방식이다.
Company.java
static 키워드로 instance 객체를 생성한 후 해당 인스턴스를 가져올 때 마다 static 메서드인 getInstance를 통해 가져오도록 설정한다.
public class Company {
private static Company instance = new Company();
private Company() {
}
public static Company getInstance() { //외부에서 가져오기 위해서 static으로 생성
return instance;
}
}
CompanyTest.java
인스턴스를 가져오고 싶을 경우 직접 호출을 통해 해당 값을 바로 가져올 수 있다.
2개의 객체를 생성하고 인스턴스를 가져올 경우 출력하면 동일한 값이 출력된다.
public class CompanyTest {
public static void main(String[] args) {
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
System.out.println("company1: " + company1);
System.out.println("company2: " + company2);
}
}
Lazy initialization(늦은 초기화 방식)
이른 초기화 방식과 정반대로 클래스가 로드 되는 시점이 아닌 인스턴스가 필요한 시점에 요청할 경우 동적 바인딩을 통해 인스턴스를 생성하는 방식이다. Thread-safe를 만족 시키기 위해서 synchronized 키워드를 사용한다.
사용 전까지 메모리를 차지하지 않는 장점이 있다.
Company.java
public class Company {
private static Company instance;
private Company() {
}
public static synchronized Company getInstance() { //외부에서 가져오기 위해서 static으로 생성
if(instance == null) {
instance = new Company();
}
return instance;
}
}
Lazy Initialization + Double Checking Locking(DCL, Thread-safe)
위 방법은 많은 thread 들이 인스턴스를 호출할 경우 성능 저하가 발생하기 때문에 이를 개선한 방법이다.
이 방식은 인스턴스가 생성되지 않은 경우에만 동기화 블럭이 실행되게끔 구현하는 방식이다.
Comapny.java
volatile 키워드는 멀티스레딩 환경에서 인스턴스 초기화 하는 과정이 올바르게 진행될 수 있도록 설정해 준다.
첫번 째 if문에서 인스턴스가 생성되지 않은 경우 synchronized 블럭에 접근한 후 한번 더 존재 유무를 체크한 후 없는 경우 인스턴스를 생성한다.
이후 재 호출될 경우 인스턴스가 존재하기 때문에 synchronized 블럭에 접근하지 않아 성능 저하를 예방할 수 있다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'패스트캠퍼스 챌린지' 카테고리의 다른 글
패스트캠퍼스 챌린지 27일차 (0) | 2022.02.19 |
---|---|
패스트캠퍼스 챌린지 26일차 (0) | 2022.02.18 |
패스트캠퍼스 챌린지 24일차 (0) | 2022.02.16 |
패스트캠퍼스 챌린지 23일차 (0) | 2022.02.15 |
패스트캠퍼스 챌린지 22일차 (0) | 2022.02.14 |