-
Effective Java - 2장. 생성과 파괴(3/3)Computer - Java 2022. 12. 23. 21:22
item 1. 생성자 대신 정적 팩터리 메서드를 고려하라
item 2. 생성자에 매개변수가 많다면 빌더를 고려하라
item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라
item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라
item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
item 6. 불필요한 객체 생성을 피하라
item 7. 다 쓴 객체 참조를 해제하라
item 8. finalizer와 cleaner 사용을 피하라
item 9. try-finally 보다는 try-with-resources를 사용하라
item 7. 다 쓴 객체 참조를 해제하라
가비지 컬렉터를 너무 믿지 말자.
클래스 내에서 직접 메모리 관리를 해야하는 경우 : 임의로 null을 처리하여 가비지 컬렉터를 작동시키자
일반적으로 가장 좋은 방법은 유효 scope 밖으로 밀어내는 것.
WeakHashMap 등 Weak Reference의 개념이 나오는데 이와 관련해서 다음을 살펴보는 것이 좋은 듯.
(메모리에 오래 남아 있음) Strong > Soft > Weak > Phantom (GC가 잘 수거해 나감)
캐시 - 유효 기간을 정확히 정의하기가 어렵기에 일반적으로 시간순으로 가치를 매김 - 관리 잘 하자
==> Scheduled ThreadPoolExecutor / LinkedHAshMap의 removeEldestEntry 등이 관리 예시
리스너/콜백 함수 - weak reference로 지정
==> 콜백 함수를 가리키는 strong reference가 없으면 GC의 수거 대상이 됨.
item 8. finalizer와 cleaner 사용을 피하라
C++의 destructor와는 완전 다름 - 기본적으로 GC가 수거할 때 객체가 소멸되기 때문 - 언제 실행될 지 보장하지 못한다
finalizer, cleaner : 수행 여부조차 보장X - 인스턴스의 자원 회수가 자기 멋대로 지연될 수 있다 - 실제로 현업에서 저자가 OutOfMemoryError를 경험. System.gc, System.runFinalization 등 다른 시스템 지원 함수들도 믿지 말자.
+ 심각한 성능 문제 동반
+ finalizer 공격에 노출되어 심각한 보안 문제 야기 가능 등...
굳이 쓴다면 언제 써야하는가?
(1) close를 쓰지 않을 때를 대비(자원 회수를 늦게 하는 것이 안 하는 것 보다는 나음) - ex. FileInputStream, ThreadPoolExecutor 등
(2) native peer과 연결된 객체
뭔 소리인지 몰라서 조금 더 찾아보니,
A native object is not programmed only in java, but in a platform specific language, typically c or assembler.
(아하!)
쉽게 얘기해서 GC의 영역 밖에 있는 친구들(c나 assembler로 작성된 걸 어떻게 GC가 처리하겠는가)을 잘 처리해주자는 것이다.
솔직히 말하면 있는지조차 몰랐던 기능이다ㅋㅋㅋ정리하자면, 입출력과 관련된 것들 등 close를 반드시 해야 하는 상황에서 예외적, 제한적으로 쓰일 수 있는 것들이라고 생각하면 될 듯하다
item 9. try-finally보다는 try-with-resources를 사용하라
try-finally가 가지는 여러 가지 단점을 설명하면서 try-with-resources 사용을 강력히 권장하고 있다.
굳이 단점들을 적자면,
- 두 개 이상의 파일을 여는 경우 try-finally 구문이 두 번 적힘
- try-finally 구문이 두 번 적히는 경우 두 파일에서 에러가 나더라도 예외는 하나밖에 던지지 못할 수 있다.
try-with-resources의 try 내 괄호에 들어갈 수 있는 조건 - AutoCloseable이 구현되어 있어야 함.
만약 try-with-resources에 쓰고 싶은 객체가 있다면 implements AutoCloseable을 구현해야 함.
짧은 후기
대체적으로 실질적 첫장이라서 그런지 이해 자체는 거의 다 무리없이 한 것 같다
다만 이 내용들이 이해만으로 끝나면 절대로 안 되는 친구들이라 코드를 짜면서 무의식적으로 다 지킨다고 생각할 때 까지 item 제목을 보면서 계속해서 점검해 나가야 할 것 같다.
특히 item 2에서 빌더 사용 시 내부 클래스 사용, item 3에서 enum 선언으로 싱글턴 보장, item 6에서 Wrapper 클래스 사용, item 7에서 strong>soft>weak>phantom은 계속 상기해 나가야 할 것 같다.
'Computer - Java' 카테고리의 다른 글
JPA 객체 사용 시 instanceof 는 주의해서 사용하자 (0) 2024.06.30 Effective Java - 3장. 모든 객체의 공통 메서드(2/2) (0) 2022.12.24 Effective Java - 3장. 모든 객체의 공통 메서드(1/2) (0) 2022.12.24 Effective Java - 2장. 생성과 파괴(2/3) (0) 2022.12.23 Effective Java - 2장. 생성과 파괴(1/3) (0) 2022.12.23