본문 바로가기
반응형

Effective Java16

Effective Java : (10) 객체 참조 해제에 신경써라 다 쓴 객체 참조를 해제하라 C, C++에서 메모리를 직접 관리하다가 가비지 컬렉터가 있는 Java로 넘어오면서 메모리 관리를 더 이상 하지 않는다고 생각하면 안됩니다. 메모리 누수는 여전히 발생할 수 있기 때문입니다. 메모리 누수 예 public class Stack { private Object[] elements; private int size = 0; ... public Object pop() { if (size == 0) throw new EmptyStackException(); return elements[--size]; } } 위 예에서 elements에 저장된 데이터를 pop을 했더라도, 여전히 elements에는 객체가 담겨 있습니다. 더 이상 사용하지 않더라도 말이죠. 따라서 다음과 같.. 2020. 4. 24.
Effective Java : (9) Finalizer와 Cleaner의 단점 Finalizer와 Cleaner 사용을 피해라 자바는 두 가지 객체 소멸자를 제공합니다. 그 중 finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요합니다. 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 합니다. 자바 9에서는 finalizer를 deprecated API로 지정하고 cleaner를 그 대안으로 소개하고 있습니다. cleaner는 finalizer보다 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요합니다. finalizer와 cleaner는 즉시 수행된다는 보장이 없기 때문에 제 때 실행되어야 하는 작업은 절대 할 수 없습니다. 파일 닫기를 수행하는 것을 finalizer나 cleaner에 맡긴다면 중대한 오류를 발생시키게 됩니다. .. 2020. 4. 24.
Effective Java : (8) 불필요한 객체 생성 피하기 불필요한 객체 생성을 피해라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많습니다. 재사용은 빠르고 세련됩니다. 특히 불변 객체는 언제든 재사용할 수 있습니다. String s = new String("bikini") 이 문장은 실행될 때 마다 String 인스턴스를 새로 만듭니다. 상황에 따라 수백만개 생설될 수 있고, 쓸데없는 행위입니다. String s = "bikini" 이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용합니다. 즉, 생성자 대신 정적 팩터리 메서드를 제공하는 불면 클래스에서는 정적 팩터리 메서드를 사용해 불필요한 객체 생성을 피할 수 있습니다. Boolean(String) 생성자 대신이 Boolean.valueOf.. 2020. 4. 24.
Effective Java : (7) 정적유틸클래스, 싱글턴 대신 의존객체주입 활용 자원을 직접 명시하지말고 의존객체주입을 사용하라 많은 클래스가 하나의 자원에 의존하는 경우가 많습니다. 가령 맞춤법 검사기는 사전 역할의 Dictionary에 의존합니다. 정적 유틸리티 클래스 구현 방식 public class SpellChecker { private static final Lexicon dictionary = ... ; private SpellChecker() { } public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } 싱글턴 구현 방식 public class SpellChecker { private final Lexcion dictionary = ..... 2020. 4. 24.
Effective Java : (6) Private 생성자를 사용하는 이유 인스턴스화를 막으려거든 private 생성자를 사용하라 개발을 할 때 정적 메서드와 정적 필드만 담은 클래스를 만들고 싶을 때가 있습니다. 객체지향적 사고는 아니지만 나름대로 쓰임새가 있습니다. java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있습니다. java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 수도 있습니다. final 클래스와 관련한 메서드들을 모아놓을 때도 사용합니다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문입니다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아닙니다. 그러나 생성자를 명시하지 않으면 .. 2020. 4. 24.
Effective Java : (5) Singleton 생성 방식 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다. 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어렵습니다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜 구현으로 대체할 수 없기 때문입니다. [1] public static final 필드 방식의 싱글턴의 예 입니다. public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ... } } 위 방식은 INSTANCE를 초기화할 때 딱 한번만 호출됩니다. public, protected 생성자가.. 2020. 4. 24.
반응형