본문 바로가기

분류 전체보기56

Java | equals를 재정의하려거든 hashCode도 재정의하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다. 핵심equals를 재정의할 때는 hashCode도 반드시 재정의해야 한다. 그렇지 않으면 프로그램이 제대로 동작하지 않을 것이다.재정의한 hashCode는 Object의 API 문서에 기술된 일반 규약을 따라야하며, 서로 다른 인스턴스라면 되도롣 해시코드도 서로 다르게 구현해야 한다. 이유equals를 클래스 모두에서 hashCode도 재정의해야한다.그렇지 않으면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashSet이나 HashMap 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 것이다.hashCode 일반 규약equals 비교에 사용되는 정보가 변경되지 않았다면.. 2024. 7. 4.
Java | equals는 일반 규약을 지켜 재정의하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다. 핵심꼭 필요한 경우가 아니라면 equals를 재정의하지 말자. 많은 경우에 Object의 equals가 우리가 원하는 비교를 정확하게 수행해준다.재정의해야할 때는 IDE에게 맞기거나, 그 클래스의 핵심 필드를 모두 빠짐없이, 다섯 가지 규약을 확실히 지켜가며 비교해야 한다. 이유equals 메서드equals 메서드는 곳곳에 함정이 도사리고 있어서 자칫하면 끔찍한 결과를 초래한다.재정의 하지 않는 것이 최선이다.1. 각 인스턴스가 본질적으로 고유하다.값을 표현하는 게 아니라 동작하는 개체를 표현하는 클래스(Thread)Thread@Overridepublic boolean equals(Obje.. 2024. 7. 4.
Java | try-finally보다는 try-with-resources를 사용하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다. 핵심꼭 회수해야 하는 자원을 다룰 때는 try-finally 말고, try-with-resources를 사용하자.예외는 없다. 코드는 더 짧고 분명해지고, 만들어지는 예외 정보도 훨씬 유용하다.try-finally로 작성하면 실용적이지 못할 만큼 코드가 지저분해지는 경우라도, try-with-resources로는 정확하고 쉽게 자원을 회수할 수 있다. 이유close를 여러번 호출하는 경우 try-finally의 문제점만약 close를 여러 번 호출해야 하는 상황이 오면 어떻게 될까?package effectivejava.chapter2.item9.tryfinally;import java.i.. 2024. 7. 4.
Java | finalizer와 cleaner 사용을 피하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다. 핵심cleaner(java 8까지는 finalizer)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자.물론 이런 경우라도 불확실성과 성능 저하에 주의해야한다. 이유finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있다.finalizers는 java의 객체 소멸자cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.finalizer과 cleaner로는 제때 실행되어야하는 작업을 할 수 없다.객체에 접근 할 수 없게 된 후 실행까지 얼마나 걸릴지 알 수 없다.상태를 영구적으로 수정하는 작업에서는 절대 fi.. 2024. 7. 4.
Java | 다 쓴 객체 참조를 해제하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다. 핵심메모리 누수는 겉으로 잘 드러나지 않아 시스템에 수년간 잠복하는 사례도 있다.이런 누수는 철저한 코드 리뷰나 힙 프로파일러 같은 디버깅 도구를 동원해야만 발견되기도 한다.그래서 이런 종류의 문제는 예방법을 익혀두는 것이 매우 중요하다. 이유메모리 누수가 일어나는 위치는 어디인가?1. 메모리를 직접 관리하였으나 제거하지 않은 경우package effectivejava.chapter2.item7;import java.util.*;// 코드 7-1 메모리 누수가 일어나는 위치는 어디인가? (36쪽)public class Stack { private Object[] elements; .. 2024. 7. 4.
Java | 불필요한 객체 생성을 피하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다.  이유1. 객채를 매번 생성하기보다는 재사용하는 편이 좋다단 하나의 인스턴스를 사용하면 객체의 재사용성이 보장된다.만약, 무거운 객체라면 매번 생성할 때마다 많은 자원이 들어갈 것이고, 인스턴스를 자주 생성하게 되면 GC가 동작하게 될 확률이 높아지고 이는 애플리케이션 성능을 저하시키는 요인 중 하나이다.대표적인 예시 String참조 링크만약 String이 가변(mutable)이라면 같은 참조를 가지는 객체의 값을 변경할 수 있게 된다. 이는 같은 참조 & 다른 값이라는 상황을 만들 수 있기 때문에 재사용이 불가능하다.따라서 객체 공유를 통한 재사용이 목적인 String Pool을 사용할 .. 2024. 7. 4.