꾸준한 스터디
article thumbnail
[Item 8] finalizer와 cleaner 사용을 피하라
Effective Java/정리 2023. 1. 17. 19:22

결론적으로 두 방법을 사용하지 말라고 권장되고 있다. finalizer란 Finalizer 클래스가 있지만 document에서도 안나오고.. 사용하는 방법은 Object 클래스에 정의된 finalize 메서드를 사용하는 것. 메서드 블록안에는 아무런 기능구현이 없고 모든 객체는 Object를 상속받고 있으니 메서드 오버라이딩하여 사용하게 되는데 가비지 컬렉션 대상이 되어 객체를 없애기 전 JVM이 호출하는 메서드로 해당 객체 내에서 리소스 정리, io나 네트워크 같이 반드시 사용 후 종료가 되어야 하는 일이 필요할 때 사용하기 위해 만들어진 메서드이다. finalizer의 문제점 fanalize 메서드는 언제 실행시점이 되는지 알 수 없는 문제가 있다. 보통 Heap 메모리 영역에 Eden 메모리 공간이..

[Item 7] 다 쓴 객체 참조를 해제하라
Effective Java/정리 2023. 1. 17. 19:21

메모리 누수가 발생하는 이유 Java는 GC( = Garbage Collection)를 해주는 언어로, 다 쓴 객체를 회수해 간다. 그렇기 때문에 더 이상 메모리 관리를 하지 않아도 된다고 착각할 수 있다. // 코드 7-1 메모리 누수가 일어나는 위치는 어디인가? public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements..

article thumbnail
[Item 6] 불필요한 객체 생성을 피하라
Effective Java/정리 2023. 1. 17. 19:20

같은 기능을 하는 객체는 하나를 재사용하는 방법을 고려해야 한다. Wrapper Class 자바의 wrapper class 인 Byte, Short, Integer 등 이있다. primitive type 을 wrapper class로 변환할때, new와 valueOf를 통한 인스턴스 생성이 있는데, 팩터리 메서드인 valueOf를 이용하게 되면 캐싱을 이용하여 불필요한 객체 생성을 막고 있다. public static Integer valueOf(int i) { if (i >= IntegerCache.low && i

article thumbnail
Item8. finalizer와 cleaner 사용을 피하라
Effective Java/정리 2023. 1. 16. 00:14

아이템 8번은 객체의 소멸에 대한 이야기 둘다 사용하지 마라 원하는 시점에 객체가 제거된다고 보장할 수 없다. 소켓이나 파일 읽어올 때 읽어올 수 있는 수의 제한이 있다 이걸 무한정 읽어오게되면 너무 많은 객체를 불러오게되어 에러가 난다. 이런 에러의 근본적 원인이 사용한 자원 반납이 제대로 처리되지 않아서 디비 커넥션, 네트워크 커넥션 리소스 정리가 안되면 문제가 생긴다. 적절한 타이밍에 정리가 안되는게 finalizer, cleaner 언제 실행될지 모른다. finalizer() 내에서 리소스 정리하는 로직이 들어간다면 예외가 발생하면 처리할 작업이 남아있어도 자원이 반납이 안된채로 어플리케이션이 종료된다. package item8.finalizer; public class FinalizerIsBad..

article thumbnail
아이템 7 다 쓴 객체 참조를 해제하라
Effective Java/정리 2023. 1. 15. 02:09

객체 참조 해제란 메서드 내에서 사용할 객체를 인스턴스화 하여 로컬 변수에 할당하여 참조하고 사용 후 더 이상 사용하지 않는다고 명시적 null처리로 참조 관계를 끊어주거나 해당 메서드가 종료되면 더 이상 사용하지 않을 인스턴스로 참조 관계를 해지하는 것. 보통은 메서드 종료시 변수가 유효 범위를 벗어나게 되어 더 이상 사용하지 않아 가비지 컬렉터가 참조 관계가 끊어진 객체를 회수하는게 가장 좋지만 그렇지 않은 예외적인 경우도 있다. 책에서 나온 예제 코드를 본다면 package effectiveJava.item7; import java.util.Arrays; import java.util.EmptyStackException; public class Stack { private Object[] eleme..

article thumbnail
정적 유틸리티 클래스 (Static Utility Class)
Effective Java/정리 2023. 1. 9. 23:28

Item 4 에서 자바 진영에서 제공하는 유틸성 클래스를 언급했다. [Item 4] 인스턴스화를 막으려거든 private 생성자를 사용하라 정적인 필드와 메서드를 담은 클래스의 구현은 객체 지향적인 사고는 아니자만, 공통점이 있는 메서드 혹은 팩터리들을 제공할 때 사용되기도 한다. 자바 진영에서 제공하는 기본 타입, 유틸성 be-study-record.tistory.com 외에도 Apache Commons의 StringUtils, IOUtils, FileUtils 등의 많은 유틸리티 클래스가 존재한다. 유틸리티 클래스는 자주 사용되는 공통 기능들을 제공한다. 이러한 공통기능을 자주 사용해 왔지만 이렇게 논쟁이 되고 있는지 몰랐다. https://stackoverflow.com/questions/33400..

article thumbnail
[Item 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
Effective Java/정리 2023. 1. 9. 23:27

의존 객체 주입 (Dependency Injection)을 프레임 워크로 제공하는 Dagger, Guice, Spring 등 있는데 한국의 대부분 자바 개발자에게 친숙하게 다가오는 것은 스프링 프레임워크일 것이다. 스프링을 생각해보면 인터페이스 기반으로 클래스 레벨에서는 의존하지 않고 런타임 시 동적으로 주입받는 역할로 많이 사용되고 있다. 이처럼, 유연성을 확보하고 결합도를 낮춰 주는 등의 장점이 존재한다. 여기서 언급되는 정적 유틸리티 클래스, 싱글턴으로서 구현되면 위의 장점과 반대로 유연하지 못하고 결합도는 높아진다. 유일 객체로 사용된다고 하였을 때는 유연성에 대한 고려는 하지 않아도 되겠다. . 이를 해소하기 위해 final 필드 제거하고 메서드를 통한 다형성을 제공할 수 있지만 멀티 스레드 환..