본문 바로가기
728x90

분류 전체보기152

10.equals는 일반 규약을 지켜 재정의하라(1) equals 메서드는 재정의하기 쉬워 보이지만 곳곳에 함정이 도사리고 있어 끔찍한 결과를 초래할 수 있다 문제를 회피하는 가장 쉬운길은 아예 재정의 하지 않는 것이다 (4가지 방법) 1. 각 인스턴스가 본질적으로 고유하다 - 값을 표현하는게 아니라 동작하는 개체를 표현하는 클래스가 여기에 해당한다 - ex) Thread 좋은 예로, Object의 equals 메서드는 이러한 클래스에 딱 맞게 구현돼 있다 2. 인스턴스의 '논리적 동치성' 을 검사할 일이 없다 - java.util.regex.Pattern은 equals를 재정의해서 두 Pattern의 인스턴스가 같은 정규 표현식을 나타내는지를 검사하는, 즉 논리적 동치성을 검사하는 방법도 있다 - 하지만 설계자는 클라이언트가 이 방식을 원하지 않거나 애초.. 2021. 9. 28.
9.try-finally보다는 try-with-resources를 사용하라 자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. ex) InputStream, OutputStream, java.sql.Connection 코드 9-1 try-finally - 더 이상 자원을 회수하는 최선의 방책이 아니다! // 코드 9-1 try-finally - 더 이상 자원을 회수하는 최선의 방책이 아니다! (47쪽) static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } - 자원을 하나 더 사용한다.. 2021. 9. 27.
8.finalizer와 cleaner 사용을 피하라 자바는 두 가지 객체 소멸자를 제공한다 finailzer , cleaner - finailzer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다 - 자바 9 에서는 finalizer 사용 자제 API로 지정하고 cleaner를 대안으로 소개하고 있다 - cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일 반 적으로 불필요하다 - 프로그램 생애주기와 상관없는, 상태를 영구적으로 수정하는 작업에서는 절대 finalizer나 cleaner에 의존하면 안 된다 cleaner와 finalizer 적절한 쓰임새 2가지 방법 - 1. 자원 소유자가 close 메서드를 호출하지 않는 것에 대비한 안전망 역할 - cleaner나 finalizer가 즉시 호출.. 2021. 9. 25.
7.다 쓴 객체 참조를 해제하라 c, c++처럼 메모리를 직접 관리해야 하는 언어를 쓰다가 자바처럼 가비지 컬렉터를 갖춘 언어로 넘어오면 평안한다 다 쓴 객체를 알아서 회수해가기 때문이다 그러나 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해하면 안 된다 7-1 메모리 누수가 일어나는 위치는 어디인가? // 코드 7-1 메모리 누수가 일어나는 위치는 어디인가? (36쪽) 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 voi.. 2021. 9. 24.
6.불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다 String s = new String("bikini"); // 따라 하지 말것! - 위 문장은 실행될 때마다 String 인스턴스를 새로 만든다. String s = "bikini"; - 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다 - 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. 6-1 성능을 훨씬 더 끌어올릴 수 있다! // 코드 6-1 성능을 훨씬 더 끌어올릴 수 있다! static boolean isRomanNumeralSlow(String s) { return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,.. 2021. 9. 23.
5.자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 5-1 정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다. public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... }; public static List suggestions(String typo) {...}; } 5-2 싱글턴을 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다 public class SpellChecker { private final Lexicon dictionary = ...; private SpellChecker(...) {} pu.. 2021. 9. 18.
728x90