728x90
반응형
728x90
반응형
디폴트 메서드 추상 메서드만 가질 수 있던 인터페이스에서 default 키워드를 사용해서 메서드를 선언할 수 있다. 인터페이스는 자신을 구현하는 클래스에서 메서드를 구현하지 않을 수 있는 새로운 메서드 시그니처를 제공한다. 인터페이스를 구현하는 클래스에서 구현하지 않은 메서드는 인터페이스 자체에서 기본으로 제공한다. 디폴트 메서드는 구현 클래스에서 구현할 필요 없다. (재정의해도 상관은 없다. 추상 메서드처럼 필수만 아닐 뿐) public interface Map { int size(); boolean isEmpty(); ... default V getOrDefault(Object key, V defaultValue) { V v; return (((v = get(key)) != null) || conta..
컬렉션 팩토리 Java 9에서는 적은 요소를 포함하는 List, Map, Set을 쉽게 만들 수 있도록 팩토리 메서드가 등장했다. List List fritends = new ArrayList(); friends.add("A"); friends.add("B"); friends.add("C"); // Arrays.asList() 팩토리 메서드 사용 List friends = Arrays.asList("A", "B", "C"); // List.of 팩토리 메서드 사용 List friends = List.of("A", "B", "C"); Set Set friends = Set.of("A", "B", "C"); map // 10개 이하의 키와 값 쌍을 가진 작은 맵 생성 Map ageOfFriends = Map..
병렬 스트림 Java 7 이전에는 데이터 컬렉션을 병렬로 처리하기 어려웠다. 데이터를 서브 파트로 분할 분할된 서브 파트를 각각의 스레드로 할당 스레드로 할당 후 의도치 않은 레이스 컨디션이 발행하지 않도록 동기화 추가 부분 결과를 다시 결합 하지만, Java 7은 더 쉽게 병렬화를 수행하면서 에러를 최소화할 수 있도록 포크/조인 프레임워크 기능을 제공한다. 컬렉션에 parallelStream을 호출하면 병렬 스트림이 생성된다. 병렬 스트림이란 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림이다. 따라서 병렬 스트림을 이용하면 모든 멀티코어 프로세서가 각각의 청크를 처리하도록 할당할 수 있다. 성능 측정 자바 마이크로벤치마크 하니스(Java Microbenchmark Harn..
스트림 Java 8 API에 추가된 기능으로 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 스트림이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소이다. 또한, 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 선언형으로 간결하고 가독성이 좋다. 조립할 수 있어 유연성이 좋다. 병렬화로 성능이 좋다. 반복자와 마찬가지로 스트림도 한 번만 탐색할 수 있다. 즉, 탐색된 스트림 요소는 소비된다. 스트림 연산끼리 파이프라이닝을 구성할 수 있다. 그 덕에 게으름, 쇼트서킷 같은 최적화도 얻을 수 있다. List title = newArrayList("Java8", "In", "Action"); Stream streamTitles = tit..
람다 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이다. // 익명 함수 Comparator byWeight = new Comparator() { public int compare(Apple a1, Apple a2) { return a1.getWeight().compareTo(a2.getWeight()); } } // 람다 Comparator byWeight = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()); 함수형 인터페이스 오직 하나의 추상 메서드만 지정하는 인터페이스이다. (디폴트 메서드 제외) @FunctionalInterface 어노테이션으로 함수형 인터페이스임을 명시한다. 함수 디스크립터 함수형 인터페이스의..
동작 파라미터화(Behavior Parameterization) 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 이 코드 블록은 나중에 프로그램에서 호출된다. 즉, 코드 블록의 실행은 나중으로 미뤄진다. 동작 파라미터화를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응할 수 있다. 녹색 사과 필터링 public List filterGreenApples(List inventory) { List result = newArrayList(); for (Apple apple : inventory) { if ("green".equals(apple.getColor())) { result.add(apple); } } return result; } 다른 색상으로 필터링 해달라는 요구사항이 생기는 경우,..