본문 바로가기

728x90
반응형

회고/이펙티브 자바 3판

(23)
[ 아이템 63 ] 문자열 연결은 느리니 주의하라 문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다. 하지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다. 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다. 문자열은 불변이라서 두 문자열을 연결할 겨우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 불가피하다. 문자열 연결을 잘못 사용한 예 - 느리다! public String statement() { String result = ""; for (int i=0; i
[ 아이템 62 ] 다른 타입이 적절하다면 문자열 사용을 피하라
[ 아이템 61 ] 박싱된 기본 타입보다는 기본 타입을 사용하라 자바의 타입은 int, double, boolean 같은 기본 타입과 String, List 같은 참조 타입이 있다. 기본 타입은 대응하는 참조 타입이 있으며, 이것은 박싱된 기본 타입이다. int -> Integer, double -> Double, boolean -> Boolean. 기본 타입과 박싱된 기본 타입은 크게 3가지 차이점이 있다. 1. 기본 타입은 값만 있으나, 박싱된 기본 타입은 식별성(identity)이 있어서 값이 같아도 다르게 식별될 수 있다. 2. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 null을 가질 수 있다. 3. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 잘못 구현된 비교자 - 문제를 찾아보자 Comparator natural..
[ 아이템 60 ] 정확한 답이 필요하다면 float와 double은 피하라 float와 double 타입은 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 섬세하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안된다. float와 double 타입은 특히 금융 관련 계산은 맞지 않는다. 0.1, 10의 음의 거듭제곱 수 등은 표현할 수 없다. System.out.println(1.03 - 0.42); 결과 : 0.0610000000001 System.out.println(1.00 - 9*0.10); 결과 : 0.09999999999999 오류 발생! 금융 계산에 부동소수 타입을 사용했다 public static void main(String[] args) { double funds = 1.00; int itemsBought = ..
[ 아이템 59 ] 라이브러리를 익히고 사용하라 무작위 정수를 하나 생성하고 싶을 때 어떻게 코드를 짤 수 있을까? 값의 범위는 0부터 명시한 숫자 사이이다. 흔하지만 문제가 심각한 코드 static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } 이 코드는 다음과 같은 문제가 있다. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 잘 반환된다. 무작위 수 백만개를 생성한 다음, 그 중 중간 값보다 작은 게 몇 개인지를 출력한다 public static void main(String[] args) { int n = 2 * (Integer.MAX_VALU..
[ 아이템 58 ] 전통적인 for 문보다는 for-each 문을 사용하라 이펙티브 자바3판 게시글은 문단별로 핵심 문장만 추려서 정리합니다 내용을 곱씹고 다시 한번 생각해보기 위해서 기록을 남깁니다 일단 전통적인 for문 사용을 먼저 살펴본다. 1. 컬렉션 순회하기 -> 더 나은 방법이 있다. for (Iterator i = c.iterator(); i.hasNext();){ Element e = i.next(); } 2,. 배열 순회하기 -> 더 나은 방법이 있다. for ( int i = 0 ; i < a.length ; i++ ) { //Todo : 해야 할 일 } 전통적인 for문은 while문보다는 좋은 방법이지만, 인덱스 변수는 코드를 지저분하게 하고 있으며 우리가 필요한 것은 결국 원소이다. 반복자 i의 많은 등장은 변수를 잘못 사용할 틈새를 주는 것이다. 또한 ..
[ 아이템 57 ] 지역변수의 범위를 최소화하라 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성이 낮아진다. C와 같은 언어에서는 지연변수를 코드의 블록의 첫 머리에 선언하는 경우가 많았는데, 자바는 문장을 선언할 수 있는 곳이면 어디에서든지 선언이 가능하다. '가장 처음 쓰일 때 선언하기'를 통해 지역변수의 범위를 줄여라! 미리 선언하는 것은 가독성을 떨어뜨린다. 또한 지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날때까지 이기 때문에, 범위에 대해 실수하지 않도록 조심한다. '거의 모든 지역변수는 선언과 동시에 초기화' 되어야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. try-catch의 경우, 유효성 검사를 위해 try 블록 안에서 검사해야 하는 경우가 ..

728x90
반응형