티스토리 뷰

  • 아이템 57. 지역변수의 범위를 최소화하라
  • 아이템 58. 전통적인 for 문 보다는 for-each 문을 사용하라
  • 아이템 59. 라이브러리를 익히고 사용하라
  • 아이템 60. 정확한 답이 필요하다면 float와 double은 피하라
  • 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라
  • 아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라
  • 아이템 63. 문자열 연결은 느리니 주의하라
  • 아이템 64. 객체는 인터페이스를 사용해 참조하라
  • 아이템 65. 리플렉션보다는 인터페이스를 사용하라
  • 아이템 66. 네이티브 메서드는 신중히 사용하라
  • 아이템 67. 최적화는 신중히 하라
  • 아이템 68. 일반적으로 통용되는 명명 규칙을 따르라

 

아이템 57. 지역변수의 범위를 최소화하라

지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다.

지역변수의 범위를 줄이는 가장 강력한 기법은 역시 '가장 처음 쓰일 때 선언하기'다.

거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다.

반복 변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이 아니라면 while 문보다는 for 문을 쓰는 편이 낫다.

메서드를 작게 유지하고 한 가지 기능에 집중하라.

 

아이템 58. 전통적인 for 문 보다는 for-each 문을 사용하라

for-each 문을 사용할 수 없는 세 가지 상황

  • destructive filtering - 컬렉션을 순회하면서 선택된 원수를 제거해야 하는 경우(remove 사용)
    cf. 자바 8부터는 Collection의 removeIf를 통해 컬렉션을 명시적으로 순회하는 일을 피할 수 있다.
  • transforming - 순회하면서 그 원수의 값을 교체해야 하는 경우
  • parallel iternation - 여러 컬렉션을 병렬로 순회하는 경우

 

아이템 59. 라이브러리를 익히고 사용하라

표준 라이브러리를 활용해야 하는 이유는

  • 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
  • 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 된다.
  • 따로 노력하지 않아도 성능이 지속해서 개선된다.
  • 기능이 점점 많아진다.
  • 많은 사람에게 낯익은 코드가 된다.

자바 프로그래머라면 적어도 java.lang, java.util, java.io와 그 하위 패키지들에는 익숙해져야 한다.

 

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

float와 double 타입은 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안된다.

금융 계산에는 BigDecimal, int 혹은 long을 사용해야 한다.

  • 숫자를 아홉자리 십진수로 표현할 수 있다면 int
  • 열여덟 자리 십진수로 표현할 수 있다면 long
  • 열여덟 자리를 넘어가면 BigDecimal

 

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

기본 타입과 박싱된 기본 타입의 주된 차이 세 가지

  • 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다.
  • 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다.
  • 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다.

박싱된 기본 타입을 써야 하는 경우

  • 컬렉션의 원소, 키, 값으로 쓸 때
  • 리플렉션을 통해 메서드를 호출할 때

 

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

일단 문자열 타입으로 입력 받고 그것을 다시 형변환하지 말고 애초에 상황에 맞는 적절한 값 타입으로 받을 것

상수를 열거할 때는 문자열 대신 열거 타입을 사용할 것 

여러 요소가 혼합된 데이터를 문자열로 파싱하여 사용하지 말고 전용 클래스를 새로 만들 것 

문자열은 권한(capacity)를 표현하기에 적합하지 않다. 문자열 대신 위조할 수 없는 키를 사용해야 한다.

 

아이템 63. 문자열 연결은 느리니 주의하라

문자열 연결 연산자로 문자열 n개를 잇는 시간은 n 제곱에 비례한다.

성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하자.

 

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

적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라.

적합한 인터페이스가 없다면 클래스의 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인(상위의) 클래스를 타입으로 사용하자.

 

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

리플렉션은 아주 제한된 형태로만 사용해야 그 단점을 피하고 이점만 취할 수 있다.

리플렉션은 인스턴스 생성에만 쓰고, 이렇게 마든 인스턴스는 인터페이스나 상위 클래스로 참조해 사용하자.

 

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

네이티브 메서드의 주요 쓰임 세 가지

  • 레지스트리 같은 플랫폼 특화 기능 사용
  • 네이티브 코드로 작성된 기존 라이브러리 사용
  • 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성

성능을 개선할 목적으로 네이티브 메서드를 사용하는 것은 거의 권장하지 않는다.

네이티브 언어는 메모리 훼손 오류로부터 안전하지 않고 자바보다 플랫폼을 많이 타서 이식성도 낮고 디버깅도 더 어렵다.

 

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

성능 때문에 견고한 구조를 희생하지 말자. 빠른 프로그램보다는 좋은 프로그램을 작성하라.

성능을 제한하는 설계를 피하라.

API를 설계할 때 성능에 주는 영향을 고려하라.

최적화를 했다면 각각의 최적화 시도 전후로 성능을 측정하라. 프로파일링 도구(profiling tool)은 최적화 노력을 어디에 집중해야 할지 찾는 데 도움을 준다. [JMH]

 

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

패키지 이름의 각 요소는 일반적으로 8자 이하의 짧은 단어로 한다. (uitilities보다는 util처럼 의미가 통하는 약어를 추천)

클래스와 인터페이스의 이름은 단어를 줄여 쓰지 않도록 한다.

지역변수에서는 약어를 써도 좋다. 약어를 써도 그 변수가 사용되는 문맥에서 의미를 쉽게 유추할 수 있기 때문이다.

'공부 > 이펙티브 자바' 카테고리의 다른 글

12장 직렬화 (아이템 85 ~ 90)  (0) 2020.03.30
11장 동시성 (아이템 78 ~ 84)  (0) 2020.03.24
10장 예외 (아이템 69 ~ 77)  (0) 2020.03.17
8장 메서드 (아이템 49 ~ 56)  (0) 2020.03.08
이펙티브 자바 스터디  (0) 2020.03.07
댓글