Effective Java, 일반적인 프로그래밍 원칙들

지역 변수의 유효범위를 최소화하라

  • 처음으로 사용하는 곳 바로 위에 선언하라

  • 거의 모든 지역 변수 선언에는 초기값이 포함되어야 한다.

  • while문 보다는 for문을 사용하라

  • 메소드의 크기를 줄이고 특정 기능에 집중하라

  • 하나의 메소드에 서로 다른 기능을 구현하면 유효 변수가 침해 될수 있으므로

  • for문 보다는 for-each문을 사용하라

Ex )
For (Suit suit : suits)
	For (Suit suit : suits)
		deck.add(new Card(suit, rank));

For-each문의 장점

  • 지역 변수 유효범위 자동적으로 최소화
  • For문에 비해 간단명료
  • 버그 발생 가능성 적음
  • 성능도 for문에 뒤지지 않음

But 필터링, 변환, 병렬 순회에서는 for-each문은 못씀

For-each문으로는 컬렉션과 배열 뿐만아닐 Iterable 인터페이스를 구현하는 어떤 객체도 순회할 수 있다.

Public interface Iterable<E> {
	// 이 Iterable 안에 있는 원소들에 대한 반복자 반환
	Iterator<E> iterator();
}

어떤 라이브러리가 있는지 파악하고, 적절히 활용하라

정확한 답이 필요하다면 float와 double은 피하라

BigDecimal, int, Long을 사용하라

객체화된 기본 자료형 대신 기본 자료형을 이용하라

가능하다면 기본 자료형을 사용하라, 기본자료형이 더 단순하고 빠르다. 자동 객체화는 번거로운 일을 줄여주긴 하지만 객체화된 기본 자료형을 사용할때 생길수 있는 문제들까지 없애주진 않는다. 객체화된 기본 자료형 객체 두개를 ==으로 비교한다는 것은 그두 객체의 신원을 비교한다는 것이다. 객체화딘 기본 자료형과 기본 자료형을 한 표현식 안에 뒤섞으면 비객체화가 자동으로 일어나며 그과정에서 NullPointerException이 발생할 수 있다. 기본 자료형 값을 객체화 하는 과정에서 불필요한 객체들이 만들어지면 프로그램 성능이 저하될수도 있다.

자바의 자료형 시스템은 크게 두 가지이다.

  • Int, double, boolean 등 기본 자료형(primitive type)
  • String, List 등 참조 자료형(reference type)

자동 객체화와, 자동 비객체화, auto unboxing, auto boxing의 차이점을 명확히 하라

기본 자료형과 객체화된 기본 자료형 사이에는 세 가지 큰 차이점이 있다. 기본 자료형은 값만 가지지만 객체화된 기본 자료형은 값 외에도 Identity를 가진다. 따라서 객체화된 기본 자료형 갹채가 두개 있을때, 그 값은 같더라도 identity가 다를수 있다. 기본 저료형에 저장되는 값은 전부 기능적으로 완전한 값이지만, 객체화된 기본 자료형에 저장되는 값에는 그 이외에도 아무 기능도 없는 값, 즉 NULL이 하나 있다. 기본 자료형은 시간이나 공간 요구량 측면에서 일반적으로 객체 표현형보다 효율적이다.

ps. ==연산자를 조심하라, 객체 끼리 비교에서는 객체가 같은지 신원을 비교한다.

ps2. 객체화된 기본 자료형에 == 연산자를 사용하는 것은 거의 항상 오류라고 봐야한다.

ps3. 객체화된 자료형은 자료형 내부의 값을 담을 지역 변수에 담아서 비교하고 연산하는게 가장 확실한 방법이다.

ps4. 기본 자료형과 객체화된 기본자료형을 한 연산안에 엮어 놓으면 갹채화된 기본자료향은 자동으로 기본 자료형으로 변환된다.

다른 자료형이 적절하다면 문자열 사용은 피하라

  • 문자열로 해서는 안되는 일
  • 문자열은 값 자료형을 대신하기에는 부족하다.
  • 데이터가 네트워크나 표준 입출력으로 들어올때 데이터의 자료형으로 맞춰 변환하라
  • 문자열은 혼합 자료형(aggregate)을 대신하기에는 부족하다

//문자열을 혼합 자료형으로 써먹은 부적절한 사례 String compoundKey = className + ‘#’ + i.next();

문자열 연결시 성능에 주의하라

리플렉션 대신 인터페이스를 이용하라

일반적인 프로그램은 프로그램 실행중에 리플렉션을 통해 객체를 이용하려 하면 안된다는 것이다 리플렉션을 아주 제한적으로만 ㅏ용하면 오버헤드는 피하면서도 리플렉션의 다양한 장점을 누릴수 있다 객체 생성ㅇㄴ 릴플렉션으ㅡ로 하고 객체 참조는 인터페이스나 상위 클래스를 통하면 된다

네이티브 메서드는 신중하게 사용하라

네이티브 메서드를 통해 성능을 개선하는 것은 추천하고 싶지 않다, 네이티브 코드에 있는 아주 작은 버그라도 시스템 전체를 훼손 시킬수 있다

신중하게 최적화하라

모든 ㅍ로그래머가 알아둬야 하는 최적화 관련 격언이 세 가지 있다. 맹목적인 어리석음을 비롯한 다른 어떤 이유보다도 효율성이라는 이름으로 저질러지는 죄악이 더 많다(효율성을 바드시 성취하는 것도 아니면서 말이다.) 작은 효율성에 대해서는 말하자면 97%정도ㅔ 대해서는 잊어버려라 섣부른 최적화는 모든 악의 근원이다. 최적화를 할 때는 아래의 규칙을 따르라

  • 규칙 1 : 하지마라
  • 규칙 2: (전문가들만 따를 것) 아직은 하지 마라 - 완벽히 명료한 최적화 되지 않은 해답을 얻을 때까지는

출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 10쪽 인용.