<2022년 01월 29일 _ 패스트캠퍼스 챌린지 06일차>
[스프링입문_디자인패턴_싱글톤패턴]
1. Singleton pattern
: 어떠한 클래스(객체)가 유일하게 1개만 존재할 때 사용
: 주로 사용하는 곳 --> 서로 자원을 공유하는 경우 : 프린터 등
: 프로그래밍에서는 TCP Socket통신에서 서버와 연결된 connect 객체에 주로 사용
: Spring의 Bean등에서도 주로 사용
-Singleton
-instance
-singleton()
-getInstance()
2. 인텔리제이 실습 _ 따라해보기
(1) New Project > Java , Next 클릭
(2) Create porject from template 체크, Next 클릭
(3)
Project name: design
Base package: com.company.design
Finish 클릭~!
(4) design > src> com.company.design 우측 마우스 클릭
--> New > Package > singleton 입력 후 생성
--> 생성된 com.company.design.singleton 패키지에 자바 클래스명 SocketClient 생성
(5) SocketClient 코드 작성
package com.company.design.singleton;
public class SocketClient {
private static SocketClient socketClient = null;
// 기본default 생성자를 통해 생성할 수 없도록 private으로 막아줌
private SocketClient(){
}
// static 메소드이기 때문에 어디서든 getInstance()에 접근 가능
public static SocketClient getInstance(){
//socketClient == null 일때 socketClient를 할당
if (socketClient == null) {
socketClient = new SocketClient();
}
return socketClient;
}
public void connect(){
System.out.println("connect");
}
}
(6) SocketClient를 사용하는 2개의 class 작성
package com.company.design.singleton;
//각각의 클라이언트가 SocketClient를 가지고 있도록 코딩
public class Aclazz {
private SocketClient socketClient;
public Aclazz(){
//private으로 선언되어 있어 다음과 같이는 불가능
//this.socketClient = new SocketClient();
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient(){
return this.socketClient;
}
}
package com.company.design.singleton;
//각각의 클라이언트가 SocketClient를 가지고 있도록 코딩
public class Bclazz {
private SocketClient socketClient;
public Bclazz(){
//private으로 선언되어 있어 다음과 같이는 불가능
//this.socketClient = new SocketClient();
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient(){
return this.socketClient;
}
}
(7) Main 메소드에서 객체 생성 후 비교해보기
package com.company.design;
import com.company.design.singleton.Aclazz;
import com.company.design.singleton.Bclazz;
import com.company.design.singleton.SocketClient;
public class Main {
public static void main(String[] args) {
// write your code here
//두 클래스가 가지고 있는 socketClient가 동일한 지 확인해보자
Aclazz aclazz = new Aclazz();
Bclazz bclazz = new Bclazz();
SocketClient aClient = aclazz.getSocketClient();
SocketClient bClient = bclazz.getSocketClient();
System.out.println("두개의 객체가 동일한가?");
System.out.println(aClient.equals(bClient));
}
}
두개의 객체가 동일한지의 결과가 true가 나온다! 싱 글 턴!!
(8) 싱글턴이 아닐 경우의 테스트
-->SocketClient의 생성자를 public으로 바꿔준다
package com.company.design.singleton;
public class SocketClient {
private static SocketClient socketClient = null;
// 기본default 생성자를 통해 생성할 수 없도록 private으로 막아줌
/*
private SocketClient(){
}
*/
//싱글턴이 아닐 경우의 테스트
public SocketClient(){
}
// static 메소드이기 때문에 어디서든 getInstance()에 접근 가능
public static SocketClient getInstance(){
//socketClient == null 일때 socketClient를 할당
if (socketClient == null) {
socketClient = new SocketClient();
}
return socketClient;
}
public void connect(){
System.out.println("connect");
}
}
--> Aclazz와 Bclazz도 내용 변경
package com.company.design.singleton;
//각각의 클라이언트가 SocketClient를 가지고 있도록 코딩
public class Aclazz {
private SocketClient socketClient;
public Aclazz(){
//private으로 선언되어 있어 다음과 같이는 불가능
//this.socketClient = new SocketClient();
//this.socketClient = SocketClient.getInstance();
//싱글턴이 아닐 경우의 테스트
this.socketClient = new SocketClient();
}
public SocketClient getSocketClient(){
return this.socketClient;
}
}
package com.company.design.singleton;
//각각의 클라이언트가 SocketClient를 가지고 있도록 코딩
public class Bclazz {
private SocketClient socketClient;
public Bclazz(){
//private으로 선언되어 있어 다음과 같이는 불가능
//this.socketClient = new SocketClient();
//this.socketClient = SocketClient.getInstance();
//싱글턴이 아닐 경우의 테스트
this.socketClient = new SocketClient();
}
public SocketClient getSocketClient(){
return this.socketClient;
}
}
--> Main 메소드에서의 비교 결과값이 false가 된다
package com.company.design;
import com.company.design.singleton.Aclazz;
import com.company.design.singleton.Bclazz;
import com.company.design.singleton.SocketClient;
public class Main {
public static void main(String[] args) {
// write your code here
//두 클래스가 가지고 있는 socketClient가 동일한 지 확인해보자
Aclazz aclazz = new Aclazz();
Bclazz bclazz = new Bclazz();
SocketClient aClient = aclazz.getSocketClient();
SocketClient bClient = bclazz.getSocketClient();
System.out.println("두개의 객체가 동일한가?");
System.out.println(aClient.equals(bClient));
}
}
6일차 두번째 강의 완료~
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'개발새발 > Spring' 카테고리의 다른 글
220130_스프링입문_디자인패턴_프록시패턴_패스트캠퍼스 챌린지 07일차 (0) | 2022.01.30 |
---|---|
220129_스프링입문_디자인패턴_어댑터패턴_패스트캠퍼스 챌린지 06일차 (0) | 2022.01.29 |
220129_스프링입문_디자인패턴_디자인패턴이란_패스트캠퍼스 챌린지 06일차 (0) | 2022.01.29 |
220128_스프링입문_객체지향_POJO JAVA_패스트캠퍼스 챌린지 05일차 (0) | 2022.01.28 |
220127_스프링입문_객체지향_객체지향 설계 5원칙 SOLID_패스트캠퍼스 챌린지 04일차 (0) | 2022.01.27 |