Java
-
Item 10. equals는 일반 규약을 지켜 재정의하라백수의 개발/이펙티브 자바 2019. 8. 13. 17:51
equals 메서드는 객체 내의 정보들에 대한 동등성을 비교하기 위한 메서드이다. 비교 가능한 객체의 경우 equals 메서드를 잘못 작성하게 되면 의도하지 않은 결과가 초래되니, equals를 재정의하는 방법에 대해 알아보자. equals를 재정의하지 않아도 되는 경우 1. 각 인스턴스가 본질적으로 고유하다. 데이터나, 객체의 정보를 표현하는 것이 아닌, 동작하는 개체를 표현하는 클래스가 이에 속한다.ex) Thread 2. 인스턴스의 '논리적 동치성'을 검사할 일이 없다. java.util.regex.Pattern은 Pattern의 인스턴스가 같은(동치성) 정규표현식을 나타내는지 검사할 필요가 없다. 3. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 대부분의 Set 구현체들..
-
Item 9. try-finally보다는 try-with-resource를 사용하라백수의 개발/이펙티브 자바 2019. 8. 9. 19:12
자바 라이브러리에는 InputStream, OutputStream, java.sql.Connection등 close메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 이러한 자원을 닫기 위한 수단으로 try-finally가 사용되었다. try-finally는 더 이상 자원을 회수하는 최선의 방책이 아니다! 아래와 같은 try-finally를 통해 자원을 닫을 수 있다. static String firstLineOfFile(String path) throws IOException{ BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } 그러나 자원을 하나..
-
Item 8. finalizer와 cleaner 사용을 피하라백수의 개발/이펙티브 자바 2019. 8. 7. 16:34
finalizer와 cleaner를 피해야하는 이유 자바는 finalizer와 cleaner 두 가지 객체 소멸자를 제공한다. finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다. cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로는 불필요하다. 1. 실행을 보장할 수 없다. 위 두 가지 객체 소멸자로는 즉시 수행된다는 보장이 없다. 객체에 접근할 수 없게 된 후 finalizer나 cleaner가 실행되기까지 얼마나 걸릴지 알 수 없다. 즉, 이 두 가지 객체 소멸자로는 제때 실행되어야 하는 작업은 절대 할 수 없다. 상태를 영구적으로 수정하는 적업에는 절대 finalizer나 cleaner에 의존해서는 안 된다. 2...
-
Item 7. 다 쓴 객체 참조를 해제하라백수의 개발/이펙티브 자바 2019. 7. 19. 14:45
C, C++처럼 메모리를 직접 관리해야 하는 언어와 달리 Java는 가비지 컬렉터(GC)를 갖추어 어느정도 알아서 메모리를 관리해준다. 그러나 메모리 관리에 아예 신경 쓰지 않아도 된다는 것은 아니다. 크게 메모리 누수에 문제를 발생시키는 것들이 3가지 있다. 어떤 상황에서 메모리 관리를 신경써줘야할지 알아보자. 자기 메모리를 직접 관리하는 클래스 아래 Stack을 구현한 코드에서 메모리 누수가 일어나는 위치가 어디인지 확인해보자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = ..
-
Item 6. 불필요한 객체 생성을 피하라백수의 개발/이펙티브 자바 2019. 7. 16. 14:58
자주 사용되는 객체의 재사용 자주 사용되는 객체가 있다면 이는 매번 생성하기보다는 객체 하나를 재사용하는것이 훨씬 빠르고 효율적이다. 우리가 많이 사용하는 Boolean객체를 사용할 때, 아래와 같이 작성한다면 Boolean객체는 항상 새롭게 생성될 것이다. Boolean trueObject = new Boolean(true); Boolean falseObject = new Boolean(false); 그래서 Boolean에서의 true와 false는 Boolean객체 내에서 정적 필드 변수로 가지고 있어 재활용 된다. 따라서 아래처럼 사용하면 별도의 객체를 생성하지 않고, 기존에 만들어진 객체를 그대로 재활용 할 수 있다. Boolean trueObject = Boolean.TRUE; Boolean f..
-
Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라백수의 개발/이펙티브 자바 2019. 7. 15. 17:22
우리가 개발을 진행하면서 한 클래스 내에서 다양한 자원에 의존하는 경우가 많았을 것이다. 이러한 경우 의존 객체를 어떻게 관리하는 것이 좋을지 알아보자. 정적 유틸리티와 싱글턴 맞춤법 검사기를 구현하는 예를 통해 정적 유틸리티와 싱글턴을 통한 의존 객체 사용이 좋지 않음을 보자. 아래는 정적 유틸리티를 잘못 사용한 예이다. public class SpellChecker{ private static final Lexicon dictionary = ...; private SpellChecker(){} public static boolean isValid(String word){...} public List suggestions(String type){...} } 아래는 싱글턴을 잘못 사용한 예이다. publ..
-
Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라백수의 개발/이펙티브 자바 2019. 7. 14. 16:34
단순히 정적 메서드와 정적 필드만을 담은 클래스를 만든다면, 사실상 해당 객체의 인스턴스화를 목적으로 만든 것이 아닐 것이다. 그렇기 때문에 별도로 객체의 인스턴스화를 막아준다. 이는 객체 지향적으로 좋지 않은 클래스라고 여기는 경향이 있지만, 이도 나름 쓰임새는 있다. 객체 인스턴스화 막기 대표적으로 이러한 객체는 java.lang.Math, java.util.Arrays, java.util.Collections 등이 있다. 이 객체들은 인스턴스화를 막았기 때문에 아래와 같이 코드를 작성할 수 없다. Math mathObject = new Math(); Arrays arraysObject = new Arrays(); Collections collectionsObject = new Collection()..
-
Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라백수의 개발/이펙티브 자바 2019. 7. 13. 15:41
싱글턴이란? 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등의 경우, 인스턴스를 여러개 생성하면 자원을 낭비하거나 버그가 발생될 수 있어 오직 하나의 인스턴스만 생성하여 사용하도록 한다. 싱글턴을 보증하기 위해서는 private생성자 또는 열거 타입을 사용할 수 있다. private 생성자를 통한 싱글턴 보증 싱글턴으로 객체를 만들기 위해서는 new를 통해 인스턴스를 생성할 수 없도록 생성자에 private 접근 제어자를 지정해야한다. 또한 유일한 인스턴스를 반환할 수 있도록 정적 메소드를 지원해야하며, 해당 인스턴스를 참조할 정적 참조변수가 필요하다. 아래는 public static final 필드 방식의 싱글턴이다. public cl..