전체 글
-
아이템 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라책/이펙티브자바 2021. 9. 17. 17:34
Collection // BAD - 컬렉션이 비었을때 null 을 리턴한다. private final List cheesesInStock = ...; public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } 위 코드는 치즈 재고를 List 로 반환하는 메소드인데 재고가 없으면 null 을 리턴한다. 근데 사실 재고가 없다고 해서 특별히 취급할 이유는 없다. 근데도 이렇게 null 을 반환한다면, 클라이언트는 이 null 을 처리하는 코드를 추가로 작성해야 한다. List cheeses = shop.getCheeses(); if (cheeses != null && cheeses.con..
-
아이템 53. 가변인수는 신중히 사용하라책/이펙티브자바 2021. 9. 17. 17:33
가변인수 (varargs) 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다. 가변인수 메서드 호출 시 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네준다. // 가변인수 사용법 static int sum(int... args) { int sum = 0; for (int arg : args) { sum += args; } return sum; } 예를 들어 최솟값을 구하는 메서드를 작성한다면 인수가 1개 이상이어야 하는데 0개도 받을 수 있게 설계하면 에러가 날 수 있다. // BAD - 인수가 1개 이상이어야 할 때 가변인수 사용법 static int min(int... args) { if (args.length == 0) throw new Illega..
-
아이템 60. 정확한 답이 필요하다면 float와 double은 피하라책/이펙티브자바 2021. 9. 16. 15:35
float과 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안 된다. // 근사치로 계산하기에 정확한 값이 안나옴 System.out.println(1.03 - 0.42); System.out.println(1.00 - 9 * 0.10); // 0.6100000000000001 // 0.09999999999999998 // 60-1. 부동소수 타입을 사용하여 잘못된 결과가 발생함 public static void main(String[] args) { double funds = 1.00; int itemsBought = 0; for..
-
아이템 59. 라이브러리를 익히고 사용하라책/이펙티브자바 2021. 9. 16. 15:35
랜덤값을 구해오는 라이브러리 java.util.Random: nextInt() % bound; java1.0 java.util.Random: nextInt(int bount); java1.2 java.util.concurrent.ThreadLocalRandom java1.7 java.util.SplittableRandom java1.8 java.security.SecureRandom java1.1 // 59-1. Random.nextInt() % bound 방식의 문제점 public class Item59 { static Random random = new Random(); static int random(int n) { return Math.abs(random.nextInt()) % n; } publi..
-
아이템 52. 다중정의는 신중히 사용하라책/이펙티브자바 2021. 9. 16. 15:33
다중 정의 (Overroading) // 52-1. BAD - 컬렉션 분류기 public class CollectionClassifier { public static String classify(Set s) { return "Set"; } public static String classify(List l) { return "List"; } public static String classify(Collection c) { return "Collection"; } public static void main(String[] args) { Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() }; for (Colle..
-
아이템 51. 메서드 시그니처를 신중히 설계하라책/이펙티브자바 2021. 9. 16. 15:32
API 설계 요령들을 알아보자. 메서드 이름을 신중히 짓자. 항상 표준 명명 규칙 (Item68)을 따르자. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 우선 목표다. 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하자. 긴 이름은 피하자. 자바 라이브러리의 API 가이드를 참조하자. 편의 메서드를 너무 많이 만들지 말자. 모든 메서드는 각각 자신의 소임을 다해야 한다. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 아주 자주 쓰일 경우에만 별도의 약칭 메서드를 두자. 확신이 서지 않으면 만들지 말자. 매개변수 목록은 짧게 유지하자. 4개 이하로 만들자. 같은 타입 매개변수 여러 개가 연달아 나오는 경우는 특히 해롭다. 매개변수 목..
-
아이템 60. 정확한 답이 필요하다면 float와 double은 피하라책/이펙티브자바 2021. 9. 15. 22:03
float과 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안 된다. // 근사치로 계산하기에 정확한 값이 안나옴 System.out.println(1.03 - 0.42); System.out.println(1.00 - 9 * 0.10); // 0.6100000000000001 // 0.09999999999999998 // 60-1. 부동소수 타입을 사용하여 잘못된 결과가 발생함 public static void main(String[] args) { double funds = 1.00; int itemsBought = 0; for..
-
아이템 59. 라이브러리를 익히고 사용하라책/이펙티브자바 2021. 9. 15. 22:02
랜덤값을 구해오는 라이브러리 java.util.Random: nextInt() % bound; java1.0 java.util.Random: nextInt(int bount); java1.2 java.util.concurrent.ThreadLocalRandom java1.7 java.util.SplittableRandom java1.8 java.security.SecureRandom java1.1 // 59-1. Random.nextInt() % bound 방식의 문제점 public class Item59 { static Random random = new Random(); static int random(int n) { return Math.abs(random.nextInt()) % n; } publi..