자바

· Java
Java8의 라이브러리와 언어의 업데이트된 부분을 알아보자. 어노테이션(annotation) Java의 어노테이션은 부가 정보를 프로그램에 장식할 수 있는 기능이다. 즉, 어노테이션은 문법적 메타데이터(syntactic metadata)다. Java8의 어노테이션은 두 가지가 개선되었다. 1. 어노테이션 반복 이전 자바에서는 선언에서 지정한 하나의 어노테이션만 허용했다. @interface Author { Stirng name(); } @Auth(name="a") @Auth(name="b") @Auth(name="c") // 에러 발생 : 중복된 어노테이션 이제 반복 조건만 만족한다면 선언을 할 때 하나의 어노테이션 형식에 여러 어노테이션을 지정할 수 있다. 어노테이션 반복은 기본으로 제공되는 기능이 아..
· Java
디폴트 메서드(default method)란? 보통 인터페이스는 규칙을 잡거나, 서비스의 플로우 로직을 잡는 데 사용하곤 한다. 하지만 인터페이스를 구현하는 클래스에서는 메서드를 모두 구현해야하기 때문에 인터페이스에 메서드를 추가할때 문제가 발생한다. 메서드 하나를 추가하려면 해당 인터페이스를 구현하는 모든 클래스에서는 해당 메서드를 모두 구현해줘야 하는 것이다. Java8에서는 이러한 문제를 해결하기 위해 2가지 방법을 제공한다. 인터페이스 내부에 정적 메서드(static method)를 사용한다. 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드(default method) 기능을 사용한다. 인터페이스에 디폴트 메서드를 사용하여 메서드를 구현할 수 있다. 디폴트 메서드를 이용하면 인터페이스의 ..
· 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..
beekei
'자바' 태그의 글 목록