목차

    싱글톤 패턴이란?

    인스턴스를 오직 한개만 제공하는 클래스

    • 시스템 런타임, 환경 세팅에 대한 정보 등, 인스턴스가 여러개 일 때 문제가 생길 수 있는 경우가 있다. 인스턴스를 오직 한개만 만들어 제공하는 클래스가 필요하다.

    이른 초기화

    synchronzied

    double checked locking (복잡)

    static inner 클래스 (가장권장)

    자바와 스프링에서 찾아보는 패턴

    자바

    runtime 메서드는 자바에서 제공하는 라이브러리이며 자바에서 지금 동작하는 환경의 정보를 담고있다. 하기와 같이 Runtime은 new로 생성이 불가능하다. 즉, 싱글톤 패턴으로 구현되어있는 것을 확인할 수 있다. 

    Spring

    bean이라는 스코프에서 관리하고 있기 때문에 hello == hello2 는 true를 반환한다.

    엄밀히 따지면 싱글톤  패턴이 쓰인 것은 아니지만 싱글톤 소코프를 사용한 케이스이다.

     

     

     

     

     

    싱글톤 패턴은 어떻게 쓰이나?

    • 스프링에서 빈의 스코프 중에 하나로 싱글톤 스코프
    • 자바 Java.lang.Runtime
    • 다른 디자인 패턴(빌더, 퍼사드, 추상 팩토리 등) 구현체의 일부로 쓰이기도 한다.

     

    'Java > *****디자인패턴' 카테고리의 다른 글

    [싱글톤 패턴] Spring에서 싱글톤을 사용하는 이유  (0) 2022.05.05
    퍼사드(Facade) 패턴  (0) 2022.04.03
    빌더 패턴  (0) 2022.04.01
    디자인 패턴  (0) 2022.03.31
    디자인 패턴 싱글톤 패턴 개념 정리  (0) 2022.03.18

    객체 생성 관련 디자인 패턴

     
    패턴 종류 비고
    싱글톤 패턴 spring에서의 싱글톤
    팩토리 메서드 패턴  
    추상 팩토리 패턴  
    빌더 패턴  
    프로토 타입 패턴  

    구조 관련 디자인 패턴

    패턴 종류 비고
    어댑터 패턴  
    브릿지 패턴  
    컴포짓 패턴  
    데코레이터 패턴  
    퍼사드 패턴  
    플라이웨이트 패턴  
    프록시 패턴  

    행동 관련 디자인 패턴

    패턴 종류 비고
    책임 연쇄 패턴  
    커맨드 패턴  
    인터프리터 패턴  
    이터레이터 패턴  
    중재자 패턴  
    옵저버 패턴  
    상태 패턴  
    전략 패턴  
    템플릿 메서드 패턴  
    비지터 패턴  

    목차

      싱글톤 패턴

      • 두 가지 화면이 존재한다. 두 가지 화면은 같은 어플이다. 그럴 경우 setting을 관리하는 객체는 반드시 같은 것을 사용해야 한다는 것이다. 

       설명
      • 두 가지 페이지가 있다고 가정하자. FirstPage(우상단), SecondPage(좌하단)
      • Setting(우하단)은 darkMode 셋팅, fontSize 셋팅, 각각의 세팅 값 출력(Get), 각각의 세팅 값 변경(set)을 담당하는 Setting 클래스 이다.
      • FirstFage(우상단)은 첫 번째 페이지이며 setAndPrintSettings라는 메서드를 통해 DarkMode = true, FontSize = 15로 셋팅해 주었다.
      • SecondFage(좌하단)은 printSetting을 통해 DarkMode 여부와 FontSize를 출력한다. 
      • 결과론적으로 첫 페이지와 두번째 페이지는 셋팅값이 다르다. (첫 번째 페이지는 수정된 값, 두 번째 페이지는 기본 값)
      • 따라서 각각의 페이지는 생긴모양이 다르지만, Settings(우하단)의 세팅정보로 통일화(=싱글톤패턴) 하려고한다.
      싱글톤 패턴

      • 맨위에 생성자를 Private로 선언한다. 그렇다면 다른 클래스에서 new를 통해 Settings를 생성하지 못한다. 
      • 그 이후 Settings를 static으로 선언한다.
      • getSettings를 만든다. 만약 setting값이 null이면 new를 해주며 없다면 settings값을 바로 return 해준다.
      • new를 매번 진행하지 않므르로 결과적으로 FirstFage와 SecondFage의 DarkMode, FontSize값은 그대로 유지된다.

      정적변수 vs 동적변수

      FirstFage & SecondFage 페이지 각각 변경

      더보기

      new가 아닌 getsetting을 해줌.

      싱글톤 패턴의 단점

      • 멀티 쓰레드 환경에서 오류가 발생할 소지가 있다.
        • 안전하게 사용하는 방법 : 따로 공부하기.

       

      'Java > *****디자인패턴' 카테고리의 다른 글

      [싱글톤 패턴] Spring에서 싱글톤을 사용하는 이유  (0) 2022.05.05
      퍼사드(Facade) 패턴  (0) 2022.04.03
      빌더 패턴  (0) 2022.04.01
      싱글톤 (Singleton) 패턴  (0) 2022.04.01
      디자인 패턴  (0) 2022.03.31
      생성자 대신 정적 팩터리 메서드를 고려하라

      클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다. 하지만 모든 프로그래머가 꼭 알아둬야 할 기법이 하나 더 있다. 클래스는 생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있다. 

      //해당 메서드는 기본 타입인 boolean 값을 받아 Boolean 객체 참조로 변환해준다.
      public static Boolean valueOf(boolean b){
      	return b ? Boolean.TRUE : Boolean.FALSE
      }

      위의 코드는 boolean 기본 타입의 박싱 클래스(boxed class)인 Boolean에서 발췌한 간단한 예이다.

       

      정적 팩터리 메서드가 생성자 보다 좋은 장점

      1. 이름을 가질수 있다.
      2. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.
      3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
      4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
      5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

      정적 팩토리 메서드의 단점

      1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
      2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.
      핵심정리
      정적 팩터리 메서드와 public 생성자는 각자의 쓰임새가 있으니 상대적인 장단점을 이해하고 사용하는 것이 좋다. 그렇다고 하더라도 정적 팩터리를 사용하는 게 유리한 경우가 더 많으므로 무작정 public 생성자를 제공하던 습관이 있다면 고치자.

       

      'Java > 이펙티브 Java' 카테고리의 다른 글

      [Effective Java] 목차  (0) 2021.12.23

      test

      'Java > 이펙티브 Java' 카테고리의 다른 글

      [EffectiveJava] 2장 객체 생성과 파괴  (0) 2021.12.23
      자바의 자료형
      자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어집니다. 대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고 참조 타입은 class, interface 등이 있다.
      래퍼클래스
      프로그래밍을 하다보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있습니다. 이럴 때 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 합니다. 
      자바는 모든 기본타입은 값을 갖는 객체로 생성할 수 있습니다. 이런 객체를 포장 객체라고 하는데 그 이유는 기본 타입의 값을 내부로 두고 포장하기 때문입니다. 래퍼 클래스로 감싸고 있는 기본 타입의 값은 외부에서 변경할수 없습니다.
      기본타입(primitive type) 래퍼 클래스(wrapper class)
      byte Byte
      char Character
      int Integer
      float Float
      double Double
      log Long
      public class Wrapper_Ex
      	public static void main(String[] args){
          	Integer num = new Integer(17); //박싱
              int n = num.IntValue(); //언박싱
              System.out.println(n);
          }
      }
      
      //자동 박싱(AutoBoxing), 자동 언박싱(AutoUnBoxing)
      public class Wrapper_Ex
      	public static void main(String[] args){
          	Integer num = 17;
              int n = num;
          }
      }
      
      //래퍼클래스 사용 예제
      public class Wrapper_Ex {
          public static void main(String[] args)  {
              String str = "10";
              String str2 = "10.5";
              String str3 = "true";
              
              byte b = Byte.parseByte(str);
              int i = Integer.parseInt(str);
              short s = Short.parseShort(str);
              long l = Long.parseLong(str);
              float f = Float.parseFloat(str2);
              double d = Double.parseDouble(str2);
              boolean bool = Boolean.parseBoolean(str3);
      		
              System.out.println("문자열 byte값 변환 : "+b);
              System.out.println("문자열 int값 변환 : "+i);
              System.out.println("문자열 short값 변환 : "+s);
              System.out.println("문자열 long값 변환 : "+l);
              System.out.println("문자열 float값 변환 : "+f);
              System.out.println("문자열 double값 변환 : "+d);
              System.out.println("문자열 boolean값 변환 : "+bool);
          }
      }

      값 비교

      public class Wrapper_Ex {
          public static void main(String[] args)  {
              Integer num = new Integer(10); //래퍼 클래스1
              Integer num2 = new Integer(10); //래퍼 클래스2
              int i = 10; //기본타입
      		 
              System.out.println("래퍼클래스 == 기본타입 : "+(num == i)); //true
              System.out.println("래퍼클래스.equals(기본타입) : "+num.equals(i)); //true
              System.out.println("래퍼클래스 == 래퍼클래스 : "+(num == num2)); //false
              System.out.println("래퍼클래스.equals(래퍼클래스) : "+num.equals(num2)); //true
          }
      }
      • 래퍼클래스 == 기본타입 : true
      • 래퍼클래스.equals(기본타입) : true
      • 래퍼클래스 == 래퍼클래스 : false
      • 래퍼클래스.equals(래퍼클래스) : true

      래퍼클래스 끼리 비교할때는 equals를 써야한다.

      'Java' 카테고리의 다른 글

      [Java] Java 8 에서의 변경사항  (0) 2022.05.05
      추상클래스 vs 인터페이스  (0) 2022.04.07
      GC (Garbage Collector)  (0) 2022.04.06
      Java & Spring 버전 특징 정리  (0) 2022.04.04
      IntelliJ IDEA 단축키  (0) 2021.01.28

      ALT  + ENTER 

      인텐션 액션 (=자동완성 기능)으로 사용한다, 또한 코드에서 오류가 발견된 경우 해당 오류 위에서 ALT+ENTER를 누르면 문제 수정제안 목록이 표시된다.

       

      ALT + 1

      해당 소으의 도구 창을 열어 해당 소스를 표시한다.

      --> ESC 누르면 다시 돌아온다.

       

      CTRL + E

      최근 실행했던 파일들을 확인 가능하다.

       

      CTRL + B 

      선언으로 이동하는 단축키, 구현 부분으로 이동한다.

       

      CTRL + SHIFT + F

      전체 프로젝트에서 특정 키워드 검색

       

      SHIFT + SHIFT

      전체 프로젝트에서 소스코드 이름으로 검색 

      'Java' 카테고리의 다른 글

      [Java] Java 8 에서의 변경사항  (0) 2022.05.05
      추상클래스 vs 인터페이스  (0) 2022.04.07
      GC (Garbage Collector)  (0) 2022.04.06
      Java & Spring 버전 특징 정리  (0) 2022.04.04
      객체의 래퍼클래스(WrapperClass)  (0) 2021.09.16

      + Recent posts