개발새발/Spring

220129_스프링입문_디자인패턴_싱글톤패턴_패스트캠퍼스 챌린지 06일차

막동이아빠 2022. 1. 29. 16:20

<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일차 두번째 강의 완료~

필기 & 내 화면 스크린샷 저장

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.