전체 글
-
모든 객체의 공통 메서드 - 아이템 11. equals를 재정의하려거든 hashCode도 재정의하라Study/Effective Java 2022. 12. 14. 11:29
equals를 재정의하려거든 hashCode도 재정의하라 equals() 메서드를 재정의한 클래스는 hashCode() 메서드고 재정의해야 한다. 그렇지 않으면, hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 것이다. hashCode 일반 규약 Object 명세에서 발췌한 내용에 따르면 hashCode의 규약은 아래와 같다. 1. equals() 메서드 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode() 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다. 2. equals() 메..
-
모든 객체의 공통 메서드 - 아이템 10. equals는 일반 규약을 지켜 재정의하라Study/Effective Java 2022. 12. 13. 17:16
equals는 일반 규약을 지켜 재정의하라 equals를 재정의하면 안 되는 경우 1. 각 인스턴스가 본질적으로 고유한 경우 값을 표현하는 게 아니라 동작하는 개체를 표현하는 클래스가 여기에 해당한다. Thread가 좋은 예로, Object의 equals() 메서드는 이러한 클래스에 딱 맞게 구현되었다. 2. 인스턴스의 '논리적 동치성'을 검사할 일이 없는 경우 public class Main { public static void main(String[] args) { final Pattern p01 = Pattern.compile("//.*"); final Pattern p02 = Pattern.compile("//.*"); System.out.println(p01.equals(p02)); // fal..
-
객체의 생성과 파괴 - 아이템 9. try-finally보다는 try-with-resource를 사용하라Study/Effective Java 2022. 12. 13. 14:07
try-finally보다는 try-with-resource를 사용하라 try-finally 문제점 자바 라이브러리에는 close() 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. InputStream, OutputStream, java.sql.Connection 등이 그 예이다. 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 문제로 이어지기도 한다. static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } 위 코드는 Buffer..
-
객체 생성과 파괴 - 아이템 8. finalizer와 cleaner 사용을 피하라Study/Effective Java 2022. 12. 13. 11:09
finalizer와 cleaner 사용을 피하라 사용하지 말아야 하는 이유 Java에서 제공하는 두 가지 객체 소멸자인 finalize와 cleaner는 기본적으로 쓰지 말아야 한다. 사용하지 말아야 하는 이유는 다음과 같다. 1. finalizer : 예측할 수 없고, 위험하며, 느리고, 일반적으로 불필요하다. 2. cleaner : finalizer보다는 덜 위험하지만 여전히 예측할 수 없고, 느리며, 보통을 불필요하다. 좀 더 구체적으로 살펴보도록 하겠다. 단점 1. 즉시 수행된다는 보장이 없다. finalizer와 cleaner는 즉시 수행된다는 보장이 없다. 즉, finalizer와 cleaner로는 제때 실행되어야 하는 작업을 절대 할 수 없다. finalizer와 cleaner의 수행 속도는..
-
객체 생성과 파괴 - 아이템 7. 다 쓴 객체 참조를 해제하라Study/Effective Java 2022. 12. 13. 09:44
다 쓴 객체 참조를 해제하라 메모리 누수 문제 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[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } privat..
-
객체 생성과 파괴 - 아이템 6. 불필요한 객체 생성을 피하라Study/Effective Java 2022. 12. 12. 16:49
불필요한 객체 생성을 피하라 1. 객체를 매번 생성하기보다는 재사용하는 편이 좋다. 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 좋을 때가 많다. 특히, 불변 객체는 언제든지 재사용이 가능하다. 만약, 무거운 객체라면 매번 생성할 때마다 많은 자원이 들어갈 것이고, 인스턴스를 자주 생성하게 되면 GC가 동작하게 될 확률이 높아지고 이는 애플리케이션의 성능을 저하시키는 요인 중 하나이다. Java에서 String을 생성하는 방식을 통해 그 이유를 알아보자. String string01 = new String("hello"); // new 연산자를 이용한 방식 String string02 = "hello"; // 리터럴을 이용한 방식 첫 번째 코드는 실행될 때마다 String 인스턴..