Reference/Effective-Java

    [Effective-Java] Chapter8 #54. null이 아닌, 빈 컬렉션이나 배열을 반환하라

    💡 null을 반환하는 API는 성능이나 편리성 모두 저하된다. 📌 As-is private final List cheesesInStock = List.of(); /** * @return 매장 안의 모든 치즈 목록을 반환한다. * 단, 재고가 하나도 없다면 null을 반환한다. */ public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } // 클라이언트 코드 List cheeses = shop.getCheeses(); if (cheeses != null && cheeses.contains(Cheese.STILTON)) { // null guard System.out.println(..

    [Effective-Java] Chapter8 #53. 가변인수는 신중히 사용하라

    💡 필수 매개변수는 가변인수 앞에 두고, 가변인수를 사용할 때는 성능 문제까지 고려하자 📌 가변인수(varargs) static int sum(int... args) { int sum = 0; for (int arg : args) sum += arg; return sum; } 가변인수 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다. 가변인수 메서드 호출 시, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 배열에 저장한다. 인수 개수는 런타임에 자동 생성된 배열의 길이 args.length로 알 수 있다. 📌 As-is // 최솟값을 찾는 메서드 static int min(int... args) { if (args.length == 0) throw new IllegalArgument..

    [Effective-Java] Chapter8 #52. 다중 정의는 신중히 사용하라

    ✨ 핵심 정리 • 일반적으로 매개변수 수가 같을 때는 다중 정의를 피하는 게 좋다. • 어쩔 수 없는 경우(ex. 생성자)라면 헷갈릴만한 매개변수는 형변환하라. • 불가능하다면 같은 객체를 입력받는 다중 정의 메서드들이 모두 동일하게 동작하게 만들어라. 📌 Overriding 💡 재정의한 메서드는 동적으로 선택되고, 다중정의한 메서드는 정적으로 선택된다. class Wine { String name() { return "포도주"; } } class SparklingWine extends Wine { @Override String name() { return "발포성 포도주"; } } class Champagne extends SparklingWine { @Override String name() { re..

    [Effective-Java] Chapter8 #51. 메서드 시그니처를 신중히 설계하라

    이번 챕터는 개별 Item으로 두기 애매한 API 설계 요령들에 대한 내용들이다. 그냥 지금까지 했던 내용들 복습하는 느낌으로 읽어도 무방 메서드 이름을 신중히 짓자 항상 표준 명명 규칙(Item 68)을 따르라. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관성을 지켜라 긴 이름은 피하되, 의미를 명확히 밝힐 수 없다면 차라리 긴 게 낫다. 개발자 커뮤니티에서 널리 받아지는 이름과 자바 라이브러리 API를 참조하라. 편의 메서드를 너무 많이 만들지 말자 메서드가 너무 많은 클래스나 인터페이스는 사용하고, 익히고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 아주 자주 쓰일 경우에만 별도의 약칭 메서드를 두어라. 확신이 서지 않으면 만들지 마라. 매개변수 목록은 짧게 유지하다 (4개 이하) 여..