본문 바로가기

개발/[스터디] 이펙티브 자바

[이펙티브 자바] 아이템 57~61

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

- 가장 처음에 쓰일 때 선언한다

- 선언과 동시에 초기화한다. 

- for 문을 사용시, 인덱스가 반드시 필요한 경우가 아니라면 for-each로 대체하여, 잠재적인 버그를 수정하자. (코드 57-2 관련)

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

- 반복자(iterator())나 인덱스(i)가 필요하지 않다면 for-each로 대체하자. 

- for-each로 대체할 수 없는 경우

1) 컬렉션을 순회하면서 선택된 원소를 지워야하는 경우: 반복자의 remove 메서드 호출 필요 

    -> JAVA 8부터 removeIF 사용하여 간소화 가능 (예시: https://kdhyo98.tistory.com/38)

2) 컬렉션 순회하면서 원소의 값 일부/전체에 변형이 필요한 경우. 

3) 병렬 반복 -> 순서 유지를 위해 idx 사용.

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

- 미리 구현된 라이브러리를 사용하여, 개발의 핵심 내용에만 집중하자. 

  얘) Random.nextInt(int), 구글 구아바 라이브러리 

- java.lang, java.util. java.io 에는 익숙해지자. 

아이템 60. 정확한 답이 필요하다면 float과 double

- float과 double은 넓은 범위의 수를 정밀한 '근사치'로 계산한다. 

   -> 0.1, 10의 음의 거듭제곱등 표현 불가

        얘) 1.03 - 0.42 = 0.6100000000000001로 계산됨.

- 금융 관련 계산에서 사용금지

  -> 대신 BigDecimal, int, long을 사용하자

- BigDecimal vs int/long

   : BigDecimal

      (+) 범위 제한 x

      (-) 느리다. 기본타입보다 쓰기 불편하다. (예. price.add(TEM_CENTS))

   : long/int =

      (+) 빠르다. 사용 간편

      (-) 숫자 범위 제한 있음. 소수점 직접 관리해야한다.

아이템 61. 박싱된 기본 타입

- 기본타입 vs 박싱된 기본 타입

: int, long, boolean vs Integer, Long, Boolean

- 차이 

1. 값의 식별성: 박싱은 값이 같아도 다르다고 판별될 수 있다.

2. null 포함 가능 여부 (박싱은 null 가진다)

3 메모리 효율: 기본타입이 더 효율적

- 박싱 타입 사용시 주의 사항 

: == 사용하지 말것 (코드 61-1)

: 기본 타입과 박싱 타입을 혼용해서 사용하지 말자. NPE 발생할 수도 있다. (코드 61-3)

: 반복문 내부에서 객체에 변화가 가해질 경우, 사용금지 (61-4)

- 언제 박싱 타입 쓸까

1. 컬렉션의 원소, 키 값으로 사용

2. 리플렉션 통해 메서드 호출시