본문 바로가기
public void static main()/Book

[Effective Java] 아이템 3

by 햄리뮤 2023. 1. 3.
반응형

이제... 아이템 3.... 미리 공부 해놓자... 

 

[책 규칙]

노란색 - 자세히 알아보고싶은 부분

초록색 - 핵심 개념 (블로그 정리시는 검은색으로!)

빨간색 - 무슨말인지 모르겠는 부분

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

싱글턴 패턴이 궁금하다면! 내 글을 참고! (낄낄)

https://lima1016.tistory.com/93

 

[Design Patterns] Singleton Pattern feat. 백기선 강사님

하루 1강씩이라도 듣자는 의지를 계속 실천하고있따!!!! 할수있다!! 잘한다 잘한다 잘한다 자! 오늘의 복습! 시작! Singleton Pattern이 뭐야? - 인스턴스를 오직 한개만 제공하는 클래스! 개념은 알겠

lima1016.tistory.com

싱글턴이란

  • 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다.
  • 클래스가 초기화될 때 만들어진 인스턴스가 전체 시스템에서 하나뿐임이 보장된다.
    • 예외는, 권한이 있는 클라이언트는 리플랙션 API인 AccessibleObject.setAccessible을 이용해 private 생성자를 호출할 수 있다.
리플랙션(reflection)이란? 힙 영역에 로드된 Class 타입의 객체를 통해, 원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고, 인스턴스의 필드와 메소드를 접근 제어자와 상관 없이 사용할 수 있도록 지원하는 API이다. 여기서 로드된 클래스라고 함은, JVM의 클래스 로더에서 클래스 파일에 대한 로딩을 완료한 후, 해당 클래스의 정보를 담은 Class 타입의 객체를 생성하여 메모리의 힙 영역에 저장해 둔 것을 의미한다. new 키워드를 통해 만드는 객체와는 다른 것임을 유의하자!
규모가 작은 콘솔 단계에서는 개발자가 충분히 컴파일 시점에 프로그램에서 사용될 객체와 의존 관계를 모두 파악할 수 있다. 하지만 프레임워크와 같이 큰 규모의 개발 단계에서는 수많은 객체와 의존 관계를 파악하기 어렵다. 이때 리플렉션을 사용하면 동적으로 클래스를 만들어서 의존 관계를 맺어줄 수 있다!

 

// 리플랙션 사용방법
public class Reflection {
	// 클래스
	Class c = Class.forName("클래스이름");

	// 메소드
	Method[] m = c.getMethods();

	// 필드
	Field[] f = c.getFields();

	// 구조체
	Constructor[] cs = c.getConstructors();
	Class[] inter = c.getInterfaces();
	Class superClass = c.getSuperclass();

}
  • 싱글턴 클래스를 직렬화 하려면 단순히 Serializable을 구현하는 것 만으로는 부족하다. 모든 인스턴스 필드를 일시적(transient)이라고 선언하고 readResolve 메서드를 제공해야 한다. 이렇게 하지 않으면 직렬화된 인스턴스를 역직렬화할 때 마다 새로운 인스턴스가 만들어 진다.
직렬화, 역직렬화?
직렬화란? 메모리를 디스크에 저장하거나, 네트워크 통신에 사용하기 위한 형식으로 변환하는것이다.
역직렬화란? 디스크에 저장한 데이터를 읽거나, 네트워크 통신으로 받은 데이터를 메모리에 쓸 수 있도록 변환하는 것이다.
직렬화가 필요한 이유는? 디스크에 저장하거나 통신할 때 스택에 메모리가 쌓이는 값 형식 데이터만 가능하고, 힙 메모리에 할당되는 참조 형식 데이터는 안된다. 직렬화를 하게 되면 각 주소 값이 가지는 데이터를 전부 모아서 값 형식 데이터로 변환해 준다. 직렬화가 된 데이터는 언어에 따라서 텍스트 또는 바이너리 등의 형태가 되는데, 이러한 형태가 되었을 때 저장하거나 통신할 때 파싱이 가능한 유의미한 데이터가 된다. 즉, 직렬화를 하는 이유는 사용하고 있는 데이터를 파일 저장 혹은 데이터 통신에서 파싱할 수 있는 유의미한 데이터를 만들기 위함이다.
자바에서의 직렬화, 역직렬화?
자바에서의 직렬화란? 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술이다. 그리고 JVM의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술이다.
자바에서의 역직렬화란? 바이트로 변환된 데이터를 다시 객체로 변환하는 기술이고 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 기술이다.

 

 

1. 아이템 개념

  • 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴!

2. 필요한 이유

  • 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다!
  • 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음! 
  • 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다!

3. 아이템 개념의 반대 개념이나 관련 개념

 

4. 실무에서는 어떤식으로 사용되는가 (실제 코드 사용예시)

https://lima1016.tistory.com/65 참고!

5. 장점

  • 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음

6. 단점

  • 싱글톤 인스턴스가 너무 많은  일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙(OCP)"을 위배하게 된다.

 

 

 

 

 

https://steady-coding.tistory.com/576

 

[Java] 직렬화와 역직렬화

java-study에서 스터디를 진행하고 있습니다. 데이터 직렬화와 역직렬화 데이터 직렬화 메모리를 디스크에 저장하거나, 네트워크 통신에 사용하기 위한 형식으로 변환하는 것이다. 데이터 역직렬

steady-coding.tistory.com

https://kingname.tistory.com/164

 

자바 리플렉션 (java reflection) 개념 및 사용법 알아보기

안녕하세요오늘은 자바의 리플렉션이라는 계념에 대해서 알아보겠습니다. 리플렉션 (Reflection)이란? 리플렉션은 구체적인 클래스 타입을 알지 못해서 그 클래스의 메소드와 타입 그리고 변수들

kingname.tistory.com

https://steady-coding.tistory.com/609

 

[Java] Reflection 개념 및 사용 방법

java-study에서 스터디를 진행하고 있습니다. Reflection이란? 리플렉션은 힙 영역에 로드된 Class 타입의 객체를 통해, 원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고, 인스턴스의 필드와 메

steady-coding.tistory.com

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

'public void static main() > Book' 카테고리의 다른 글

[Effective Java] 아이템 15  (0) 2023.01.18
[Effective Java] 아이템 13  (0) 2023.01.10
[Effective Java] 아이템 10 ~ 아이템 11  (0) 2023.01.10
[Effective Java] 아이템 2  (0) 2023.01.03
[Effective Java] 아이템 1  (0) 2023.01.03

댓글