모던

· Java
Spliterator 인터페이스란? Spliterator는 분할할 수 있는 반복자라는 의미이다. Iterator 처럼 Spliterator는 소스의 요소 탐색 기능을 제공한다는 점은 같지만 Spliterator는 병렬 작업에 특화되어 있다. 커스텀 Spliterator를 꼭 구현해야 하는 건 아니지만 Spliterator가 어떻게 동작하는지 이해한다면 병렬 스트림 동작과 관련한 통찰력을 얻을 수 있다. java8은 컬렉션 프레임워크에 포함된 모든 자료구조에 사용할 수 있는 디폴트 Spliterator 구현을 제공한다. public interface Spliterator { boolean tryAdvance(Consumer
· Java
포크/조인 프레임워크(Fork/Join Framework)란? 포크/조인 프레임워크는 병렬화할 수 있는 작업을 재귀적으로 작은 작업으로 분할한 다음에 서브태스크 각각의 결과를 합쳐서 전체 결과를 만들도록 설계되었다. 따라서 하나의 작업을 작은 단위로 나눠서 여러 쓰레드가 동시에 처리하는 것을 쉽게 만들어 준다. 이 알고리즘은 분할 후 정복(divide-and-conquer) 알고리즘의 병렬화 버전이다. 포크/조인 프레임워크에서는 서브태스크를 스레드 풀(ForkJoinPool)의 작업자 스레드에 분산 할당하는 ExecutorService 인터페이스를 구현한다. RecursiveTask 활용 스레드 풀을 이용하려면 RecursiveTask의 서브클래스를 만들어야 한다. 여기서 R은 병렬화된 태스크가 생성하는..
· Java
Collector 인터페이스란? Collector 인터페이스는 리듀싱 연산(즉, 컬렉터)을 어떻게 구현하지 제공하는 메서드 집합으로 구성된다. 물론 우리가 Collector 인터페이스를 구현하는 리듀싱 연산을 만들 수도 있다. Collector 인터페이스를 집접 구현해서 더 효율적으로 문제를 해결하는 컬렉터를 만드는 방법을 살펴보자. Collector 인터페이스를 보면 시그니처와 다섯 개의 메서드 정의를 확인할 수 있다. public interface Collector { Supplier supplier(); BiConsumer accumulator(); BinaryOperator combiner(); Function finisher(); Set characteristics(); } 먼저 시그니처를 보면..
· Java
컬렉터(Collector)란 무엇인가? 컬렉터(Collector) 인터페이스 구현은 스트림 요소를 어떤 식으로 도출할지 지정한다. 스트림에 collect를 호출하면 컬렉터가 스트림의 요소에 리듀싱 연산을 수행하여 필요한 데이터 구조로 간단하게 도출할 수 있다. 만약 아래처럼 통화 별 주문 목록 데이터가 있다고 가정해보자. @ToString @Getter @AllArgsConstructor public class Order { private String orderNumber; private String orderProductName; private Integer payPrice; private Currency currency; } List orders = new ArrayList() {{ add(new O..
· Java
앞서 스트림이 무엇인지, 스트림을 어떻게 활용하는지 알아보았다. 이번엔 여러가지 스트림을 만드는 방법에 대해 알아보자. 값으로 스트림 만들기 임의의 수를 인수로 받는 정적 메서드 Stream.of를 이용해서 스트림을 만들 수 있다. Stream stream = Stream.of("a", "b", "c", "d", "e"); stream.map(String::toUpperCase).forEach(System.out::println); 다음 처럼 empty 메서드를 이용해서 스트림을 비울 수 있다. Stream emptyStream = Stream.empty(); null이 될 수 있는 객체로 스트림 만들기 java9에서는 null이 될 수 있는 개체를 스트림으로 만들 수 있는 새로운 메소드가 추가되었다. ..
· Java
Java 8 API의 몇몇 함수형 인터페이스는 다양한 유틸리티 메서드를 포함한다. 예를 들어 Comparator, Function, Predicate 같은 함수형 인터페이스는 람다 표현식을 조합할 수 있도록 유틸리티 메서드를 제공한다. 이것은 무슨 의미일까? 간단히 말해, 간단한 여러 개의 람다 표현식을 조합해서 두 Predicate의 or 연산을 수행하는 커다란 Predicate를 만들 수 있다. 또한 한 함수의 결과가 다른 함수의 입력이 되도록 두 함수를 조합할 수 있다. 그런데 Java 8 API에서 지원하는 Comparator, Function, Predicate 인터페이스는 함수형 인터페이스 아닌가? "함수형 인터페이스는 추상화 메서드가 1개뿐이라며?!" 라고 생각할 수 있을것이다. 그렇다. 추..
· Java
메서드 참조란? 메서드 참조는 특정 람다의 축약형이라고 생각할 수 있다. 메서드 참조를 이용하면 기존 메서드 정의를 재활용해서 람다처럼 전달할 수 있으며 때로는 람다 표현식보다 메서드 참조를 사용하는 것이 더 가독성이 좋으며 자연스러울 수 있다. inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())); // 람다 표현식 inventory.sort(compareTo(Apple::getWeight)); // 메서드 참조 위 코드를 보면 Apple::getWeight는 Apple에 정의된 getWeight의 메서드 참조다. 메서드명 앞에 구분자(::)를 분해 방식으로 메서드 참조를 활용하였다. 메서드 참조를 이용하면 같은..
· Java
자바 8 라이브러리 설계자들은 java.util.function 패키지로 여러가지 새로운 함수형 인터페이스를 제공한다. Predicate java.util.function.Predicate 인터페이스는 test라는 추상 메서드를 정의하며 test는 제네릭 형식 T의 객체를 인수로 받아 boolean을 반환한다. T 형식의 객체를 사용하는 boolean 표현식이 필요한 상황에서 Predicate 인터페이스를 사용할 수 있다. @FunctionalInterface public interface Predicate { boolean test(T t); } public List filter(List list, Predicate P) { List results = new ArrayList(); for (T t:li..
· Java
람다란 무엇인가? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 람다라는 용어는 람다 미적분학 학계에서 개발한 시스템에서 유래했다. 람다 표현식에는 이름은 없지만 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다. 람다의 특징을 하나씩 살펴보자. 익명 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. 구현해야 할 코드에 대한 걱정거리가 줄어든다. 함수 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다. 전달 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 익명 클래스처럼 많은 코드를 구현할 필요가 없다...
· Java
동작 파라미터화란? 우리가 어떤 상황에서 일을 하든 소비자 요구사항은 항상 바뀐다. 변화하는 요구사항은 소프트웨어 엔지니어링에서 피할 수 없는 문제다. 회사에서 매일 점심 메뉴를 정해야 하는데 매일 변하는 과장님의 입맛을 맞춰서 정해야 한다고 예를 들어보자. 월요일 - "주말에 과식을 했으니 칼로리가 적은 음식을 먹어야겠어" 화요일 - "어제는 칼로리가 적은 음식을 먹었으니 오늘은 푸짐한 음식을 먹고 싶어" 수요일 - "어제 퇴근하고 술을 먹어서 해장으로 국물이 있는 음식을 먹고 싶어" 목요일 - "스트레스를 받으니 매운 음식을 먹고 싶군" 금요일 - "오늘은 금요일이라 기뻐서 칼로리가 높은 음식을 먹을래!" 이렇게 자주 변화하는 요구사항에 동작 파라미터화(Behavior Parameterization)..
beekei
'모던' 태그의 글 목록