핵심 요약 Stream과 반복 방식 중 어떤 방식이 좋을지 잘 고려해서 사용하자. Stream의 특징 스트림 API는 다량의 데이터 처리 작업을 위해 자바 8에 추가되었다. 소스 스트림(source stream) ➡ 중간 연산(intermediate operation) ➡ 종단 연산(terminal operation) 순으로 진행된다. 중간 작업은 filter, map, sorted와 같이 다른 스트림으로 변환하는 작업이다. 터미널 작업은 count, collect, forEach, reduce와 같은 결과를 생성한다. 대용량 데이터를 처리할 때 효율을 높이기 위해, 오토박싱/언박싱 과정이 필요 없는 기본형 스트림도 제공한다. ex. IntStream, LongStream, DoubleStream 스트림..
핵심 정리 함수형 인터페이스를 사용하면 람다보다 더 간결하고 명확한 코드를 얻게될 수도 있다. 자주 사용되는 함수형 인터페이스는 표준 함수형 인터페이스로 구현돼있으므로 Comparator과 같은 특정한 경우가 아니라면 표준 함수형 인터페이스를 사용하자. 예시 자바에서는 람다에 활용하기 위해 만들어둔 표준 함수형 인터페이스가 존재한다. 예시 1 removeEldestEntry() 메소드는 LinkedHashMap 클래스에 정의된 메소드이다. 맵에 새로운 요소를 추가할 때마다 removeEldestEntry() 메소드가 호출되는데, 이 메소드가 true를 반환하면 가장 오래된 요소를 제거한다. 기본적으로 removeEldestEntry() 메소드는 항상 false를 반환한다. 그러나 해당 메소드를 오버라이드..
핵심 내용 아이템 42는 "익명 클래스보다는 람다를 사용하라"였다. 익명 클래스보다 람다가 더 간결하므로 특별한 경우가 아니라면 람다를 사용하라는 내용이였는데, 이번 아이템은 "람다보다는 메서드 참조를 사용하라"이다. 이번 아이템의 내용 또한 람다보다 메서드 참조가 더 간결하다면 메서드 참조를 사용하자는 내용이다. 참조 메소드 보통 람다보다 참조 메소드를 사용할 경우 더 간결해지는 편이다. 예시 1을 보자. 예시 1 - 참조 메소드를 사용하는 경우가 더 간결하다. // 임의의 키와 Integer 값의 매핑을 관리하는 프로그램 - 람다 사용 import java.util.*; public class Main { public static void main(String[] args) { Map map = ne..
핵심 내용 자바 8부터 도입된 람다 함수는 기존의 익명 클래스보다 훨씬 간결하다. 익명 클래스의 경우, 인스턴스가 필요할 경우 사용하자. 직렬화해야 할 경우에는 private 정적 중첩 클래스의 인스턴스를 사용하자. (익명 클래스와 람다 함수 모두) 낡은 방법 : 익명 클래스 방식 Collection.sort(words, new Comparator() { public int compare(String s1, String s2){ return Integer.compare(s1.length(), s2.length()); } }); 익명 클래스 방식은 코드가 너무 길기 때문에 함수형 프로그래밍에 적합하지 않다. 자바 8 이후 방법 : 람다식 방식 Collections.sort(words, (s1, s2) ->..
핵심 내용 둘 중 절대적인 정답은 없다. 프로젝트의 특성을 고려해서 마커 인터페이스와 마커 애너테이션 중 적절히 선택하자. 마커 인터페이스 vs 마커 애너테이션 마커 인터페이스 이 인터페이스를 구현한 클래스의 인스턴스들에게 어떤 특징을 부여하는 역할을 한다. 메소드를 전혀 포함하지 않는 인터페이스를 의미한다. 대표적인 예시로 Serializable 인터페이스가 있다. 이 인터페이스를 구현한 클래스의 인스턴스가 직렬화될 수 있음을 나타내는 역할을 한다. 마커 애너테이션 이 애너테이션이 달린 요소(클래스, 메소드, 필드 등)에 어떤 특징을 부여하는 역할을 한다. 멤버를 전혀 포함하지 않는 애너테이션을 의미한다. 대표적인 예로 @FunctionalInterface 애너테이션이 잇다. 이 애너테이션은 해당 인터..
핵심 내용 이 아이템을 정리를 해야 하나? 싶을 정도로 당연한 말이다. 오버라이딩을 할 경우, @Override를 항상 붙혀 디버깅이 쉽도록 하자. @Override를 일관되게 사용해야 하는 이유 public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * first + s..
핵심 내용 제목이 다다. 아래 내용은 애너테이션을 만드는 예제를 다룬 것.. 명명 패턴의 단점 1. 오타가 나면 안 된다. 2. 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다. ex. 메소드가 아닌 클래스 명을 TestSafeMechanisms로 지은 경우 3. 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다. ex. 특정 예외를 던져야 성공하는 테스트 뭐 이런 단점을 모두 해결해주는 것이 애너테이션이다. 마커(marker) 애너테이션 : 아무 매개변수 없이 단순히 대상에 마킹 // 오타나 메소드 선언 외의 프로그램 요소에 달면 컴파일 오류 발생 import java.lang.annotation.*; /** * 테스트 메서드임을 선언하는 애너테이션이다. * 매개변수 없는 정적 메서드 전용..
핵심 정리 열거 타입은 확장할 수 없다. 그러나 인터페이스와 그 인터페이스를 구현하는 열거 타입을 사용하면 비슷한 효과를 낼 수 있다. But 열거 타입끼리의 상속을 구현할 수는 없다. 열거 타입 vs 타입 안전 열거 패턴 // 열거 타입 public enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } // 타입 안전 열거 패턴 public class Day { public static final Day MONDAY = new Day("MONDAY"); public static final Day TUESDAY = new Day("TUESDAY"); // 생략 private final String name; private ..