본문 바로가기

Java/Effective Java 3E61

[이펙티브자바 3판] ITEM53. 가변인수는 신중히 사용하라 이번장의 핵심은... 인수 개수가 일정하지 않은 메서드를 정의해야 한다면 가변인수가 반드시 필요합니다 메서드를 정의할 때 필수 매개변수는 가변인수 앞에 두고, 가변인수를 사용할 때는 성능문제까지 고려합시다 가변인수 메서드 명시한 타입의 인수를 0개 이상 받을 수 있습니다 예제) 간단한 가변인수 활용 예 static int sum(int... args) { int sum = 0; for (int arg : args) sum += arg; return sum; } sum(1,2,3) -> 6 sum(0) -> 0 잘못 구현한 예) 인수가 1개 이상이어야 하는 가변인수 메서드 // 코드 53-2 인수가 1개 이상이어야 하는 가변인수 메서드 - 잘못 구현한 예! static int min(int... args).. 2021. 1. 16.
[이펙티브자바 3판] ITEM52. 다중정의는 신중히 사용하라 이번장의 핵심은... 프로그래밍 언어가 다중정의를 허용한다고 해서 다중정의를 꼭 활용하란 뜻은 아닙니다 일반적으로 매개변수 수가 같을 때는 다중정의를 피하는 게 좋습니다 다중정의 (overloading) 매개변수의 타입과 개수가 다르면서 이름이 같은 메서드를 여러개 가지는 것을 의미합니다 컴파일 타임에 어떤 메서드를 호출할지 정해집니다 // 코드 52-1 컬렉션 분류기 - 오류! 이 프로그램은 무엇을 출력할까? public class CollectionClassifier { public static String classify(Set s) { return "집합"; } public static String classify(List lst) { return "리스트"; } public static Stri.. 2021. 1. 4.
[이펙티브자바 3판] ITEM51. 메서드 시그니처를 신중히 설계하라 이번장의 핵심은... API 설계 요청 5가지를 알아봅시다 API 설계 요령 메서드 이름을 신중히 짓자 1. 표준 명명 규칙을 따릅시다 2. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓습니다 3. 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용합시다 4. 긴 이름은 피합시다 편의 메서드를 너무 많이 만들지 말자 1. 모든 메서드는 각각 자신의 소임을 다하도록 합니다 2. 메서드가 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵습니다 → 인터페이스도 마찬가지입니다 3. 확신이 서지 않으면 만들지 말아야 합니다 매개변수 목록은 짧게 유지하자 1. 4개 이하가 좋습니다 (4개가 넘어가면 매개변수를 전부 기억하기가 쉽지 않습니다) 2. 같은 타입의 매개변수 여러.. 2020. 12. 27.
[이펙티브자바 3판] ITEM50. 적시에 방어적 복사본을 만들라 이번장의 핵심은... 클래스가 클라이언트로부터 받는 혹은 클라이언트로 반환하는 구성요소가 가변이라면 그 요소는 반드시 방어적으로 복사해야 한다 복사 비용이 너무 크거나 클라이언트가 그 요소를 잘못 수정할 일이 없음을 신뢰한다면 방어적 복사를 수행하는 대신 구성요소를 수정했을 때의 책임이 클라이언트에 있음을 문서에 명시하자 Date 자바에서 제공하는 Date 클래스는 가변입니다 자바 8부턴 Date 대신 LocalDateTime와 ZonedDateTime같은 불변클래스를 사용합니다 Period 얼핏보면 Period 클래스는 불변처럼 보이고, 시작 시간이 종료 시간보다 늦을 수 없다는 불변식이 지켜질 것 같지만, Date가 가변이라는 사실을 이용하면 쉽게 깰 수 있습니다 // 코드 50-1 기간을 표현하는 .. 2020. 12. 22.
[이펙티브자바 3판] ITEM49. 매개변수가 유효한지 검사하라 이번장의 핵심은... 메서드나 생성자를 작성할 때면 그 매개변수들에 어떤 제약이 있을지 생각해야 한다 그 제약들을 문서화하고 메서드 코드 시작 부분에서 명시적으로 검사하자 그 노력은 유효성 검사가 실제 오류를 처음 걸러낼 때 충분히 보상받을 것이다! 유효성 검사 1. 매개변수에 대한 제약은 반드시 문서화해야하며, 유효성 검사는 메서드 몸체가 시작되기 전에 검사해야합니다 2. 오류는 가능한 한 빨리 (발생한 곳에서) 잡아야 합니다 3. 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을 때 즉각적이고 깔끔한 방식으로 예외를 던질 수 있습니다 만약, 매개변수 검사를 제대로 하지 못하면? 메서드가 수행되는 중간에 모호한 예외를 던질 수 있습니다 잘못된 결과를 반환할 수도 있습니다 매개변수의.. 2020. 12. 19.
[이펙티브자바 3판] ITEM48. 스트림 병렬화는 주의해서 적용하라 이번장의 핵심은... 올바르게 수행하고 성능도 빨라질거라는 확신없이 스트림 파이프라인 병렬화는 시도하지 말자 스트림은 parallel 메서드만 호출하면 자동으로 병렬 실행할 수 있습니다 하지만 주의할 점이 있습니다 // 병렬 스트림을 사용해 처음 20개의 메르센 소수를 생성하는 프로그램 // 주의: 병렬화의 영향으로 프로그램이 종료하지 않는다. public class ParallelMersennePrimes { public static void main(String[] args) { primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE)) .parallel() // 스트림 병렬화 .filter(mersenne -> mersenne.isProbablePri.. 2020. 12. 15.
[이펙티브자바 3판] ITEM47. 반환타입으로 스트림보다 컬렉션이 낫다 이번장의 핵심은... 컬렉션을 반환하는 게 불가능하면 스트림과 Iterable 중 더 자연스러운 것을 반환하자 만약 나중에 스트림 인터페이스가 Iterable을 지원하도록 자바가 수정된다면, 그때는 안심하고 스트림을 반환하면 됩니다 스트림 반복문 스트림은 반복을 지원하지 않습니다 iterable 인터페이스가 정의한 추상메서드들을 전부 포함하지만 extend 하지 않습니다 따라서 for-each로 반복하지 못합니다 스트림으로 반복문을 쓰고 싶다면 어떻게 해야할까요? Stream를 Iterable로 중개해주는 어댑터를 생성해주면 됩니다 public static Iterable iterableOf(Stream stream){ return stream::iterable; } 하지만 너무 난잡하고 직관성이 떨어집.. 2020. 12. 13.