Java/이펙티브 자바

    이펙티브 자바, 쉽게 정리하기 - item 60. 정확한 답이 필요하다면 float 과 double 은 피하라

    이펙티브 자바, 쉽게 정리하기 - item 60. 정확한 답이 필요하다면 float 과 double 은 피하라 float과 double이 사용하는 이진 부동소수점의 취약점 @Test public void floatDoubleTest1() { System.out.println(1.03 - 0.42); // 결과: 0.6100000000000001 } float 과 double 은 이진 부동소수점 연산에 쓰여 근사치로 계산하도록 설계된 타입이다. 위 코드의 경우 0.61 이 그대로 나오지 않고, 0.6100000000000001 이 나오게 된다. 이진수로 소수점을 표현하는 데 한계가 있고, 그 한계가 이진 부동소수점을 사용함으로써 여실히 드러난다. 이를테면 0.1 을 2진수로 표현하면 0.0001100,11..

    이펙티브 자바, 쉽게 정리하기 - item 59. 라이브러리를 익히고 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 59. 라이브러리를 익히고 사용하라 java Random 라이브러리의 예제 public class Item59Test { Random rnd = new Random(); @Test public void randomTest() { int n = 2 * (Integer.MAX_VALUE / 3); // 약 14억 int low = 0; for (int i=0; i < 1_000_000; i++) { if (randomNumber(n) < n / 2) { // 약 7억 low++; } } System.out.println("low = " + low); } public int randomNumber(int n) { return Math.abs(rnd.nextInt())..

    이펙티브 자바, 쉽게 정리하기 - item 58. 전통적인 for 문보다는 for-each 문을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 58. 전통적인 for 문보다는 for-each 문을 사용하라 전통적인 for문의 약점 for (Iterator i = c.iterator(); i.hasNext()) { Element e = i.next(); // do something with e... } for (int i=0; i{ for (Iterator i = suits.iterator(); i.hasNext();) { for (Iterator j = ranks.iterator(); j.hasNext();) { System.out.println(i.next() + ", " + j.next()); } } }); } 위 코드에는 어떤 버그가 있을까? 먼저, 사용자가 i.next() 와 j.next() 를..

    이펙티브 자바, 쉽게 정리하기 - item 57. 지역변수의 범위를 최소화하라

    이펙티브 자바, 쉽게 정리하기 - item 57. 지역변수의 범위를 최소화하라 지역변수의 범위는 최소한으로 item 15. 에서 "클래스와 멤버의 접근 권한을 최소화하라"고 했던 것과 비슷한 내용이다. 변수는 항상 유효범위를 최소한으로 두고 필요할 때 늘리는 방식으로 활용하자. 지역변수의 범위를 줄이는 테크닉 이 테크닉에 대해서는 동의하는 부분도 있는데, 개인적으로는 변수를 한 곳에 몰아두는 것이 관리하기 훨씬 편하다고 생각한다. 메서드의 시작 부분에 한번에 초기화하여 일목요연하게 보기 좋게 만드는 것이 최선이라 생각한다. 항상 지역변수가 처음 쓰일 때 선언하자. 미리 선언해두면 코드 가독성이 떨어지고 어수선해진다. 쓰이지 않는 변수가 살아있을 위험도 있다. 선언과 동시에 초기화하자. 초기화에 필요한 정..

    이펙티브 자바, 쉽게 정리하기 - item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라

    이펙티브 자바, 쉽게 정리하기 - item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라 API 문서화 관련 지침 자바독을 이용하자. 자바독을 최대한 활용한다. 자바독 태그인 @literal, @code, @implSpec, @index (java9) 를 이용하자. {@literal} 주석 내에 HTML 요소나 다른 자바독 태그를 무시함 글자 그대로 쓸 때 필요 {@code} {@literal} 과 비슷한데, 코드 폰트로 렌더링한다. @implSpec 해당 메서드와 하위 클래스 사이의 계약을 설명 하위 클래스가 해당 메서드를 상속했거나, super 키워드를 이용해 호출할 때 메서드가 어떻게 동작할지 명확히 인지할 수 있게 도와준다 필수적으로 들어가야 하는 것들 모든 공개된 클래스, 인터페이스..

    이펙티브 자바, 쉽게 정리하기 - item 55. 옵셔널 반환은 신중히 하라

    이펙티브 자바, 쉽게 정리하기 - item 55. 옵셔널 반환은 신중히 하라 null 처리에 관한 문제 해당 객체의 메서드가 null을 반환할지 알 수 없다. 클라이언트는 구현 코드를 자세히 살펴보고 null을 처리해야 했다. 자바8 이전 null 처리 방법 if (object != null) { return object.method(); } throw new NullPointerException(); if (result != null) throw new NullPointerException(); 코드가 더러워지거나, 진짜 예외의 처리에 쓰여야 할 예외가 널 처리에 쓰이게 되어버린다. Optional의 등장 null 이 아닌 T 타입 참조 하나를 담거나 아무것도 담지 않는다. null 을 피하기 위한 O..

    이펙티브 자바, 쉽게 정리하기 - item 54. null 이 아닌, 빈 컬렉션이나 빈 배열을 반환하라

    이펙티브 자바, 쉽게 정리하기 - item 54. null이 아닌, 빈 컬렉션이나 빈 배열을 반환하라 null을 반환하는 것의 단점 private final List cheesesInStock = new ArrayList(); public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } getCheeses()는 cheesesInStock에 원소가 없으면 null을 반환한다. 이 코드엔 무슨 문제가 있을까? 문제 확인 @Test public void getCheesesClient() { List cheeses = getCheeses(); if(cheeses != null && cheese..

    이펙티브 자바, 쉽게 정리하기 - item 53. 가변 인수는 신중히 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 53. 가변 인수는 신중히 사용하라 가변 인수가 1개 이상이어야 할 때 잘못 구현한 예 public static int min(int... args) { if (args.length == 0) { throw new IllegalArgumentException("인수가 1개 이상 필요합니다."); } int min = args[0]; for (int i = 0; i < args.length; i++) { if(args[i] < min) { min = args[i]; } } return min; } @Test public void minTest(){ int min = min(); System.out.println("min = " + min); } 인수를 넣지 않고 ..

    이펙티브 자바, 쉽게 정리하기 - item 52. 다중정의는 신중히 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 52. 다중정의는 신중히 사용하라 다중정의(Overloading) 문제의 예제 코드 static class CollectionClassifier { public static String classify(Set s) { return "집합"; } public static String classify(List s) { return "리스트"; } public static String classify(Collection s) { return "그 외 컬렉션"; } } @Test public void collectionClassifierTest() { Collection[] collections = { new HashSet(), new ArrayList(), new H..

    이펙티브 자바, 쉽게 정리하기 - item 51. 메서드 시그니처를 신중히 설계하라

    이펙티브 자바, 쉽게 정리하기 - item 51. 메서드 시그니처를 신중히 설계하라 메서드 이름은 신중히 짓자 메서드 표준 명명규칙을 따르자. (item. 68) 최대한 커뮤니티에서 널리 받아들여지는 이름을 사용하자. 편의 메서드를 너무 많이 만들진 말자 클래스에 메서드가 너무 많으면 다른 개발자가 알기도 힘들뿐더러 문서화 등 유지보수도 힘들다. 확신이 서지 않으면 만들지 말자. 매개변수 목록은 짧게 유지하자 일반적으로 4개 이하가 좋다. 같은 타입의 매개변수가 연속으로 나오면 특히 해롭다. 동작이 의도와 다르게 변질되기 쉽다. JS 에서는 3개 이상인 경우 매개변수 객체 등을 이용하는 것이 깔끔했다. 자바에서는 이걸 헬퍼 클래스라고 한다. 매개변수가 너무 길 때 1: 메서드를 쪼개자 메서드를 여러 메서..

    이펙티브 자바, 쉽게 정리하기 - item 50. 적시에 방어적 복사본을 만들라

    이펙티브 자바, 쉽게 정리하기 - item 50. 적시에 방어적 복사본을 만들라 클래스 내부 수정을 본의아니게 허락하는 경우 static class Period { private final Date start; private final Date end; public Period(Date start, Date end, int version) { if (start.compareTo(end) > 0) { throw new IllegalArgumentException( start + "가 " + end + "보다 늦다." ); } if(version == 1) { this.start = start; this.end = end; } else { // 방어적 복사본 만들기 this.start = new Date(s..

    이펙티브 자바, 쉽게 정리하기 - item 49. 매개변수가 유효한지 검사하라

    이펙티브 자바, 쉽게 정리하기 - item 49. 매개변수가 유효한지 검사하라 오류 검사의 일반 원칙1: 오류를 즉시 잡아라 "오류는 가능한 한 빨리 발생한 곳에서 잡아야 한다." 오류를 발생한 즉시 잡지 못하면 해당 오류를 감지하기도 어렵고, 정확히 어디서 발생했는지 알기도 어렵다. 다양한 매개변수 검사 예시 (가장 간단한 원칙) 인덱스 값은 음수이면 안 된다. 객체 참조는 null 이 아니어야 한다. 매개변수 검사를 제대로 하지 못했을 때 벌어지는 일 메서드가 수행되다가 모호한 예외를 던지며 실패한다. 메서드가 잘 수행되지만 잘못된 결과를 반환한다. 메서드에서 사용한 다른 객체를 이상한 상태로 만들어 미래의 알 수 없는 시점에 문제가 발생한다. 아래 단계의 현상일수록 문제는 더욱 심각해진다. 예외의 ..

반응형