개발서적/Effective Java
[Effective Java] 박싱된 기본 타입보다는 기본 타입을 사용하라
자바의 데이터 타입 기본 타입 : int, double, boolean 참조 타입 : String, List, 각각의 기본 대응되는 박싱 타입 오토박싱과 오토언박싱 덕분에 기본 타입과 박싱 타입을 크게 구분하지 않고 사용할 수 있지만. 이 둘 사이의 분명한 차이는 존재한다. 기본 타입 vs 박싱 타입 기본 타입은 값만 가지고 있지만, 박싱 타입은 값에 더해 식별성이란 속성을 갖는다. 값이 같아도 서로 다르다고 식별될 수 있다. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값(null)을 가질 수 있다. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 박싱된 기본 타입에 == 연산자를 사용할 땐 주의하라. 다음 코드를 이용하여 백만 개짜리 리스트를 넣거나..
[Effective Java] 정확한 답이 필요하다면 float와 double은 피하라
부정확한 계산 float와 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 설계되었다. 예를 들어 1.03달러에서 42센트를 썻을 때 남은 금액을 표현해보자. System.out.println(1.03 - 0.42) 이 코드는 0.61000000000001을 출력한다. 정확한 계산 이런 문제를 올바로 해결하려면 BigDecimal, int혹은 long을 사용해야 한다. 특히 금융권에서는 float와 double은 사용하지 말자. BigDecimal 앞의 코드를 double이 아닌 BigDecimal을 사용하면 문제가 해결된다. 하지만 기본 타입보다 쓰기 훨씬 불편하고 느리다는 단점이 있다. BigDecimal의..
[Effective Java] 라이브러리를 익히고 사용하라
흔하지만 문제가 많은 코드 다음 random() 클래스를 사용한 코드를 보자. static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } 이 코드는 다음과 같은 문제가 있다. n이 크지 않은 2의 제곱수라면 같은 수열이 반복된다. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. 지정한 범위 바깥의 수가 나올 수 있다. (반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문) 이 결함을 해결하기 위해 Random.nextInt(int) 메서드를 사용할 수 있다. 자바 7부터는 Random을 더 이상 사용하지 않는 것이 좋다. ThreadLocalRa..
[Effective Java] 전통적인 for 문보다는 for-each 문을 사용하라
전통적인 for 문을 이용한 컬렉션 순회 for(Iterator i = c.iterator(); i.hasNext(); ) { Element e = i.next(); } for (int i = 0; i < n; i++) { ...// do sth with a[i] } 이러한 for문은 while 문 보다는 낫지만 가장 좋은 방법은 아니다. 박복자와 인덱스 변수는 모두 코드를 지저분하게 할 뿐 우리에게 진짜 필요한 건 원소들 뿐이다. 잘못된 변수를 사용했을 때 컴파일러가 잡아주기 힘들다 컬렉션이나 배열이냐에 따라 코드 형태가 달라진다. 중첩 for문의 찾기 어려운 버그 enum Suit { CLUB, DIAMOND, HEART, SPADE } enum Rank { ACE, DEUCE, THREE, FOUR..
[Effective Java] 지역변수의 범위를 최소화하라
객체변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 줄어든다. 다음은 지역변수의 범위를 줄이기 위해 필요한 노력이다. 쓰이기 직전에 선언한다. 모든 지역변수는 선언과 동시에 초기화하자. (try-catch문은 예외) 반복 변수의 값을 반복문의 종료된 뒤에도 써야 하는 상황이 아니라면 while문보다 for문을 이용하자. for몬울 사용하면 지역 변수의 범위가 최소화 되기 때문에 복사 붙여넣기의 오류를 컴파일타임에 잡을 수 있다. 같은 값을 반환하는 메서드를 매번 호출할 때 for문이 유용하다. 다음은 같은 값을 반환하는 메서드를 매번 호출하는 비용을 줄여준다. for(int i = 0, n = expensiveComputation(); i < n; i++) { ... ..