이펙티브자바35 [Effective Java] 아이템34 int 상수 대신 열거 타입을 사용하라 ■ 정수 열거 패턴 기법 자바에서 열거 타입을 지원하기 전에는 다음 코드처럼 정수 상수를 한 묶음 선언해서 사용하곤 했다. public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int ORANGE_NAVEL = 0 public static final int ORANGE_TEMPLE = 1; 정수 열거 패턴 기법에는 단점이 많다. 1. 타입 안전을 보장할 방법이 없으며 표현력이 좋지 않다. 예를들어 APPLE_FUJI를 사용해야할 곳에 ORANGE_NAVEL을 사용해도 둘다 정수 0이기 때문에 컴파일 때 문제가 없다. 또한 이름공간을 지원하지 않기 때문에 접두어를 사용해서 이름 .. 2021. 6. 6. [Effective Java] 아이템30 이왕이면 제네릭 메서드로 만들라 클래스와 마찬가지로 메서드도 제네릭으로 만들 수 있다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭이다. 예를 들어 Collections의 알고리즘 메서드(binarySearch, sort 등)는 모두 제네릭이다. ■ 로 타입 사용 - 타입 안전성 보장 불가 아래 코드는 컴파일은 되지만 경고가 두 개 발생 한다. public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 타입 안전성을 보장하기 위해서 원소 타입을 타입 매개변수로 명시하고 메서드 안에서도 이 타입 매개변수만 사용하게 수정하면 된다. 이 때 타입 매개변수들을 선언하는 타입 매개변수 목록은 메서드.. 2021. 5. 29. [Effective Java] 아이템29 이왕이면 제네릭 타입으로 만들라 Object를 사용할 경우 클라이언트가 매번 형변환을 해야하고 그 과정에서 Runtime 에러가 발생하는 것을 막기 위해 이왕이면 제네릭타입으로 만들자. ■ Object기반 스택 이 클래스는 제네릭 타입이어야한다. 스택에서 꺼낸 객체를 형변환할 때 런타임 오류가 발생할 수 있다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); .. 2021. 5. 23. [Effective Java] 아이템27 비검사 경고를 제거하라 ■ 비검사 경고 제네릭을 사용하면 수많은 컴파일러가 경고를 보게 될 것이다. 제네릭에 익숙해질수록 경고 수가 줄어들 것이다. Set exaltation = new HashSet(); //-> 컴파일러가 알려준 타입 매개변수를 명시하지 않고 만으로 해결가능 Set exaltation = new HashSet(); ■ 할 수 있는 한 모든 비검사 경고를 제거하라. 비검사 경고를 모두 제거하면 그 코드는 타입 안정성이 보장된다. 즉, 런타임에 ClassCastException이 발생할 일이 없다는 것 이다. ■ SuppressWarnings 경고를 제거할 수 없지만 타입 안전하다고 확실할 수 있으면 @SuppressWarnings("unchecked") 애너테이션을 달아 경고를 숨기자. 안전하다고 검증된 비검.. 2021. 5. 22. [Effective Java] 아이템24 멤버 클래스는 되도록 static으로 만들라 ■ 중첩 클래스 중첩 클래스란 다른 클래스안에 정의된 클래스를 말한다. 중첩 클래스에는 4가지 종류가 있다. 이중 정적 멤버 클래스를 제외한 클래스를 내부 클래스(inner class)라고 부른다. 정적 멤버 클래스 멤버 클래스 익명 클래스 지역 클래스 ■ 중첩 클래스 사용 이유 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있다. 서로 관련 있는 클래스들을 논리적으로 묶어, 코드의 캡슐화를 증가시킬 수 있다. 외부에서 내부 클래스에 접근할 수 없으므로 코드의 복잡성을 줄일 수 있다. 외부 클래스의 복잡한 코드를 내부 클래스로 옮겨 코드 복잡성을 줄일 수 있다. ■ 정적 멤버 클래스 정적 멤버 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점을 제외.. 2021. 3. 1. [Effective Java] 아이템23 태그 달린 클래스보다는 클래스 계층구조를 활용하라 ■ 태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있으며, 그중 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 본적이 있을 것 이다. 다음은 원과 사각형을 표현할 수 있는 클래스이다. 태그 달린 클래스의 단점은 아래와 같다. 여러 구현이 하나의 클래스에 혼합돼있어서 가독성이 나쁘다. 다른 의미를 위한 코드도 항상 함께하니 메모리도 많이 사용한다. 필드들을 final로 선언하려면 해당 의미에 쓰이지 않는 필드들까지 생성자에서 초기화해야한다. 새로운 의미를 추가하려면 모든 switch문을 찾아 새 의미를 처리하는 코드를 추가해야한다. 즉, 장황하고 오류를 내기 쉽고 비효율적이다. // 코드 23-1 태그 달린 클래스 - 클래스 계층구조보다 훨씬 나쁘다! (142-143쪽) class Figure .. 2021. 3. 1. 이전 1 2 3 4 5 6 다음