Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[아이템 03] private 생성자나 열거 타입으로 싱글턴임을 보증하라 #3

Closed
102092 opened this issue Sep 10, 2020 · 11 comments
Assignees

Comments

@102092
Copy link
Contributor

102092 commented Sep 10, 2020

No description provided.

@david215
Copy link
Contributor

Serializable 인터페이스를 상속하는 클래스의 객체는 serialize(바이트 스트림으로 변환)해 (1) 파일이나 데이터베이스에 저장하거나 (2) 네트워크를 통해 전송할 수 있고 또 이 바이트 스트림을 deserialize해서 객체를 복원할 수 있습니다. 사실 우리는 일반적으로 (1) Spring Data JDBC나 JPA 등을 사용해 DB에 저장하고 (2) JSON을 만들어서 전송했기 때문에 쓴 적이 없고 앞으로도 쓸 일이 있을지는 잘 모르겠으나? 자바 지식을 확장하는 의미에서 알고가면 좋을 듯 합니다.

잭이 transient keyword나 싱글턴임을 보장하기 위해서는 왜 readResolve() 메소드를 추가해야 하는지 등의 디테일한 부분들에 대해서 간단하게 정리해주시면 좋을 거 같아요.

Serializable Interface
Introduction to Java Serialization

@david215
Copy link
Contributor

마지막으로 Joshua Bloch이 가장 추천하는 enum으로 구현하는 싱글턴을 잘 활용하기 위해서 인터페이스 상속을 enum 클래스에 적용하는 방법 / 예시도 있으면 👍

@guswns1659

This comment has been minimized.

@guswns1659

This comment has been minimized.

@guswns1659
Copy link
Contributor

@david215 enum으로 구현하는 싱글턴 예제는 조금 더 공부해서 정리해보겠습니다!

@102092
Copy link
Contributor Author

102092 commented Sep 18, 2020

리플렉션이 어떤 건지 간단하게나마 개념만 알면 좋을듯 해요.. 이건 advancend한 걸로 생각됩니다.

@guswns1659
Copy link
Contributor

guswns1659 commented Sep 19, 2020

@102092 리플랙션에 대해 간단히 정리해봤습니다. 덕분에 이해할 수 있었네요.

리플랙션 (Reflection)

  • 리플랙션은 자바 언어가 가진 특징이다. 리플랙션은 자바 프로그램이 자기 자신(객체)이나 프로그램 내 속성을 조사,분석하는데 도와주는 기술이다. 예를 들어, 자바 클래스가 클래스 내 멤버 변수에 대한 정보와 해당 멤버 변수를 display(표현?)하게 도와준다.
  • 실용적인 내용으로는 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩(Dynamic Loading)하여 생성자, 멤버 필드, 멤버 메서드 등을 사용할 수 있게 도와준다.
  • 반사, 투영이라는 사전적인 의미를 가지고 있는데 객체(인스턴스)를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 의미한다.

왜 사용할까?

  • 동적로딩에 대한 기술을 지원하니 자바 프로그램을 유연하게 운영할 수 있다. (다형성 등)

주의할 점

  • 외부에 공개되지 않는 private 멤버도 접근과 조작도 가능하니 주의해야 한다. private 멤버는 Field.setAccessible() 메서드를 true로 지정하면 접근이 가능하다고 한다.

참고

@guswns1659
Copy link
Contributor

guswns1659 commented Sep 19, 2020

p.24 public 필드 방식의 큰 장점은 해당 클래스가 싱글턴임이 API에 명백히 드러난다는 것이다.

여기서 API에 명백히 드러난다는 의미는 무엇일까요??? 같이 논의하고 싶습니다.

@guswns1659 상수로 정의되어 있기에 명확하게 싱글턴임을 알 수 있다.

-> public 필드 방식은 메서드를 통하지 않고 .(dot) 연산자로 바로 인스턴스를 가져오니 다른 로직이 추가되지 않고 인스턴스를 가져올 수 있다.

@102092
Copy link
Contributor Author

102092 commented Sep 19, 2020

Q) 싱글턴인지 아닌 지 어떻게 판단하다.

  • Spring 환경에서 왜 제공하는 지 생각해보자
  • Spring에서 Singleton이 중요하다

@102092
Copy link
Contributor Author

102092 commented Sep 19, 2020

Q) 정적 팩터리 방식은 첫번째 장점은 마음이 바뀌면 싱글턴이 아니게 변경할 수 있다??

  • 싱글턴을 보장하지 않도록, new Elvis() 같은 방식으로 변경할 수 있음.
  • Java에서 싱글톤을 보장하려면, enum을 사용하라(이 방식이 익숙하진 않지만 싱글톤을 보장하는 가장 쉬운 방식)
  • Spring에서 제공해주는 여러 어노테이션들..(@Compent, @Bean)을 통해서, 싱글톤을 만들고 이용할 수 있도록 도와주고 있음.

@102092
Copy link
Contributor Author

102092 commented Sep 19, 2020

Q) 왜 직렬화, 역직렬화를 사용할까?

  • 같은 Java 시스템 간에 가장 쉽게 데이터를 통신할 수 있는 방식
  • 언제 사용할까?
    • DB에 영속화 할 때, 이떄 byteStream으로 바꿔서 들어감
    • byteStream -> 직렬화(좀 더 복잡한 방식이 있음) -> DB

@wooody92 wooody92 changed the title [아이템 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라 [아이템 03] private 생성자나 열거 타입으로 싱글턴임을 보증하라 Sep 20, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants