Reference/Effective-Java

    [Effective-Java] Chapter3 #10. equals는 일반 규약을 지켜 재정의하라

    이번 아이템의 핵심적인 내용은 다음 한 줄이다. equals를 다 구현했다면 세 가지만 자문해보자. 대칭적인가? 추이성이 있는가? 일관적인가? 📌 equals 메서드를 재정의하지 않는 경우 equals 메서드는 재정의하기 쉬워 보이지만, 생각 이상으로 신경써야 할 점들이 많아 자칫하면 끔찍한 결과로 이어진다. 따라서, 재정의하지 않아도 되는 경우에는 안 하는 것이 최선이다. 1️⃣ 각 인스턴스가 본질적으로 고유하다. Integer나 String처럼 값을 표현하는 값 클래스가 아닌 동작하는 개체를 표현하는 클래스. 예를 들어, Thread가 좋은 예로써 Object의 equals 메서드는 이러한 클래스에 딱 맞게 구현되어 있다. 2️⃣ 인스턴스의 '논리적 동치성(logical equality)'을 검사할 ..

    [Effective-Java] Chapter2 #9. try-finally보다는 try-with-resources를 사용하라

    자바 라이브러리에는 close 메서드를 호출해 직접 닫아주어야 하는 비메모리 자원들이 많다. 예를 들어, InputStream, OutputStream, java.sql.Connection 등이 좋은 예시다. 문제는 이 자원 닫기를 클라이언트 측에서 수행해주면 다행이지만, 놓치면 예측 불가능한 성능 문제로 이어진다. 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 사용되었다. 📌 try-finally public static String firstLineOfFile(String path) throw IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine()..

    [Effective-Java] Chapter2 #8. finalizer와 cleaner 사용을 피하라

    자바에서는 finalizer와 cleaner 두 가지 객체 소멸자를 제공하고 있다. 나름의 쓰임이 몇 가지 있지만, 기본적으로 "쓰지 말아야" 한다고 책에서 강조하고 있다. 우선, finalizer와 cleaner가 대충 뭔지나 알아보자. 📌 What is finalizer & cleaner GC는 더 이상 사용하지 않는 객체를 수집하여 메모리를 회수하는 역할을 한다. finalizer() 메서드나 cleaner는 더 이상 사용되지 않는 객체의 비메모리 자원을 회수하는데 사용되며 메모리 누수를 방지하는 역할을 한다. ✒️ 메모리 자원과 비메모리 자원 메모리 자원은 주로 프로그램이 실행될 때 사용하는 자원으로, CPU가 바로 접근 가능한 고속의 임시 저장소를 말한다. 대표적으로 RAM(Random Acce..

    [Effective-Java] Chapter2 #7. 다 쓴 객체 참조를 해제하라

    C, C++을 사용해본 사람은 알겠지만, 해당 언어들은 메모리를 사용자가 직접 관리해주어야 한다. 예를 들어, malloc 함수를 사용해 동적으로 힙 영역에 배열을 만들었다면, 더이상 쓰이지 않는 시점에 free 함수를 통해 메모리 할당을 풀어주어야 한다. 이런 세심한 부분들을 모두 고려하는 것은 코드가 복잡해질 수록 개발자들에게 큰 부담을 안겨주기도 하지만 이후에 문제가 발생해도 원인을 찾아내기가 여간 어려운 것이 아니다. 하지만 Java에는 GC가 더 이상 참조되지 않는 객체들을 알아서 회수해가는 역할을 대신해준다. 물론 프로그래머에게 이는 매우 유용한 기능이긴 하지만 더이상 다 쓴 객체를 고려해주지 않아도 됨을 의미하지는 않는다. GC는 '더 이상 참조되지 않는' 객체를 회수하는데, 어쨌건 GC가 ..