이펙티브 자바/9장 일반적인 프로그래밍 원칙 12

아이템 68 일반적으로 통용되는 명명 규칙을 따르라

- 자바 플랫폼은 명명 규칙이 잘 정립되어 있으며 특별한 이유가 없는 한 반드시 따라야 한다. 철자 규칙 - 소문자 알파벳, (드물게)숫자 - 조직 바깥에서도 사용될 패키지라면 인터넷 도메인 이름 역순 (ex: edu.cmu, com.google..) - 패키지 이름의 나머지는 해당 패키지를 설명하는 하나 이상의 요소. 일반적으로 8자 이하의 짧은 단어. (ex: util) - 하나 이상의 단어이며 대문자로 시작한다. - 널리 통용되는 줄임말을 제외하고는 단어를 줄여 쓰지 않도록 한다. - 첫글자를 소문자로 쓴다는 점만 빼면 클래스 명명 규칙과 동일하다. - 단, '상수 필드'는 예외. 상수 필드는 모두 대문자이며 단어 사이는 밑줄로 구분(ex: NEGATIVE_INFINITY) - 일반 필드 이름과 비..

아이템 67 최적화는 신중히 하라

- 빠른 프로그램보다는 좋은 프로그램을 작성하라. - 성능을 제한하는 설계를 피하라. 완성 후 변경하기가 가장 어려운 설계 요소는 바로 컴포넌트끼리, 혹은 외부 시스템과의 소통 방식이다. API, 네트워크 프로토콜, 영구 저장용 데이터 포맷 등이 대표적이다. - API 설계 시에도 성능에 주는 영향을 고려하라. public 타입을 가변으로 만들면, 즉 내부 데이터를 변경할 수 있게 만들면 불필요한 방어적 복사를 수없이 유발할 수 있다. 간단한 예시로 설명하면, 만약 메서드가 배열을 반환하는데 이 배열이 가변이라면, 클라이언트 코드에서는 해당 배열을 수정할 수 있다. 이로 인해 의도하지 않은 부작용이 발생할 수 있고, 이를 방어하기 위해 추가적인 조치를 취해야 한다. 방어적 복사(Defensive Copy..

아이템 66 네이티브 메서드는 신중히 사용하라

- 자바의 네이티브 인터페이스(Java Native Interface, JNI)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다. - 네이티브 메서드란 C나 C++같은 네이티브 프로그래밍 언어로 작성한 메서드를 말한다. - 즉, 자바 애플리케이션에서 C나 C++언어로 된 파일을 읽어들여 메소드 형태로 호출할 수 있게 하는 것이다. public class NativeExample { // 네이티브 메서드 선언 public native void nativeMethod(); // 정적 블록에서 라이브러리 로드 static { System.loadLibrary("NativeLibrary"); } // 메인 메서드 public static void main(String[] args) { NativeExamp..

아이템 65 리플렉션보다는 인터페이스를 사용하라

- 리플렉션 기능을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있다. - 그렇게 접근한 클래스의 생성자, 메서드, 필드의 인스턴스를 가져올 수 있고 조작할 수 있다. 컴파일타임 타입 검사가 주는 이점을 하나도 누릴 수 없다. 코드가 지저분하고 장황해진다. 성능이 떨어진다. 런타임에 존재하지 않을 수도 있는 다른 클래스, 메서드, 필드와의 의존성을 관리할 때 적합하다. 버전이 여러 개 존재하는 외부 패키지를 다룰 때 유용하다. 가동할 수 있는 최소한의 환경, 즉 주로 가장 오래된 버전만을 지원하도록 컴파일한 후, 이후 버전의 클래스와 메서드 등은 리플렉션으로 접근하는 방식이다.

아이템 64 객체는 인터페이스를 사용해 참조하라

- 적합한 인터페이스가 있다면 매개변수, 반환값, 변수, 필드 전부 인터페이스 타입으로 선언하라. - 적합한 인터페이스가 없다면 클래스로 참조해야 한다. String, BigInteger 같은 값 클래스. 값 클래스를 여러 가지로 구현될 수 있다고 생각하고 설계하는 일은 거의 없다. 클래스 기반으로 작성된 프레임워크가 제공하는 객체들. (ex: OutputStream 등 java.io 패키지의 여러 클래스) 인터페이스에는 없는 특별한 메서드를 제공하는 클래스들. (ex: PirorityQueue) - 실전에서는 주어진 객체를 표현할 적절한 인터페이스가 있는지 찾아서 그 인터페이스로 참조하면 된다. - 인터페이스가 없다면 필요한 기능을 만족하는 가장 덜 구체적인(상위의)클래스를 타입으로 사용하자.

아이템 62 다른 타입이 적절하다면 문자열 사용을 피하라

- 문자열은 다른 값 타입을 대신하기에 적합하지 않다. - 열거타입(enum), 혼합타입(EX: String key = goodsNo + "#" + itmNo), 권한(capacity)은 문자열로 표현하기에 적합하지 않다. - 권한(capacity)에 적합한 방법 중 하나는 java의 ThreadLocal의 내부처럼 ThreadLocal 클래스 자체를 고유 key로 해서 클라이언트의 중복을 피하는 방법이 있다.

아이템 61 박싱된 기본 타입보다는 기본 타입을 사용하라

- 기본 타입과 박싱된 기본 타입의 주된 차이 세 가지 1. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다. 즉, 값이 같아도 서로 다르다고 식별될 수 있다. 2. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다. 3. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. - 박싱된 기본 타입이 적절하게 쓰이는 경우 컬렉션의 원소, 키, 값. 컬렉션은 기본 타입을 담을 수 없으므로 어쩔 수 없다.