요즘 Effective Java (이펙티브 자바) 책을 보고 있어.
옛날에 2006년 쯤에 1판인가를 보다가
중간에 관뒀던 기억이 나.
읽다가 중간중간 뭔소린지 모르겠는것은
3년이 지나도 여전하네.
그래도
그때보단 술술 책장이 넘어가는 편이고
내가 겪은 코드문제들이 더러 있어서 좀 재밌다.
항목 46 : 종전의 for루프보다는 for-each루프를 사용하자.
아마도 컬렉션 객체 사용시에 이렇단 얘기겠지?
for-each문은 for문에 비해서 약간의 성능향상이 있을 수 있다. 배열 인덱스의 한계 값을 한번만 계산하기 때문.
1.5부터 추가된 for-each구문
for(Element e : elements) {
doSomething(e);
}
단, 병행반복처리(Parallel iteration)의 경우 여러 컬렉션의 요소들을 오가면서 처리할 필요가 있다면 인덱스 변수를 명시적으로 사용할테니 종전의 for문만 가능하겠다.
항목 48 : 정확한 계산, 금전계산에는 float나 double타입을 쓰지 말자.
(얼래.. 작년에 알바로 ERP 개발할 때 간혹 double질 한 코드 본 기억이.. ㅡㅡ;;)
float, double타입은 과학, 공학 계산을 목적으로 설계되어서 이진 부동소수점 연산을 통해 넓은 범위의 수에 대해
"정확한 근사치"를 빨리 산출하기 위해 사용된대. 실제로 소수점 계산 시 이상한 값이 나오지.
BigDecimal, int, long 타입 중 하나를 사용하도록 하라.
(int는 범위가 작으니 long을 쓰게 되더라.)
BigDecimal은 기본형 데이터(int, long)에 비해 다소 사용이 불편하고 성능의 저하가 예상되지만,
반올림이 수반되는 연산 시 완벽히 반올림을 제어할 수 있다. 그리고 너무 큰 수에 사용한다.
항목 26 : 제네릭 타입을 애용하자
C++의 템플릿과 유사한 면이 있지만 장점이 있어.
캐스팅을 해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기 쉽다.
Stack <String> stack = new Stack<String>();
stack.push(arg[0]);
String str = stack.pop(); // 캐스트 없이 바로 써먹을 수 있자네.
해당 코드를 제네릭하게 만들 수가 있다는 얘기.
항목 27 : 제네릭 메소드를 애용하자
책 내용이 쫌 어렵다. 아씨
실제로 Collections 클래스의 모든 알고리즘 메소드들은 제네릭화 되어있대.
// 제네릭 메소드
public static <E> Set<E> union(Set<E> s1, Set<E> s2) { ........; }
타입추론(type inference) : 컴파일러는 union메소드의 인자가 모두 Set<String>이라는 것을 알 때에,
타입 매개변수 E 또한 String이 되어야만 한다는 것을 알게 돼. 이런 처리를 타입추론이라고 한대.
항목 51 : 문자열 결합의 성능저하에 주의
이건 꽤 유명한 내용이야. java 성능에 대한 책마다 나오네.
n개의 문자열을 +로 붙여 쓸 때 n의 제곱에 비례하는 시간이 소요된다.
두 문자열의 결합될 때 두 값 모두 복사되어 하나의 문자열을 만들기 때문이래.
따라서 StringBuilder를 사용하자. (자바 1.5에서 추가, StringBuffer의 비동기화 버전이래)
항목 52 : 객체 참조는 그 객체의 인터페이스 타입으로 하자.
인터페이스로 객체의 타입을 사용하는 습관을 들이면 프로그램이 유연해진다.
// 좋다.
List<Subscriber> subscribers1 = new Vector<Subscriber>();
// 나쁘다.
Vector<Subscriber> subscribers2 = new Vector<Subscriber>();
위의 subscriber1의 구현체 클래스를 살짝 바꿀때 new 다음에 나오는 생성자만 바꾸면 (Vector대신 딴거)
주위의 해당 코드들은 전혀 알아채지 못하고 그대로 사용할 수 있다. (예외 있지. Vector만의 기능을 쓴 경우 gg)
하여간 인터페이스나 덜 특화된 슈퍼클래스를 사용하는 것이 좋대.
항목 56 : 보편화된 작명 규칙을 따르자.
자바 플랫폼은 안정된 작명규칙(naming convention)을 갖고 있으며 대부분은 JLS(The Java Language Specification], 6.8에 포함되어 있대.
패키지 : com.google.inject, org.joda.time.format
클래스, 인터페이스 : Timer, HttpServlet
메소드, 필드 : remove, getSrc
상수 필드 : MIN_VALUE
지역 변수 : i, xref, houseNumber
타입 매개 변수 : T(임의타입), E(컬렉션요소), K(키), V(값), X(예외), T1, T2
항목 57 : 예외 상황에서만 예외를 사용하자
예외를 발생시켜 특정 구문에 대한 조건을 준다거나 하는 코드를 본 것 같은데 그러지 말래
난 예외로 루프를 제어하는 코드를 예전에 본 적이 있어. 우왓 새로운 아이디어! 라고 생각했었는데 ㅡㅡ;
예외 기반의 루프는 성능이 안좋아. 목적이 불순하고 버그를 감추고 블라블라 하여간 나빠.

















댓글을 달아 주세요
댓글 RSS 주소 : http://kk67547.cafe24.com/blog/rss/comment/134