Java에서 Singleton 사용

Gyeomii·2022년 6월 21일
0

프로그래밍

목록 보기
2/3
post-thumbnail

📌Singleton 패턴 : 객체(인스턴스)를 한 개만 만들어지게 하는 프로그래밍 방법

- 싱글턴 클래스를 구성하는 방법

  1. 자기 자신 class의 참조변수를 멤버변수로 선언한다.
    ( 이 변수는 private static 으로 지정한다.) //생성자를 만들지 않고 호출할 수 있도록
  2. 생성자를 private으로 한다.
    (외부에서 생성자에 접근을 못하게 하기 위함 즉, 외부에서 new 명령을 사용하지 못하게 하기 위해서)
  3. 객체(인스턴스)는 내부에서 생성해서 이 생성된 객체를 반환하는 메서드를 만든다.
    ( 이 메서드의 이름은 보통 getInstance()로 지정한다. 접근 제어자는 static으로 지정한다.)

📌 java 코드



MySingleton 클래스에서 Singleton패턴으로 인스턴스를 생성하도록 만든 후에

SingletonTest 클래스에서 MySingleton객체를 2개 생성하였다.

생성된 객체의 주소 값을 출력해보면 두 객체가 같은 객체임을 알 수 있다.


📌Singlton 사용 이유

  • 메모리 측면
    최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 뿐만 아니라 이미 생성된 인스턴스를 활용하기 때문에 속도 측면에서도 이점이 있다.

  • 데이터 공유 측면
    다른클래스 간에 데이터 공유가 쉽다. 싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다.
    하지만 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있으니 이 점을 유의해서 설계해야한다.

  • <동시성 문제>
    한 줄의 프로그램 문장이 컴파일러에 의해 기계어로 변경되면서, 이를 기계가 순차적으로 처리하기 위한 여러개의 Machine Instruction이 만들어져 실행되기 때문에 일어나는 현상
    프로그램 언어적으로 i++ 문장은 다음과 같이 기계가 수행하는 명령어로 쪼개진다.

      1. i를 메모리로부터 읽는다.
      2. 읽은 값에 1을 더한다.
      3. 연산한 값을 메모리에 저장한다.
  • 멀티 스레드 환경에서는 한 스레드가 각 기계명령어를 수행하는 동안에 다른 스레드가 개입하여 공유 변수에 접근하여 같은 기계명령어를 수행할 수 있으므로 값이 꼬일 수 있다. 이 때 스레드에 synchronized 또는 atomic을 사용해야 한다.

📌Singleton 문제점

  • 싱글톤 패턴을 구현하는 코드 자체가 많이 필요하다.
  • 테스트하기 어렵다.
  • 클라이언트가 구체 클래스에 의존하게 된다.
  • 자식클래스를 만들 수 없다.

    결과적으로 싱글톤 패턴은 유연성이 많이 떨어지는 패턴이다.


📌결론

싱글톤 패턴은 단독으로 사용한다면 객체지향에 위반되는 사례가 많다.
스프링 컨테이너 같은 프레임워크의 도음을 받으면 싱클톤패턴의 문제점들을 보완하면서 장점의 혜택을 누릴 수 있다.


✨참조

https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
https://steady-coding.tistory.com/554

profile
김성겸

0개의 댓글