[TIL] 2022.01.10

Minsu Han·2022년 1월 10일
0

TODAY I LEARNED

목록 보기
13/46
post-thumbnail

오늘 한 일

  • JAVA 복습 (chap16. 스트림과 병렬 처리)

배운 것

  • 스트림(Stream) : 컬렉션의 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자

    • 스트림의 특징
    1. 람다식으로 요소 처리 코드를 제공함 (람다식이나 메소드 참조를 이용해서 요소 처리 내용을 매개값으로 전달 가능)
    2. 내부 반복자(컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리 코드만 제공하는 iterator 패턴)를 사용하여 병렬 처리가 쉽다(멀티코어 CPU를 활용하기 위해 컬렉션에서 요소들을 분배시켜 병렬 작업을 할 수 있게 도와줌)
    3. 컬렉션 요소에 대해 중간 처리(매핑, 필터링, 정렬, 그룹핑...)와 최종 처리(반복, 카운팅, 평균, 총합, 매칭여부확인 등 집계처리)를 할 수 있다. (대량의 데이터를 가공하여 축소; Reduction)
  • 스트림 파이프라인 : 여러 개의 스트림이 연결되어 있는 구조

// 스트림 파이프라인 코드 예시
double ageAge = list.stream()			// 오리지널 스트림
	.filter(m -> m.getSex()==Member.MALE)	// 중간 처리 스트림(필터링)
	.mapToInt(Member :: getAge)		// 중간 처리 스트림(매핑)
	.average()				// 최종 처리
	.getAsDouble();

  • 중간 처리 메소드의 리턴 타입은 스트림, 최종 처리 메소드의 리턴 타입은 OptionalXXX
  • 루핑 메소드 peek()은 중간 처리 메소드이므로 최종 처리 메소드가 호출되지 않으면 동작하지 않는다(최종 처리 메소드 호출 때까지 지연됨). forEach()는 최종 메소드이므로 호출 후 다른 최종 처리 메소드를 호출하면 안 된다.
  • 그 외 다양한 중간 처리, 최종 처리 메소드들: docs

  • 동시성(Concurrency) : 멀티 작업을 위해 멀티스레드가 번갈아가며 실행하는 성질
  • 병렬성(Parallelism) : 멀티 작업을 위해 멀티 코어를 이용해서 여러 스레드를 동시에 실행하는 성질
  • 병렬 스트림은 백그라운드에서 포크조인 프레임워크(ForkJoin Framework)를 사용한다.
    Fork - 전체 데이터를 서브 데이터로 분리
    Join - 서브 결과를 결합하여 최종 결과를 만듦
  • 병렬 스트림 생성 메소드: parallelStream(), parallel()
  • 스트림 병렬 처리가 스트림 순차 처리보다 항상 성능이 좋은 것은 아니다.
    • 병렬 처리 성능에 영향을 미치는 3가지 요인
      1. 요소 수와 요소당 처리 시간 (병렬처리는 스레드풀, 스레드 생성에 비용이 소요되기 때문에 컬렉션 요소 수가 적고 요소당 처리 시간이 짧으면 순차처리가 더 빠를 수 있음)
      2. 스트림 소스 종류 (인덱스로 요소를 관리하는 ArrayList, 배열 등은 포크 단계에서 요소 분리가 쉬워서 병렬 처리 시간이 절약됨. 반면 HashSet, TreeSet, LinkedList 등은 요소 분리가 쉽지 않음)
      3. Core 수 (많을수록 좋다)

내일 할 일

  • JAVA 복습 (chap18. IO 기반 입출력 및 네트워킹)

참고문헌
이것이 자바다

profile
기록하기

0개의 댓글