본문 바로가기

공부/이펙티브자바8

[이펙티브 자바 3판] 아이템 28. 배열보다는 리스트를 사용하라 배열과 리스트에 대해 설명해주세요최근 면접 때 받았던 질문이다. 배열과 리스트에 대한 차이를 잠깐 이야기하고,이펙티브 자바에서는 배열보다 리스트 사용을 권장합니다. 그 이유는 배열은 런타임 시 에러가 발생하지만 리스트는 컴파일 시 에러를 잡아줍니다.여기에 이어진 질문에 대답을 못했고 이어서 공부해보겠다고 말씀드렸다.이번 기회에 다시한번 정리해보고자 한다.배열과 제네릭 타입의 차이배열은 공변(covaiant)이다.공변은 함께변한다라는 뜻이다.예를 들어 Sub가 Super의 하위 타입이라면, Sub[]는 배열 Super[]의 하위 타입이 된다. 이를 공변이라 한다. 즉, 함께 변한다.제네릭은 불공변(invariant)이다.불공변은 함께 변하지 않는다라는 뜻이다.List는 List의 하위타입이 아니고 상위타입.. 2022. 10. 31.
54. null이 아닌, 빈 컬렉션이나 배열을 반환하자 예시) 사용하면 안되는 코드 private final List cheesesInStock = ...; public List getCheeses() { return cheesesInStock.isEmtpy() ? null : new ArrayList(cheesesInStock); } 매장 안의 모든 치즈 목록 반환, 재고가 없다면 null 반환. null을 반환한다면, 클라이언트는 이 null을 처리하는 코드를 추가로 작성해야 함. 코드가 복잡해진다. List cheeses = shop.getCheeses(); if (cheeses != null && cheeses.contains(Cheese.M\\\\ozzarell ... } 값을 반은 후 null값 체크를 다시 해주어야 함 절대 null을 반환하지 말.. 2022. 4. 1.
14. Comparable을 구현할지 고려하라 Comparable 인터페이스의 유일한 메서드 compareTo : 두 가지 성격을 빼면 Object의 equals와 같음 단순동치성 비교(equals)에 순서까지 비교 가능 제네릭 → Comparable을 구현했다는 것 : 클래스의 인스턴스에 자연적인 순서가 있음을 뜻함 Comparable을 구현한 객체들의 배열은 다음과 같이 정렬가능 Arrays.sort(a); 장점 제네릭 알고리즘과 컬렉션의 힘을 누릴 수 있다 좁쌀만 한 노력으로 코끼리만 한 큰 효과! 자바 플랫폼 라이브러리의 모든 값 클래스와 열거 타입이 Comparable을 구현했음 알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하자. 인터페이스 구현 public interface C.. 2022. 3. 18.
12. toString을 항상 재정의하라 toString의 규약 모든 하위 클래스에서 이 메서드를 재정의하라 장점 사용하기 편하고 디버깅하기 쉽다. 재정의하지 않는다면 쓸모없는 메시지만 로그에 남는다. 만약 PhoneNumber용 toString을 제대로 정의했다면 에러메시지 출력시 다음과 같은 말로 충분하다. System.out.println(phoneNumber + "에 연결할 수 없습니다."); 담을 정보 그 객체가 가진 주요 정보 모두(권장) 정리 모든 구현 클래스에서 Object의 toString을 재정의하자. 상위 클래스에서 이미 알맞게 재정의한 경우는 예외이다. 해당 객체에 관한 명확하고 유용한 정보를 읽기 좋은 형태로 반환해야 한다. 2022. 3. 18.
5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하기 하나의 자원에 의존 많은 클래스가 하나의 자원에 의존할 때 가령, 맞춤법 검사기는 사전(dictionary)에 의존 정적 유틸리티 클래스로 자주 구현될 수 있음 싱글톤으로 구현하는 경우도 흔함 // 정적 유틸리티 클래스 public class SpellChecker { private static final Lexicon dictionary = ...; // 사전 내용 private SpellChecker(){} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } // 싱글톤 클래스 public class SpellChecker { private st.. 2022. 3. 18.
64. 객체는 인터페이스를 사용해 참조하라 “적합한 인터페이스”가 있다면, 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 객체의 실제 클래스를 사용해야 할 상황 : ‘오직’ 생성자로 생성할 때 뿐 Set sonSet = new LinkedHashSet(); // 좋은 예 LinkedHashSet sonSet = new LinkedHashSet(); // 안좋은 예 인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해질 것이다. LinkedHashSet을 HashSet으로 바꾸면 문제가 발생할 수 있다. 적합한 인터페이스가 없다면 당연히 클래스로 참조해야 한다. 2022. 3. 17.