최근에 면접에서 질문이 있었다…
Stream 에 대해서 아세요???

사실 이 글은… Stream도 Stream이지만 내 개인적으로 기술이나, 개념 정리가 필요하다! 라는 것을 상기하기 위한 글이다..



먼저, 나는 Stream을 이미 많이 쓰고 방법과 주로 사용하는 용도에 대해서도 알고 있다고 생각했다.

근데… 면접을 가면서, 어떻게 준비 해야 할 지 감을 못 잡은 상황에서, 뭐 아는게 없는데 면접 한번 가 본 사람 처럼 보였나보다..
“Stream 이 뭔지 아시나요?”
어쩌면 내가 함수형에 대해 안다고 말해서 물어봤던 기초적인 질문 이었을 것이다…
나는 잘 대답을 하지 못했다.
.
.
.
면접.. 죽쒔다….


많이 쓰고 활용 중인 것들에 대해 개념 정리부터 다시 해야겠다.


여러 레퍼런스들을 조합해 본 내 나름 대로의 Stream의 정의는 이렇다.

추상화 된 데이터 집합(Iterable)을 순서 나 상태에 상관 없이 함수(-또는 연산) 의 나열로 가공 할 수 있게끔 제공 해주는 Api.

여기서 Stream 기능이나 튜토리얼? 방법론에 관한 얘기는 하지 않겠다.


난 그냥 내가 쓰는 것 들에 대해 누군가가 이런식의 기본 개념 물어 볼 때 알고 써야겠다는 것을 절감했다..


이어서 연결 되는 카테고리로, 함수형 프로그래밍이란?

  • OOP 는 기본적으로 상태, 행동으로 카테고리화 시킨 객체 를 중심으로 프로그래밍 하는 패러다임 이다.
  • 함수형은 이와 다르게 상태 보다는, 하나의 기능(함수) 를 중심으로 프로그래밍 하는 방법 론을 의미한다.
  • 여기서 중요한 점은 함수는 수학적인 순수 함수(사이드 효과, 다른 상태를 바꾼다던지 하는 게 아닌 순수하게 입력값에 대한 출력 값만 갖는다) 를 중심으로 개발한다는 것이다.
  • 함수형 프로그래밍 에서 함수는 상태, 시간에 상관없이 같은 입력값에 대해서는 항상 같은 출력 값을 갖게 되는 걸 목표로 한다.


그래서 Stream이랑 함수형이랑 뭔상관인데?

  • 이 함수형기반 아래 만들어진 기능(함수)들을 토대로 데이터 집합들을 1개씩 또는 여러개 씩 가공 할 수 있게 만들어 준게 Stream이다.
  • 따라서 데이터집합의 순서는 상관 없다.
  • 병렬 처리도 가능하다.
  • 반 함수형이라 순서가 보장되야 하는 기능들도 갖고는 있다.
  • 상태들을 저장하고 하는 부분이 아니기 때문에 선언 시에 동작하는 것이 아닌 데이터 집합의 입력이 실행 될때, 또는 집합의 Compute(집계)함수 가 발현 될 때 동작한다.
    • 즉 집계 함수가 아닌 함수들만 채워 넣을 땐 동작 안한다 (Lazy)
  • 보통 실제 함수를 실행 시키는 처리 업무들은 Stream내부 api 또는 지정해준 executer 들 의 다른 쓰레드로 넘긴다.
  • 아무 행동도 취하지 않으면 추합하는 함수들(Compute 함수들) 실행 시 blocking으로 기다린다.
  • Compute 함수들
    1. Collect => 제일 복잡함
    2. FindAny, FindFirst, AnyMatch, AllMatch 류들…
    3. ForEach => 이거 쓰느니 for문 쓰는게 좀 더 눈에 들어온다는 의견들이 많음.


우선 Stream, java8 함수형 에 대한 정리는 이정도로 마무리한다.

개인적을 아쉬웠던 점은, 난 함수형 프로그래밍 좋아해서…. RX도 적극적으로 사용하고, 여러 부류들한테 전파하는 편인데.. (Scala에 대해서도 관대하다…)
근데 정작 면접 때 정리가 안된건지.. 긴장을 너무 많이 했는지 대답을 못했다는 것.
뭐. 다음이 있고 다른 회사가 있으니까…. 나랑 인연이 아니었나보다.