Language (33) 썸네일형 리스트형 Effective JAVA - Item11 : equals를 재정의하려거든 hashcode도 재정의하라. "equals를 재정의한 클래스 모두에서 hashcode도 재정의해야한다. 하지 않는다면 HashMap, HashSet에서 문제" 1. hashCode 규약 // 1. equals 비교에 사용되는 정보가 변경되지 않았다면 애플리케이션이 실행되는 동안 그 객체의 hashcode는 항상 같아야 한다. // (애플리케이션 종료 후 재실행시 변경될 수 있다.) // 2. equals가 두 객체가 같다고 판단했다면, 두 객체의 hashcode도 같아야 한다. // 3. equals가 두 객체가 다르다고 판단했더라도, hashcode는 같을 수 있다. 하지만 달라야 성능이 좋은 해시테이블이다. // - hashcode 재정의를 잘못했을 때, 크게 문제되는 조항은 두번째인데, 논리적으로 같은 객체는 같은 hashco.. Effective JAVA - Item10 : equals는 일반 규약을 지켜 재정의하라. 1. 3장 시작 : 모든 객체의 공통 메서드 - Object의 final이 아닌 메서드(eqauls, hashcode, toString, clone, finalize)는 모두 재정의를 염두해 두고 설계된 것임. - Object를 상속하는 즉, 모든 클래스는 해당 메서드를 재정의해야 한다. - 잘못 구현시 해당 메서드들을 재정의할 때, 지켜야할 규약을 잘 지켰다고 가정하는 클래스(HashMap, HashSet 등)에 오작동을 초래 2. Item10 : eqauls는 일반 규약을 지켜 재정의하라. - 일반적으로, 재정의를 안하게 되면 자기 자신과 같은지만 비교, 즉 인스턴스가 같은지만 비교한다. 3. eqauls를 재정의하지 않아도 되는 상황 3-1. 각 인스턴스가 본질적으로 고유하다. - 값을 나타내는 것.. Effective JAVA - Item9 : try-finally 보다는 try-with-resources를 사용하라. 기본적으로 자바에서는 close 메서드를 통해 작업 완료시 닫아줘야하는 클래스 인스턴스들이 존재한다. 그 예로는 InputStream, OutputStream, java.sql.Connection 등이 있다. 파일처리, 네트워크 연결(socket 등), 데이터베이스 Connection Pool 자원이 제대로 닫힘을 보장하자! - 개발자가 close 메서드를 놓치는 경우가 존재한다. - 안전망으로 finalizer 가 있지만 믿을만하지 않다. 1. 전통적인 방법 try-finally // 자원이 하나인 경우 String path = "/"; BufferedReader br = new BufferedReader(new FileReader(path)); try{ String result = br.readLin.. Effective JAVA - Item8 : finalizer와 cleaner 사용을 피하라 결론 : 자바에서는 객체 회수는 가비지 컬렉터가 담당하고 비메모리 자원 회수는 try-with-recourses가 담당하므로 여러가지 문제점이 있는 finalizer와 cleaner를 굳이 사용해 객체 회수나 비메모리 자원회수를 수행할 필요가 없다. 자바에는 두가지 객체 소멸자가 존재한다 - finalizer, cleaner 1. finalizer - 예측할 수 없고 상황에 따라 위험하다. - 오작동, 낮은 성능, 이식성 문제의 원인 - 모든 클래스는 Object 클래스를 상속받고 Object 클래스가 해당 finalizer 메서드 소유 - 별도의 스레드 풀을 가지고 동작 - 이미 Deprecated 됨. - 참조 해제 후(null 처리) System.gc() 호출시 자동으로 해당 메서드가 호출됨 2. .. Effective JAVA - Item7 : 다 쓴 객체 참조를 해제하라 자바는 기본적으로 C나 C++에 비해 다 쓴 객체에 대한 메모리 공간에 대한 고민이 적다. 이는 자바에는 가비지 컬렉터가 있기 때문에 다 쓴 객체에 대해 알아서 제거를 해주기 때문이다. 하지만 가바지 컬렉터가 찾지 못하는 다 쓴 객체가 존재하고 이는 메모리 누수를 발생시킨다. 메모리 누수 - 메모리에 처리되지 못한 객체가 쌓이게 되고 성능저하의 원인이 된다. - 심한 경우, 디스크 페이징이나 OutOfMemoryError까지 발생하게 된다. 메모리 누수 1 : 스택과 같이 배열에 객체를 담는 경우, 데이터를 담았다 삭제할 때 , 실제 객체가 삭제되지 않음 - 스택이 여전히 다 쓴 객체들을 참조하기 때문이다. - 이는, 내부적으로 객체를 pop 처리하면 삭제하는 것이 아닌 가리키는 인덱스만 변경하는 구조이.. Effective JAVA - Item6 : 불필요한 객체 생성을 피하라. 매번 객체를 생성하는 것보단 미리 만들어놓은 객체를 사용하는 것이 좋다 - 재사용은 빠르고 세련되다 - 불변 객체는 언제든 재사용이 가능하다. 1. 객체를 계속 생성하는 안좋은 예시 String badThing1 = new String("hello world"); String badThing2 = new String("hello world"); System.out.println(System.identityHashCode(badThing1)); System.out.println(System.identityHashCode(badThing2)); 2. 만들어 놓은 객체를 다시 사용하는 예시 - 같은 가상머신내에서는 똑같은 문자열을 사용하는 모든 객체가 같은 객체를 공유한다. String goodThing1 =.. Effective JAVA - Item5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 요약 많은 클래스가 하나 이상의 자원에 의존하는 상황을 고려해보자 예를 들어, 맞춤법을 확인해주는 클래스는 여러가지 단어가 존재하고 언어가 여럿 존재하기에 하나의 인스턴스를 만들어 사용하는 정적 유틸리티 방식이나 싱글턴 방식을 사용하면 해당 경우에서 유연한 사용이 불가능하다. 예를 들어, 하나의 사전 인스턴스를 만들어놓고 이를 활용해 맞춤법을 확인해주는 클래스는 유연하지 못한 것이다. 즉, 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴으로 사용하기에 적합하지 않다. 의존 객체 주입 방식 이러한 경우에는 해당 클래스(맞춤법 클래스)에 대한 인스턴스를 생성할 때, 생성자를 통해 필요한 자원(사전 클래스)를 넘겨주는 방법이 가장 적합하다. public class spellChec.. Effective JAVA - Item4 : 인스턴스화를 막으려거든 private 생성자를 사용하라. 결론 : "자바에서 프로그래밍 중에는 가끔 인스턴스화를 막아놓고 사용하는 클래스들이 필요한데 이러한 경우 private 생성자 만을 생성해서 인스턴스화를 막자" 정적 메서드와 정적 필드만을 담은 클래스 - 객체 지향적인 사고와는 거리가 조금 먼 클래스 1. 정적 메서드를 모아놓고 사용 가능 - java.lang.Math, java.util.Arrays처럼 기본값이나 배열관련 메서드들을 모아놓을 수 있다. - java.util.Collections처럼 특정 인터페이스를 구현하는 객체들을 생성해주는 메서드들을 모아놓을 수 있다. (자바8부터는 이러한 메서드들을 인터페이스 내부에 구현 가능) - final 클래스(상속이 불가능한 클래스)와 관련된 메서드들을 모아놓을 수 있다. (상속이 불가능하기에 모아놓고 이.. 이전 1 2 3 4 5 다음