책
-
item 42 익명 클래스보다는 람다를 사용하라책/이펙티브 자바 2022. 4. 6. 17:17
ITEM 42 익명 클래스보다는 람다를 사용하라 예전 자바에서 함수 타입을 표현하는 경우 추상 메서드를 하나만 담은 인터페이스(드물게는 추상클래스)를 사용했다 이런 인터페이스를 함수객체(function object)라고 하여 특정 함수나 동작을 나타내는 경우 사용 jdk 1.1 등장 이후 함수 객체를 만드는 주요 수단은 익명클래스가 되었다 문자열을 길이 순으로 정렬하는 코드(정렬을 위한 비교 함수로 익명 클래스를 사용한다) 익명 클래스의 인스턴스를 함수 객체로 사용하는 방법 (옛날방법) Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s..
-
item 41 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라책/이펙티브 자바 2022. 4. 6. 10:38
ITEM 41 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 마커 인터페이스 아무 메서드도 담고 있지 않으며 자기 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스 Serializable 인터페이스가 좋은 예다 Serializable은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 write를 사용 가능하다고 알려준다(직렬화 가능) 마커 애너테이션이 등장하면서 마커 인터페이스는 구식이 되었다는 말이 있지만 사실이 아니다 마커 인터페이스는 마커애너테이션보다 두 가지 측면에서 좋다 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나 마커 애너테이션은 그렇지 않다 마커 인터페이스는 어엿한 타입이기 때문에 마커 애너테이션을 사용..
-
item 40 @Override 애너테이션을 일관되게 사용하라책/이펙티브 자바 2022. 4. 6. 10:17
ITEM 40 @Override 애너테이션을 일관되게 사용하라 자바가 기본으로 제공하는 애너테이션 중 보통 개발자에게 가장 중요한 것은 @Override일 것이다 @Override는 메서드 선언부에만 달 수 있고 이 애노테이션이 달려있다는 것은 상위 타입의 메서드를 재정의 했다는 것이다 이 애너테이션을 일관되게 사용한다면 여러 가지 악명 높은 버그를 예방해준다 영어 알파벳 2개로 구성된 문자열을 표현하는 클래스 - 소문자 2개로 구성된 바이그램 26개를 10번 반복해 집합에 넣고 크기를 출력한다 - Set은 중복을 허용하지 않으니 26을 기대하지만 260이 출력된다 public class Bigram { private final char first; private final char second; pub..
-
item 39 명명 패턴보다 애너테이션을 사용하라책/이펙티브 자바 2022. 4. 6. 09:43
ITEM 39 명명 패턴보다 애너테이션을 사용하라 전통적으로 도구나 프레임워크가 특별히 다뤄야 할 프로그램 요소에는 딱 구분되는 명명 패턴을 적용했다 명명 패턴은 효과적인 방법이지만 단점도 크다 오타가 나면 안된다 jUnit 버전 3까지 테스트 메서드 이름을 test로 시작하게 했는데 test가 아닌 tset이런식으로 오타나 나게되면 해당 메서드를 무시하고 지나치게 된다 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다는 것이다 클래스 이름을 TestSafetyMechanisms로 지어 jUnit에 던졌다고 가정했을때 jUnit은 클래스 이름은 신경을 쓰지 않는다 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다 특정 예외를 던져야 성공하는 테스트인경우 기대하는 예외 타입을 테스트에 매개변수로..
-
item 38 확장 할 수 있는 열거타입이 있으면 인터페이스를 사용하라책/이펙티브 자바 2022. 4. 6. 09:42
ITEM 38 확장 할 수 있는 열거타입이 있으면 인터페이스를 사용하라 열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴(typesafe enum pattern)보다 우수하다 한가지 예외적인 경우는 타입 안전 열거 패턴은 확장할 수 있지만 열거 타입은 그럴 수 없다 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있지만 열거 타입은 그렇게 할 수 없다 실수로 이렇게 설계한 것이 아니며 대부분의 상황에서 열거 타입을 확장하는건 좋지 않다 확장한 타입의 원소는 기반 타입의 원소로 취급하지만 그 반대는 성립하지 않는다면 이상하다 또한 기반 타입과 확장된 타입들의 원소 모두를 순회하는 방법도 마땅하지 않다 확장성을 높이려면 고려 할 요소가 늘어나 설계와 구현이..
-
item 37 oridinal 인덱싱 대신 EnumMap을 사용하라책/이펙티브 자바 2022. 4. 6. 09:42
ITEM 37 oridinal 인덱싱 대신 EnumMap을 사용하라 배열이나 리스트에서 원소를 꺼낼 때 ordinal 메서드로 인덱스를 얻는 코드가 있다 식물을 간단하게 나타낸 클래스 class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } } 정원에 심은 식물들을 배열 하나로 관리하고 이들을 생애주기별로 묶어보자 생애주기..
-
item 35 ordinal 메서드 대신 인스턴스 필드를 사용하라책/이펙티브 자바 2022. 3. 29. 17:27
ITEM 35 ordinal 메서드 대신 인스턴스 필드를 사용하라 대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal 이라는 메서드를 제공한다 이렇게 제공을 하니까 열거 타입 상수와 연결된 정숫값이 필요하면 ordinal 메서드를 쓰고 싶어진다 합주단의 종류를 연주자가 1명인 솔로부터 10명인 디텍트 까지 정의한 열거타입 ordinal을 잘못 사용한 예제 public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET public int numberOfMusicians() { return ordinal(..
-
item 34 int 상수 대신 열거 타입을 사용하라책/이펙티브 자바 2022. 3. 28. 13:35
ITEM 34 int 상수 대신 열거 타입을 사용하라 열거타입 일정 개수의 상수 값을 정의하고 그 외의 값은 허용하지 않는 타입 정수 열거 패턴 자바에서 열거 타입을 지원하기 전에 사용하던 패턴으로 정수 상수를 한 묶음 선언해서 사용하는 단점이 많은 패턴이다정수 열거 패턴 public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE..
-
문자열 계산기 정리책/자바 웹 프로그래밍 next step 2022. 3. 27. 22:54
정리 앞에서 문자열 계산기의 개발 과정은 구현 > 테스트를 통한 결과 확인 > 리팩토링으로 진행되었다 이 과정 중 보통 개발자들은 리팩토링을 소홀하게 한다 깔끔하고 읽기 좋은 코드를 위해서는 리팩토링 역량이 중요하기 때문에 꾸준히 연습하자 추후 개발을 진행하는 경우에도 아래의 3가지 원칙을 지키도록 노력하자 메서드가 한 가지 책임만을 가지도록 한다 인덴트(indent , 들여쓰기) 깊이를 1단계로 유지한다 while 문과 if문을 사용할 경우 인덴트 깊이가 1씩 증가한다 아래 예제는 인덴트가 2다 while (true) { if (true) { } } else를 사용하지 마라 리팩토링을 진행하면서 어디를 고쳐야 될지 모르겠다면 위의 3가지 원칙을 생각해보자 앞에서 리팩토링을 극단적으로 진행이 가능했던 이..