728x90
728x90
컬렉션 팩토리 기존에는 Arrays.asList() 팩토리 메서드르 이용하여 간단한 코드로 쉽게 List 요소를 생성했다. 이렇게 생성된 리스트는 크기가 고정된다. 즉 요소를 갱신할 수는 있지만 새 요소를 추가하거나 요소를 삭제할 순 없다. 만약 요소를 추가 및 삭제하는 작업을 수행하게 되면 UnsupportedOperationException 예외가 발생한다(필자의 경우에도 Arrays.asList의 크기가 고정된다는 사실을 까먹어서 테스트 코드가 깨지면 왜 깨지는지 오류를 못 찾고는 했다). 아쉽게도 Set 혹은 Map을 바로 생성할 수 있는 방법은 없다. 리스트를 인수로 받는 HashSet 생성자를 통해 그.나.마 집합을 바로 생성할 수도 있긴 하다. 이는 스트림 API를 통해 아래와 같이도 만들 ..
운영체제 소개 일상 생활 속의 운영체제 일반 컴퓨터나 노트북의 전원을 켜면 가장먼저 만나게 되는 소프트웨어 예시 개인용 컴퓨터: Window, Mac 대형 컴퓨터: Unix, Linux 모바일: iOS, Android MP3, 네비게이션, PMP 등 작은 전자기기: 임베디드 운영체제(or 임베디드 시스템) 임베디드 운영체제는 CPU의 성능이 낮고 메모리 크기가 작은 기계에 설치되기 때문에 일반 운영체제에 비해 몇 가지 기능이 빠져있다. 또한 임베디드 운영체제가 있는 기계는 기능을 계속 향상할 수 있다. 필요성 초기의 컴퓨터는 정해진 계산만 수행했기 때문에 특별한 사용 규칙이 필요 없었다. 그러나 메모리, CPU 등의 성능이 향상되고, 여러 작업을 동시에 할 수 있는 컴퓨팅 환경이 조성되면서 사용 규칙이 ..
아이템 28에서 이야기했듯 매개변수화 타입은 불공변(invariant)이다. 예를들어 List은 List가 하는 일을 제대로 수행하지 못하니 하위 타입이 될 수없다(리스코프 치환 원칙에 어긋난다). 하지만 때론 불공변 방식보다 유연한 무언가가 필요하다. 아이템29에서 언급된 Stack 클래스를 떠올려보자. 아래에 Stack의 public API를 나열했다. publci class Stack public Stack(); public void push(E e); public E pop(); public boolean isEmpty(); } 여기에 일련의 원소를 스택에 넣는 메서드를 추가해야 한다고 해보자. public void pushAll(Iterable src) { for (E e : src) push(..
중간연산은 스트림 파이프라인을 구성하며, 스트림의 요소를 소비하지 않는다. 반면 최종 연산은 스트림의 요소를 소비해서 최종 결과를 도출한다. reduce가 그랬던 것처럼 collect 역시 다양한 요소 누적 방식을 인수로 받아서 스트림을 최종 결과로 도출하는 리듀싱 연산을 수행할 수 있다. 다양한 요소 누적 방식은 Collector 인터페이스에 정의되어 있다. 지금부터 컬렉션, 컬렉터, collect를 헷갈리지 않도록 주의해야한다. 컬렉터란? 함수형 프로그래밍에서는 '무엇'을 원하는지 직접 명시할 수 있어서 어떤 방법으로 이를 얻을지는 신경 쓸 필요가 없다. 이전 예제에서 collect 메서드로 Collector 인터페이스 구현을 전달했다. Collector 인터페이스 구현은 스트림의 요소..
필터링 프레디케이트로 필터링 프레디케이트(불리언을 반환하는 함수)를 인수로 받아서 프레디케이트와 일치하는 모든 요소를 포함하는 스트림을 반환한다. 예제 List vegetarianMenu = menu.stream() .filter(Dish::isVegatarian) .collect(toList()); 고유 요소 필터링 스트림은 고유 요소로 이루어진 스트림을 반환하는 distinct 메서드도 지원한다. (고유 여부는 스트림에서 만든 객체의 hashCode, equals로 결정된다). List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); numbers.stream() .filter(i -> i % 2 == 0) .distinct() .forEach(System.out::..
스트림이란 무엇인가? 스트림stream은 자바 8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 또한 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다(단순히 stream()을 paralleStream() 로 변경하면..). 스트림의 새로운 기능은 다음과 같은 다양한 이득을 준다는 사실을 기억하자. 선언형으로 코드를 구현할 수 있다. 즉, 선언형 코드와 동작 파라미터화를 활용하면 변하는 요구사항에 쉽게 대응할 수 있다. filter, sorted, map, collect 같은 여러 빌등 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있다. 여러 연산을 파이프라인으로 연결해도 여전히 가독성과 명확성이..