본문 바로가기

Java/Effective Java 3E61

[이펙티브자바 3판] ITEM60. 정확한 답이 필요하다면 float와 double은 피하라 이번장의 핵심은... 정확한 답이 필요한 계산에는 float나 double을 피하라 소수점 추적은 시스템에 맡기고, 코딩 시 불편함이나 성능 저하에 신경을 쓰지 않겠다면 BigDecimal을 사용하라 법으로 정해진 반올림을 수행해야 하는 비지니스 계산에서 아주 편리하다 반면, 성능이 중요하고 소수점을 직접 추적할 수 있고 숫자가 너무 크지 않다면 int나 long을 사용하라 (숫자를 9자리 십진수로 표현할 수 있다면 int, 숫자를 18자리 십진수로 표현할 수 있다면 long) 18자리가 넘어가면 BigDecimal을 사용해야 한다 float와 double float와 double 타입은 과학과 공학 계산용으로 설계되어있습니다 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 .. 2021. 2. 6.
[이펙티브자바 3판] ITEM59. 라이브러리를 익히고 사용하라 이번장의 핵심은... 바퀴를 다시 발명하지 말자 즉, 라이브러리 코드는 개발자 각자가 작성하는 것보다 주목을 훨씬 많이 받으므로 코드 품질도 그만큼 높아진다 표준 라이브러리를 사용하지 않는다면? ex) 무작위 정수를 하나 생성하는 코드를 만들어볼까요? (값의 범위는 0~명시한 수) // 흔하지만 문제가 심각한 코드 static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } 3가지의 문제를 내포하고 있습니다 1. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복됩니다 2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환됩니다 3. n값이 크면 이 현.. 2021. 2. 6.
[이펙티브자바 3판] ITEM58. 전통적인 for 보다는 for-each 를 사용하라 이번장의 핵심은... 전통적인 for 문과 비교했을 때 for-each 문은 명료하고, 유연하고, 버그를 예방해줍니다 성능 저하도 없습니다 가능한 모든 곳에서 for 문이 아닌 for-each 문을 사용합시다 for vs for-each 전통적인 for문으로 컬렉션 순회하는 방법 // 컬렉션 순회 - 더 나은 방법이 존재 for (Iterator i = c.iterator(); i.hasNext(); ) { Element e = i.next(); ... // e로 무언가를 한다 } // 배열 순회 - 더 나은 방법이 있음 for (int i=0; i 2021. 2. 4.
[이펙티브자바 3판] ITEM57. 지역변수의 범위를 최소화하라 이번장의 핵심은... 지역변수의 범위를 줄이는 가장 강력한 기법은 '가장 처음 쓰일 때 선언하기' 입니다 지역변수의 범위를 최소화 1. 지역변수의 유효범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성이 낮아집니다 2. 거의 모든 지역 변수는 선언과 동시에 초기화 해야합니다 → 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 합니다 3. 반복문은 독특한 방식으로 변수 범위를 최소화 합니다 반복 변수의 범위가 반복문의 몸체, 그리고 for 키워드와 몸체 사이의 괄호 안으로 제한합니다 따라서 반복 변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이 아니라면 while 문보다는 for문을 쓰는 편이 낫습니다 컬렉션을 순회할 때 권장하는 관용구 for (Element e.. 2021. 2. 3.
[이펙티브자바 3판] ITEM56. 공개된 API 요소에는 항상 문서화 주석을 작성하라 이번장의 핵심은... 문서화 주석은 여러분 API를 문서화하는 가장 훌륭하고 효과적인 방법입니다 공개 API라면 빠짐없이 설명을 달아야 합니다 표준 규약을 일관되게 지켜야 합니다 문서화 주석에 임의의 HTML 태그를 사용할 수 있음을 기억해야 합니다 단, HTML 메타문자를 특별하게 취급해야 합니다 자바독(Javadoc) 소스코드 파일에서 문서화 주석이라는 특수한 형태로 기술된 설명을 추려 API 문서로 변환합니다 API를 올바로 문서화하려면 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 합니다 문서가 잘 갖춰지지 않은 API는 쓰기 헷갈려서 오류의 원인이 되기 쉽습니다 공개 클래스는 절대 기본 생성자를 사용하면 안 됩니다 (기본 생성자에는 주석을 달 방법이 없습니다) 메서.. 2021. 2. 3.
[이펙티브자바 3판] ITEM55. 옵셔널 반환은 신중히 하라 이번장의 핵심은... 값을 반환하지 못할 가능성이 있고, 호출할 때마다 반환 값이 없을 가능성이 있는 메서드면 옵셔널을 반환해야 할 상황일 수 있습니다 하지만, 옵셔널 반환에는 성능 저하가 뒤따르니, 성능에 민감한 메서드라면 null을 반환하거나 예외를 던지는 편이 나을 수 있습니다 그리고 옵셔널을 반환값 이외의 용도로 쓰는 경우는 매우 드물다 자바 8 이전) 메서드가 특정 조건에서 값을 반환할 수 없을 때 1. 예외를 던집니다 → 예외는 진짜 예외적인 상황에서만 사용해야 하고, 예외 생성 시, 스택 추적 전체를 캡쳐하므로 비용도 만만치 않습니다 2. (반환 타입이 객체 참조라면) null을 반환합니다 → 반환된 null 값을 어딘가에 저장해두면 언젠가 NullPointerException이 발생할 가능.. 2021. 1. 16.
[이펙티브자바 3판] ITEM54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 이번장의 핵심은... null이 아닌, 빈 배열이나 컬렉션을 반환합시다 null을 반환하는 API는 사용하기 어렵고 오류 처리 코드도 늘어납니다 그렇다고 성능이 좋은 것도 아닙니다 null을 반환하지 말자 따라 하지 말아야하는 예제 private final List cheeseInStock = ...; /** * @return 매장 안의 모든 치즈가 목록을 반환한다 * 단, 재고가 없다면 null 반환 */ public List getCheese() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } → null을 리턴해버리면 클라이언트는 이 null 상황을 처리하는 코드를 추가로 작성해야합니다 (클라이언트들은 계속 방어.. 2021. 1. 16.