전체 글
-
item 47 반환 타입으로는 스트림보다 컬렉션이 낫다책/이펙티브 자바 2022. 4. 12. 17:35
ITEM 47 반환 타입으로는 스트림보다 컬렉션이 낫다 원소 시퀀스(일련의 원소)를 반환하는 메서드는 수없이 많으며 자바 7까지는 이런 메서드의 반환 타입을 Collection, SEt, List 같은 컬렉션 인터페이스나 Iterable이나 배열을 사용했다 이 중에서 가장 적합한 타입을 선택하는게 어렵지 않았다 컬렉션 인터페이스 : 기본으로 사용 Iterable 인터페이스 : for-each 문에서만 쓰이거나 반환된 원소 시퀀스가(주로 contains(Object) 같은) 일부 Collection 메서드를 구현할 수 없을때 배열 : 반환 원소들이 기본 타입이거나 성능에 민감한 상황 하지만 자바 8이 스트림이라는 개념을 들고 오면서 선택이 복잡해졌다 스트림은 반복을 지원하지 않아서 스트림과 반복을 조합해야..
-
item 46 스트림에서는 부작용 없는 함수를 사용하라책/이펙티브 자바 2022. 4. 12. 16:56
ITEM 46 스트림에서는 부작용 없는 함수를 사용하라 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성 하는것 각 변환 단계는 가능한 이전 단계의 결과를 받아 처리하는 순수 함수여야 한다 순수 함수 : 오직 입력만이 결과에 영향을 주는 함수 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 않고 함수 스스로도 다른 상태를 변경하지 않음 따라서 중간 단계든 종단 단계든 스트림 연산에 건네는 함수 객체는 모두 부작용이 없어야 한다 스트림 패러다임을 이해하지 못한 api 사용법 텍스트 파일에서 단어별 수를 세어 빈도표로 만든다 Map freq = new HashMap(); try (Stream words = new Scanner(file).tokens()) { words.forEac..
-
item 45 스트림은 주의해서 사용하라책/이펙티브 자바 2022. 4. 11. 17:06
ITEM 45 스트림은 주의해서 사용하라 스트림 API는 다량의 데이터 처리 작업(순차적이든 병렬적이든)을 위해 java8에 추가됐다 스트림 API가 제공하는 추상 개념 중 핵심은 두가지다 스트림(stream)은 데이터 원소의 유한 혹은 무한 시퀀스(sequence)를 뜻한다 스트림 파이프라인(stream pipeline)은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다 스트림의 원소들은 어디로부터든 올 수 있으며 대표적으로 컬렉션, 배열, 파일, 정규표현식 패턴 매처(matcher),난수 생성기, 혹은 다른 스트림이 있다 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값이다 기본 타입 값으로는 int, long, double 세가지를 지원한다 스트림 파이프라인은 소스 스트림에서 시작해 종단 ..
-
item 44 표준 함수형 인터페이스를 사용하라책/이펙티브 자바 2022. 4. 11. 16:17
ITEM 44 표준 함수형 인터페이스를 사용하라 자바가 람다를 지원하며 API를 작성하는 모범 사례도 크게 바뀌었다 한 예로 템플릿 메서드 패턴의 매력이 크게 줄었다 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 패턴 이를 대체하는 현대적인 해법은 아래와 같다 같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것 이 내용을 일반화해서 말하면 함수 객체를 매개변수로 받는 생성자와 메서드를 더 많이 만들어야한다 이때 함수형 매개변수 타입을 올바르게 선언해야 한다 LinkedHashMap을 예로 들어보자 LinkedHashMap의 protected 메서드인 removeEldestEntry를 재정의하면 캐시로 사용 가능하다 맵에 새로운 키를 추가하는 put 메서드는 이 메서드를 호출하..
-
item 43 람다보다는 메서드 참조를 사용하라책/이펙티브 자바 2022. 4. 11. 16:17
ITEM 43 람다보다는 메서드 참조를 사용하라 메서드 참조 람다가 익명 클래스보다 좋은점 중 가장 큰 특징은 간결함인데 함수 객체를 람다보다도 간결하게 만드는 방법이다 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부 map.merge(key, 1, (count, incr) -> count + incr);//키가 맵안에 없으면 키와 숫자 1이 맵핑, 있으면 기존 매핑 값 증가 값이 키의 인스턴스 개수로 해석된다면 멀티셋을 구현한게 된다 위 코드는 깔끔하게 보이지만 매개변수 count와 incr이 하는일 없이 공간을 차지한다 위 람다는 두 인수의 합을 단순히 반환할 뿐인데 java8의 Integer 등 기본타입의 박싱 타입은 같은 기능을 하는 sum 메서드를 제공하기 때문에 아래와 같이 코..
-
Chapter 05 스트림 활용 작성중...책/모던 자바 인 액션 2022. 4. 7. 17:48
Chapter 05 스트림 활용 필터링 스트림의 요소를 선택하는 방법, 즉 프리디케이트 필터링 방법과 고유 요소만 필터링 하는 방법을 알아보자 프리디케이트로 필터링 스트림 인터페이스는 filter 메서드를 지원한다 filter 메서드는 프레디케이트를 인수로 받아서 프리디케이트와 일치하는 모든 요소를 포함하는 스트림을 반환한다 프레디케이트 : 불리언을 반환하는 함수 모든 채식요리를 필터링해서 체식 메뉴를 만들어보자 List vegetarianMenu = menu.stream() .filter(Dish::isVegetarian) // 채식 요리인지 확인하는 메서드 참조 .collet(toList()); 고유 요소 필터링 스트림은 고유 요소로 이루어진 스트림을 반환하는 distinct 메서드도 지원한다 고유 ..
-
Chapter 04 스트림 소개책/모던 자바 인 액션 2022. 4. 7. 11:41
Chapter 04 스트림 소개 스트림이란 무엇인가? 스트림 자바 8 API 새로 추가된 기능으로 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다 데이터를 처리하는 임시 구현 코드 대신 질의로 표현할 수 있다 (데이터 컬렉션 반복을 머싲게 처리하는 기능이라고 생각하자) 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다 저칼로리의 요리명을 반환하고 칼로리를 기준으로 요릴르 정렬하는 코드를 통하여 스트림이 제공하는 유용한 기능을 알아보자 자바 7로 작성한 코드 List lowCaloriesDishes = new ArrayList(); for (Dish dish: menu) { if (dish.getCalories() < 400) { lowCaloricDishes.add(..
-
item 42 익명 클래스보다는 람다를 사용하라책/이펙티브 자바 2022. 4. 6. 17:17
ITEM 42 익명 클래스보다는 람다를 사용하라 예전 자바에서 함수 타입을 표현하는 경우 추상 메서드를 하나만 담은 인터페이스(드물게는 추상클래스)를 사용했다 이런 인터페이스를 함수객체(function object)라고 하여 특정 함수나 동작을 나타내는 경우 사용 jdk 1.1 등장 이후 함수 객체를 만드는 주요 수단은 익명클래스가 되었다 문자열을 길이 순으로 정렬하는 코드(정렬을 위한 비교 함수로 익명 클래스를 사용한다) 익명 클래스의 인스턴스를 함수 객체로 사용하는 방법 (옛날방법) Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s..
-
item 41 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라책/이펙티브 자바 2022. 4. 6. 10:38
ITEM 41 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 마커 인터페이스 아무 메서드도 담고 있지 않으며 자기 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스 Serializable 인터페이스가 좋은 예다 Serializable은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 write를 사용 가능하다고 알려준다(직렬화 가능) 마커 애너테이션이 등장하면서 마커 인터페이스는 구식이 되었다는 말이 있지만 사실이 아니다 마커 인터페이스는 마커애너테이션보다 두 가지 측면에서 좋다 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나 마커 애너테이션은 그렇지 않다 마커 인터페이스는 어엿한 타입이기 때문에 마커 애너테이션을 사용..
-
item 40 @Override 애너테이션을 일관되게 사용하라책/이펙티브 자바 2022. 4. 6. 10:17
ITEM 40 @Override 애너테이션을 일관되게 사용하라 자바가 기본으로 제공하는 애너테이션 중 보통 개발자에게 가장 중요한 것은 @Override일 것이다 @Override는 메서드 선언부에만 달 수 있고 이 애노테이션이 달려있다는 것은 상위 타입의 메서드를 재정의 했다는 것이다 이 애너테이션을 일관되게 사용한다면 여러 가지 악명 높은 버그를 예방해준다 영어 알파벳 2개로 구성된 문자열을 표현하는 클래스 - 소문자 2개로 구성된 바이그램 26개를 10번 반복해 집합에 넣고 크기를 출력한다 - Set은 중복을 허용하지 않으니 26을 기대하지만 260이 출력된다 public class Bigram { private final char first; private final char second; pub..