본문 바로가기
728x90

JAVA77

item 36. 비트 필드 대신 EnumSet을 사용하라 과거 .. 열거 값들이 집합으로 사용되는 경우 비트 마스킹을 활용한 정수 열거 패턴을 사용하곤 했다. public class Text { public static final int STYLE_BOLD = 1 2022. 5. 31.
item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라 ordinal method가 뭘까? 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환해주는 메서드. (모든 열거 타입이 이를 제공한다.) // 앙상블 종류를 1명 앙상블부터 10명 앙상블까지 정의한 열거 타입. public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SETPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } "이렇게 쓰면 망하는 지름길" } 왜 이렇게 쓰면 안될까? 상수 선언 순서를 바꾸는 순간 위 numberOfMusicians()는 제대로 동작하지 않는다. 이미 사용 중인 정수와 값이 같은 상수는 추가할 수 없다. 값을.. 2022. 5. 31.
item 34. 상수 대신 열거 타입을 사용하라 정수 열거 패턴(int enum pattern) - Java에서 열거 타입을 지원하기 전 사용했던 방식 - 타입 안전을 보장하지 않는다. - 표현력이 좋지 않다. - 별도 이름 공간을 지원하지 않는다. - 평범한 상수를 나열한 것 뿐. 따라서 컴파일하면 값이 클라이언트 파일에 그대로 새겨진다. - 상수 값이 바뀐다면 클라이언트는 재컴파일 해야 함. - 문자열로 출력하기 까다롭다. 문자열 열거 패턴(string enum pattern) - 정수 대신 문자열 상수를 사용하는 패턴 - 상수의 의미를 출력할 수 있다. - 문자열 값을 그대로 하드코딩 해야 함 - 문자열 비교를 통해 성능지 저하됨 자바 열거 타입(enum type) - 위 열거 패턴들의 단점을 해결하기 위한 대안 열거 타입 자체는 클래스이다. 상.. 2022. 5. 31.
item 33. 타입 안전 이종 컨테이너를 고려하라. 타입안전이종..컨..머시기..ㅇ_ㅇ 제네릭은 Set, Map 등의 컬렉션과 ThreadLocal, AtomicReference 등의 단일원소 컨테이너에도 흔히 쓰인다고 한다. 위와 같은 경우 매개변수화 되는 대상은 원소가 아닌 컨테이너 자신이다. -> 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한된다. 이는 컨테이너의 일반적인 용도에 맞게 설계된 것이다. 컨테이너란, 대충 큰 범주로 생각해봤을 때 값을 저장할 수 있는 객체를 의미하는 것이므로.. 그런데? 일반적으로 제네릭에서 타입의 수가 제한된다. -> 이 부분이 문제가 되는 것이다. 예를 들어 위 예시의 Map과 같은 경우, V타입을 통해서만 벨류를 저장할 수 있다. 따라서 파라미터화 된 제네릭 타입 Map이 있다면? Double.. 2022. 5. 17.
item 31. 한정적 와일드카드를 사용해 API 유연성을 높여라. 시작 하기 전에 : 매개변수화 타입 : 불공변 -> "서로 상-하위 타입의 관계가 아니다" 라는 것을 기억해야 한다. List가 상-하위 타입이 아닌 이유는 다 알 것이라 생각.. 리스코프 치환 원칙에도 어긋나고, 말도 안된다. 그럼, 불공변 방식보다 유연한 타입은 없을까? -> 한정적 와일드카드 타입! "한정적 와일드카드 타입을 사용하지 않은 메서드" public void pushAll(Iterable src) { for (E e : src) { push(e); } } "컴파일은 되지만, 결함 존재" // Iterable src원소 타입이 스택의 원소 타입과 일치할 때만 잘 작동한다. // 그렇지 않을 경우 매개변수화 타입은 불공변이기 때문에 imcompatible type error 발생 "한정적 와.. 2022. 5. 17.
item 30. 이왕이면 제네릭 메서드로 만들어라 딱봐도 어려워보인다 제네릭 메서드란? 메서드의 선언부에 적은 제네릭으로 리턴 타입, 파라미터의 타입이 정해지는 메서드 제네릭 메서드를 알기 전에 static 변수에 대해서 말해보자... static 변수에는 제너릭을 사용할 수 없다. static은 클래스가 인스턴스가 되기 전에 메모리에 올라가는데, 이 때 static 변수의 타입인 T가 결정되지 않기 때문에 사용할 수 없는 것이다. 같은 이유로 static 함수에도 제너릭을 사용할 수 없다. 그럼 이럴때 어떻게 하느냐 ??? 이럴 때 제너릭 메서드를 사용한다. 제너릭 메소드는 호출 시에 매게 타입을 지정하기 때문에 static 메서드로 만들 수 있다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 대부분 제네릭 메서드이다. 그냥 로 타입을 사용한 메서드.. 2022. 5. 14.
728x90