전체 글
-
아이템11. equals를 재정의하려거든 hashCode도 재정의하라책/이펙티브자바 2021. 7. 2. 21:03
equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다. 그렇지 않으면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 hashMap, hashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 수 있다. hashCode 규약 equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메소드는 몇 번을 호출해도 같은 값을 반환해야 한다. equals()가 true 를 반환하면, 두 객체의 hashCode는 같은 값을 반환해야 한다. equals()가 false 를 반환해도, 두 객체의 hashCode가 다를 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다. 좋은 hashCod..
-
아이템10. equals는 일반 규약을 지켜 재정의하라책/이펙티브자바 2021. 7. 2. 19:00
아래에 상황 중 하나에 해당한다면 equals 는 재정의 하지 않는 것이 최선이다. 각 인스턴스가 본질적으로 고유하다. 값을 표현하는게 아니라 동작하는 개체를 표현하는 클래스 ex) Thread 인스턴스의 '논리적 동치성'을 검사할 일이 없다. 상위 클래스에서 재정의한 equals 가 하위 클래스에도 딱 들어맞는다. 예를들어 대부분의 Set, List 구현체들은 AbstractSet, AbstractList가 구현한 equals 를 그대로 사용한다. 클래스가 private 이거나 package-private이고 equals 메소드를 호출할 일이 없다. // euqals가 실수로라도 호출되는걸 막고싶을 때 @override public boolean equals(Obejct o) { throw new As..
-
위상정렬 정리Algorithm 2021. 6. 26. 20:47
위상정렬 (Topological Sort) 위상 정렬은 선행 조건들을 가진 일들의 수행 순서를 정한다. 이 순서는 일들의 선행 조건들을 만족시켜야 한다. 예시를 들어보자. 한 학과의 학생들이 수강해야만 하는 7개의 필수 과목들이 있다. (1~7) 어떤순서로 강의를 수강해도 상관이 없지만, 선후수 관계는 만족시켜야한다. 2의 선수과목은 1 4의 선수과목은 1, 2, 3 5의 선수과목은 3 6의 선수과목은 2, 4, 5 7의 선수과목은 5, 6 이 순서에서 그래프의 각 간선 (v, w) 에 대해 v가 w보다 먼저 나와야한다. 이와 같은 순서를 찾는것이 위상정렬 이다. 조건 주어진 방향 그래프에 순환이 없어야 한다. (directed acyclic graph, DAG) Queue를 이용한 방법 진입차수가 0인..
-
아이템9. try-finally보다는 try-with-resources를 사용하라책/이펙티브자바 2021. 6. 26. 18:34
자바 라이브러리에는 close 메소드를 호출해 직접 닫아줘야 하는 자원이 많다. ex) InputStream, OutputStream, java.sql.Connection 자원 닫기는 클라이언트가 놓치기 쉬워 예측할 수 없는 성능 문제로 이어지기도 한다. 상당수가 finalizer 를 안전망으로 사용하지만 믿을만하지 못하다. (아이템 8) 이전에는 자원이 제대로 닫힘을 보장하는 수단으로 try-finally 를 주로 사용했다. try-finally // 자원이 1개인 경우 static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try {..
-
아이템8. finalizer와 cleaner 사용을 피하라책/이펙티브자바 2021. 6. 26. 18:33
자바에서는 두 가지 객체 소멸 자를 제공한다. finalizer 오동작, 낮은 성능 예측할 수 없고 위험하여 일반적으로 불필요하다. 자신을 수행할 스레드를 제어할 수 없다. finalizer 공격에 노출되어 심각한 보안문제를 일으킬 수 있다. 생성자나 직렬화 과정에서 예외가 발생하면, 악의적으로 하위 클래스의 finalizer가 수행될 수도 있다. GC가 수집하지 못하게 막을 수 있다. 위와 같은 이유로 Java9 에서 deprecated 되었고 새로운 대안으로 cleaner를 소개한다. cleaner finalizer 보다는 덜 위험하다. 하지만 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다. 자신을 수행할 스레드를 제어할 수 있다. 공통사항 즉시 수행된다는 보장이 없다. 실행되기까지 얼마나 ..
-
아이템7. 다 쓴 객체 참조를 해제하라책/이펙티브자바 2021. 6. 23. 22:53
Java의 경우 GC가 메모리 관리를 해준다. 그래서 메모리 관리에 더 이상 신경을 쓰지 않아도 된다고 오해할 수 있으나 절대 사실이 아니다. // 일반적인 Stack 의 pop 메소드 public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } 특별한 문제는 없어 보일 수 있다. 하지만 '메모리 누수' 의 문제가 있는데 이 프로그램을 오래 실행하면 점차 GC 활동과 메모리 사용량이 늘어나 결국 성능이 저하될 것이다. 상대적으로 드문 경우긴 하지만 디스크 페이징이나 OutOfMemoryError를 일으킬 수 있다. 여기서 문제점은 다 쓴 참조(obsolete reference)를 여전히..
-
아이템6. 불필요한 객체 생성을 피하라책/이펙티브자바 2021. 6. 23. 13:24
객체의 재사용 똑같은 기능의 객체를 매번 생성하기 보다는 객체 하나를 재사용하는 편이 나을때가 많다. 특히, 불변 객체는 언제든 재사용할 수 있다. String 의 객체 생성 String 객체를 생성하는 방법은 new 연산자와 리터럴을 사용하는 방법이 있다. String s1 = new String("kingsubin"); String s2 = new String("kingsubin"); // 이 방법은 매번 새로운 객체를 생성함. System.out.println(s1 == s2); // false String s3 = "kingsubin"; String s4 = "kingsubin"; // 이 방법은 String Constant Pool 이란 곳에서 재사용되어짐. System.out.println(s..
-
아이템5. 자원을 직접 명시하지말고 의존 객체 주입을 사용하라책/이펙티브자바 2021. 6. 21. 12:36
// 정적 유틸리티를 잘못 사용한 예 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 Lexicon dictionary = ...; private SpellChecker(...) {...} public static SpellChecker INSTANCE = new SpellChecker(.....