Java static과 싱글톤, 그리고 그 한계

이건회·2022년 10월 21일
0

자바

목록 보기
4/8
post-custom-banner

공부한 이유

  • 스프링 강의를 들으면서 생성자가 여러번 호출되어도 결국 객체가 하나만 생성되어 이를 공유해 사용하므로 메모리 사용의 이점을 가져오고, 멀티쓰레드 환경에서 Safety를 보장한다고 했다. 그런데 말로만 들어서는 static이랑 별 차이가 없어보여서 정리를 해보려고 한다.

static에 대하여

정의

  • 변수나 메소드에 키워드로 사용하는 개념이다
  • static을 사용한 변수는 클래스가 메모리에 올라갈때 자동으로 생성이 되므로 인스턴스를 생성할 필요없이 바로 쓸 수 있다

static을 쓰는 이유

  • 변하지 않는 일정 값 혹은 설정 정보처럼, 공용으로 쓸 수 있는 자원에 대해 매번 메모리에 로딩하거나 값을 읽어들일 필요가 없으므로 그만큼 비용과 효율성 측면에서 높다
  • 즉 프로그램 내에서 공통으로 사용하는 데이터를 관리할 때 용이하다.
  • 반대로 생각하면 static은 남발해서는 안되고 공통의 값을 유지하는 경우에만 사용한다.

싱글톤 패턴

정의

싱글톤은 static을 응용한 것인데, 프로그램 내에서 단 하나의 객체를 생성하도록 강제하는 패턴이다. 클래스 내부에 private static으로 유일한 인스턴스를 생성하고, 생성자를 private으로 막아놓아 외부에서 생성할 수가 없게 한다. 이후 값을 참조하는 메소드를 public으로 만들어 static 인스턴스를 반환해 쓸 수 있도록 한다.

그런데 여기까지 보면 싱글톤이 없는 static과 명확한 차이점이 두드러지지 않는다

싱글톤을 구현하지 않은 static과의 차이점

  • 객체의 생성 시점에 대하여 -> static은 프로그램 실행 시점 시에 초기화된다. 그러나 싱글톤은 인스턴스 변수를 처음 가져오는 시점에 객체가 만들어지므로 객체의 생성을 제어하여 지연 로딩이 가능하므로 메모리의 이점을 가져올 수 있다(지연 로딩의 이점 : https://zzang9ha.tistory.com/347)
  • 싱글톤은 인터페이스 구현이 가능하므로 더 유연한 설계가 가능하다

Java Static 싱글톤의 문제점

  • 생성자가 private 이므로 상속을 통해 다형성을 적용할 수가 없다.
  • 데이터의 공유가 높아져 싱글톤 인스턴스가 많은 일을 하면 결합도가 높아져 테스트가 어렵다
  • 멀티 쓰레드 환경에서 동기화 처리를 제대로 안하면 인스턴스가 1개보다 더 생성될 수 있다. Thread Safety가 떨어짐
  • 결국 전역 상태가 만들어져 아무 객체에서나 자유롭게 접근하도록 해버리면 객체지향이 위반된다.

해결

이러한 단점을 해결하기 위해서 Spring에서는 싱글톤을 클래스로더가 아닌 싱글톤 컨테이너를 활용해 관리한다(Java의 싱글톤 관리주체는 클래스 로더, Spring의 싱글톤 관리 주체는 싱글톤 컨테이너). 스프링 컨테이너의 싱글톤 관리에 대한 내용은 다음 글에서 포스팅 하겠다.

참고

https://ifcontinue.tistory.com/2?category=695943

https://velog.io/@kekim20/JAVA-static-%EB%B3%80%EC%88%98%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C-static-%EC%9D%91%EC%9A%A9-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4

https://junroot.github.io/programming/%EC%8B%B1%EA%B8%80%ED%84%B4-%ED%8C%A8%ED%84%B4%EA%B3%BC-%EC%8A%A4%ED%83%9C%ED%8B%B1-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4/#%EA%B7%B8%EB%9F%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B5%AC%ED%98%84%ED%95%98%EB%9D%BC%EA%B3%A0

https://100100e.tistory.com/339

https://os94.tistory.com/158

https://enterkey.tistory.com/300

https://judekim.tistory.com/91

https://ksr930.tistory.com/274

https://mangkyu.tistory.com/153

https://gem1n1.tistory.com/96

profile
하마드
post-custom-banner

0개의 댓글