본문 바로가기

Java/Effective Java 3E61

[이펙티브자바 3판] ITEM46. 스트림에는 부작용 없는 함수를 사용하라 이번장의 핵심은... 스트림 파이프 라인 프로그래밍 핵심은 부작용 없는 함수 객체입니다 forEach는 스트림이 수행한 계산 결과를 보고할 때만 이용하자 (계산 자체에는 이용하지 말자) 가장 중요한 수집기 팩터리는 [ toList, toSet, toMap, groupingBy, joining ] 스트림 패러다임 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 것입니다 이때 변환은 입력만이 결과에 영향을 주는 순수 함수여야 합니다 잘못된 스트림 연산의 예시를 볼까요? Map freq = new HashMap(); try (Stream words = new Scanner(file).tokens()){ words.forEach(word -> { freq.merge(word.toLowerCase(),.. 2020. 12. 5.
[이펙티브자바 3판] ITEM45. 스트림은 주의해서 사용하라 이번장의 핵심은... 스트림과 반복 중 어느 쪽이 나은지 확신하기 어렵다면 둘 다 해보고 더 나은 쪽을 택해라 스트림 API 다량의 데이터 처리 작업을 돕고자 추가되었습니다 스트림 핵심 2가지 1. 스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻합니다 2. 스트림 파이프라인은 이 원소들로 수행하는 연산 단계를 표현하는 개념입니다 스트림 원소들은 어디로부터든 올 수 있습니다 ex) 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수 생성기 스트림 파이프 라인 myList.stream() //소스 스트림 .filter(s -> s.startsWith("c")) //중간 연산 .forEach(System.out::println); //종단 연산 소스 스트림에서 시작해 종단 연산으로 끝나며, 그 사이에 하나.. 2020. 12. 2.
[이펙티브자바 3판] ITEM44. 표준 함수형 인터페이스를 사용하라 이번장의 핵심은... 입력값과 반환값에 함수형 인터페이스 타입을 활용하라 보통은 java.util.function 패키지의 표준 함수형 인터페이스를 사용하는 것이 가장 좋은 선택이다 단, 흔지는 않지만 직접 새로운 함수형 인터페이스를 만들어 쓰는 편이 나을 수 있음을 잊지 말자 함수형 매개변수 타입을 올바르게 선택하자 템플릿 메서드 패턴의 매력은 크게 줄었습니다 이를 대체하는 요즘 스타일은 같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것입니다 그러니까 함수 객체를 매개변수로 받는 생성자와 메서드를 더 많이 만들어야 합니다 ex) LinkedHashMap // 맵에 원소가 100개가 될 때까지 커지다가, 그 이상이 되면 맵에서 가장 오래된 원소를 제거 // 즉, 가장 최근 원소 100개 .. 2020. 12. 2.
[이펙티브자바 3판] ITEM43. 람다보다는 메서드 참조를 사용하라 이번장의 핵심은... 메서드 참조는 람다의 간단명료한 대안이 될 수 있다 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하라 메서드 참조 함수 객체를 람다보다 더 간결하게 만드는 방법입니다 메서드 참조를 사용하는 편이 보통은 더 짧고 간결하므로, 람다로 구현했을 때 너무 길거나 복잡하다면 메서드 참조가 좋은 대안입니다 기능을 잘 드러내는 이름을 짓거나 친절한 설명을 문서로 남길 수도 있습니다 IDE들은 람다를 메서드 참조로 대체하라고 권하고 있습니다 보통은 이득이지만 항상은 아닙니다 때로는 람다가 더 간결할 수 있습니다 // 메서드 참조 service.execute(GoshThisClassNameIsHumongous::action); // lamda service.e.. 2020. 12. 1.
[이펙티브자바 3판] ITEM42. 익명 클래스보다는 람다를 사용하라 이번장의 핵심은... 익명 클래스는 (함수형 인터페이스가 아닌) 타입의 인스턴스를 만들 때만 사용하라 함수 객체(function object) 추상 메서드 하나만 담은 인터페이스(Functional Interface)의 인스턴스 예제) 문자열을 길이순으로 정렬 List words = Arrays.asList(args); // 코드 42-1 익명 클래스의 인스턴스를 함수 객체로 사용 - 낡은 기법이다! (254쪽) Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); → 익명 클래스 방식은 코드가 너무 길기 .. 2020. 12. 1.
[이펙티브자바 3판] ITEM41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 이번장의 핵심은... 마커 인터페이스와 마커 애너테이션은 각자의 쓰임이 있다 새로 추가하는 메서드 없이 단지 타입 정의가 목적이라면 마커 인터페이스이 올바른 선택이다 클래스나 인터페이스 외의 프로그램 요소에 마킹해야 하거나, 애너테이션을 적극 활용하는 프레임워크의 일부로 그 마커를 편입시키고자 한다면 마커 애너테이션이 올바른 선택이다 마커 인터페이스 아무 메서드도 담고 있지 않고, 구현한 클래스를 표시해주는 인터페이스 ex) Serializable 인터페이스 Serializable은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 쓸 수 있다고, 즉, 직렬화(serializtion)할 수 있다고 알려줌 public interface Serializable{ } 마커 애너테이션이.. 2020. 11. 29.
[이펙티브자바 3판] ITEM40. @Override 애너테이션을 일관되게 사용하라 이번장의 핵심은... 재정의한 모든 메서드에 @Override 애너테이션을 의식적으로 달면 여러분이 실수했을 때 컴파일러가 바로 알려줄 것이다 예외는 한 가지인데, 단다고 해서 해로울 것도 없다 @Override 상위 메서드 재정의 이 애너테이션을 일관되게 사용하면 여러 가지 악명 높은 버그를 예방해줌 Bigram Class 예제 // 코드 40-1 영어 알파벳 2개로 구성된 문자열(바이그램)을 표현하는 클래스 - 버그를 찾아보자. (246쪽) public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second.. 2020. 11. 29.