이펙티브 자바

ComparableComparable 인터페이스는 타입을 받는 인터페이스이며 메서드의 타입은 컴파일시점에 결정된다.순서를 고려해야하는 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하여, 인스턴스들을 쉽게 정렬, 검색, 비교 가능한 컬렉션과 어우러지도록하는게 좋다. compareTo 규약 compareTo 규악은 equals 규악과 비슷하나 compareTo 메서드는 각 필드가 동치인지 비교하는게 아닌 순서를 비교한다.compareTo는 주어진 객체의 순서를 비교하며, 주어진 객체보다 작으면 음의 정수 같으면 0 크면 양의 정수를 반환한다.만약 비교할 수 없는 타입의 객체가 주어지면 ClassCastException을 던지며 추가 규악은 아래와 같다.- Comparable을 구현한 클..
Cloneable 인터페이스Java에는 Cloneable이라는 믹스인 인터페이스가 존재가 있다.해당 인터페이스를 찾아보면 아무것도 없는걸 볼 수 있는데,  해당 인터페이스의 용도는 Cloneable 인터페이스로 구현된 클래스에서 clone메서드를 호출할때  안전하게 Object.clone()메서드가 해당 클래스의 필드를 복사 할 수 있음을 나타낸다.만약 Cloneable을 사용하지않는 클래스에서 clone을 호출하게된다면 CloneNotSupportException을 발생시킨다. clone 메소드의 규약clone 메서드가 usper.clone이 아닌, 생성자를 호출해 얻은 인스턴스를 반환해도 컴파일러는 불평하지 않음clone을 재정의한 클래스가 final이라면 걱정해야 할 하위 클래스가 없으니 아래 관례..
toString을 항상 재 정의하라 Object의 toString 메서드가 우리가 생성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. 자바 문서에 Object 객체 toString 메서드를 확인해보면 결과값으로 간결한 정보를 담아 누구나 쉽게 읽을 수 있도록 해야하며 모든 서브 클래스가 재 정의하는걸 추천한다고 적혀있다. println, printf, 문자열 연결 연산자 (+), assert 구문같은 경우에는 객체를 호출할때 자동으로 toString 메서드를 호출한다. 그래서 toString 메서드를 잘 구현한 클래스는 사용하기도 편리하고 디버깅할때도 매우 유용하다. toString 정의 정적 유틸 클래스는 제외하고 실전에서는 사람 이름, 나이, 전화번호 등과 같은 객체가 가진 주요 정보들을 모..
equals는 일반 규약을 지켜 재정의하라 equals 메서드를 재 정의 할떄는 반드시 정의된 규약을 지키며 재 정의를 해야한다. 만약 이 규약을 어기면 그 객체를 사용하느 다른 객체들이 어떻게 반응할지 알 수 없다. equals 메서드의 일반 규약 equals 메서드는 동치관계를 구현하며 다음을 만족한다. 반사성(reflexlvity) 반사성은 null이 아닌 모든 참조 값 x에대해, x.equals(x)는 true이다. 단순히 말하면 객체는 자기 자신과 비교했을떄 항상 같아야한다는 것이다. 대칭성(symmetry) 대칭성은 null이 아닌 모든 참조값 x,y에 대해 x.equals(y)가 true면 y.equals(x)는 true이다. 두 객첸느 서로에 대한 동치 여부에 대해 똑같이 대답 해야한다는 ..
다 쓴 객체 참조를 해제하라 JAVA는 C, C++처럼 메모리를 직접 관리해주지 않아도 상황에따라 가비지 컬렉션이 작동하여 메모리를 정리해준다. 그래서 개발할때 메모리 관리에 신경을 쓰지 않아도 된다라고 오해할 수 있는데 잘못된 생각이다. 메모리 관리에 신경쓰지 않고 개발시 문제점 사용하지 않는데 값을 계속 참조하고있으면 가비지 컬렉션이 해당 값을 정리하지 못한다. 그렇게되면 메모리 사용량이 늘어나 성능이 저하되고 심할때는 디스크 페이징이나 OutOfMemoryError를 일으켜 프로그램이 종료 될 수 있으므로 다 쓴 참조는 null 처리 해주는게 좋으며 재 참조시 NullPointException을 발생시켜 조기에 문제점을 찾을 수 있다. 자기메모리를 직접 관리하는 클래스 사용시 주의할점 public ..
불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성해서 사용하기보다는 객체 하나를 재사용 하는 편이 나을때가 많다. 재사용은 빠르고 편하며, 불편 객체는 언제 재사용 할 수 있다. String s = new String("bikini"); String s = "bikini"; 위 두 코드는 문자열 bikini를 String 타입 s에 저장하지만 동작 방식이 다르다. 첫번째 코드는 매번 새로운 인스턴스를 Heap에 생성하여 변수에 할당하지만, 두번째 코드는 "bikini"라는 문자열이 처음 나왔을때만 Heap영역 string pool에 저장하고 리터럴 "bikini"를 사용하는 모든곳에서 공유되어 같은 객체를 재사용함이 보장된다. 값이 비싼 객체는 캐싱해두어 사용하기 객체중 생성 비용이 아주 비싼..
자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 대부분의 클래스는 하나 이상의 다른 클래스를 의존한다. 하지만 의존한 클래스가 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지 않는것이 좋다. 정적 유틸리티 public class SpellChecker { private static final Lexicon dictionary = new Lexicon(); private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } 싱글턴 public class SpellChecker { private fin..
인스턴스를 막으려거든 Private 생성자를 사용하라 Java에는 Arrays, Collections와 같은 유틸 클래스들이 있다. 이러한 유틸 클래스들은 대부분 정적 메서드 ( 혹은 정적 팩터리 메서드 ) 만 제공하는데, 이러한 클래스들은 인스턴스화 할 필요도 없고 인스터스 해서도 안된다. 그렇다면 이러한 클래스들은 유틸 클래스로 만들지 못하는게 가장 안전한데, 자바에서는 이를 쉽게 구현할 수 있다. 자바 특성상 클래스를 설계할때 생성자가 하나도 없다면 기본 public 생성자를 만들어 클래스를 인스턴스화 한다. 이 말은 설계시 생성자를 하나만이라도 생성하면 기본 public 생성자를 만들지 않는데, effective java에서는 private 생성자를 만들어 클래스를 인스턴스화는걸 막으라고 설명하고..
싱글턴 ( Singleton ) 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말하며 만들어진 값은 오직 시스템상에서 하나만 존재해야한다. 싱글턴으로 만들고 사용하기 싱글턴으로 만드는 방식은 크게 세가지 방식이 있다. 1. public static 맴버 변수 사용 public class Single { public static final Object INSTANCE = new Object(); private Single() { } } public class Main { public static void main(String[] args) { Object obj1 = Single.INSTANCE; Object obj2 = Single.INSTANCE; Object obj = new Object..
빌더 패턴 ( Builder Pattern ) 정척 팩터리 메서드와 생성자를 이용한 객체 생성 방식의 문제점 정적 팩터리 메서드를 이용해 객체 생성, 생성자를 이용한 객체 생성 방식에는 큰 문제가 하나있다. 어떤 객체는 상황에따라 받는 매개 변수의 형태가 다른 객체가 있을 수 있다. public class Some { private boolean value1; private boolean value2; private String value; public Some(String value) { this.value = value; } public Some(boolean value1, boolean value2) { this.value1 = value1; this.value2 = value2; } public ..
dobidugi
'이펙티브 자바' 태그의 글 목록