-- 목차 --
1. stream 은 API 인가? 데이터 타입인가? 메소드인가?
2. findAny()와 findFirst() 의 차이는?
3. findAny()와 findFirst()는 stream의 메소드인가?
4. Optional 은 타입인가?
5. Optional 의 메서드 - .get(), .ifPresent(), .orElse()

이클립스에 작성한 코드 상의 .stream() 에 커서를 올렸을 때, 아래에 나타난 내용을 바탕으로 보면 아래와 같다.
>> 괄호가 붙어있으면 메서드
datas.stream() ...
* 함수와 메서드의 차이는?
함수 (Function)
보통 클래스나 객체와 상관없이 독립적으로 존재하는 코드 뭉치
(C언어나 Python의 전역 함수 등)
메서드 (Method)
클래스(Class)나 인터페이스(Interface) 안에 속해 있는 함수를 특별히 "메소드"라고 부름.
*
API와메소드의 관계API (Application Programming Interface)
: 프로그램을 작성하기 위해 제공되는 모든 클래스, 인터페이스, 메소드들의 집합(약속)
- 예: "Java Stream API를 사용했다"라고 하면, 스트림과 관련된 모든 기능(filter, map, findFirst 등)을 통틀어 말하는 것
메소드 (Method)
: 그 API 안에서 특정한 기능 하나를 수행하는 구체적인 명령어
- 예: "findFirst() 메소드를 호출했다"는 API라는 도구 상자에서 findFirst라는 특정 도구를 꺼내 썼다는 뜻
>> 대문자로 시작한다면 데이터 타입 (인터페이스)
Stream<String> streamedDatas = ...
병렬 처리 & 가독성, 유지보수성 향상
Java Stream을 사용하기 전에는
반복문(for), 조건문(if-else)을 사용하여 코드를 작성함.
그러나 이런 방법은 코드가 길어짐.
코드가 길면 -> 가독성 저하, 유지보수 어려움
.
.
따라서 Java8 부터 Java Stream API를 내장 라이브러리로? 가져옴
개선된 부분: 코드가 간결하고 명확해짐 -> 가독성 향상, 유지보수성 향상
.
.
Stream에서 "병렬 처리"를 지원 << 핵심?
병렬 처리 : 데이터의 흐름을 나누어서 멀티 스레드로 병렬로 처리하고, 처리 후에 합치는 과정
이를 통해 => 대량의 데이터를 빠르고 쉽게 처리할 수 있음(Steam의 장점)
.
.
데이터 병렬 처리 : 멀티 스레드를 이용해서 데이터를 효율적으로 처리할 수 있음. (대용량 데이터 처리에 필수적인 기능)
Java Stream API 의 경우 : steam().parallel() 또는 parallelStream() 으로 간단하게 병렬 처리 가능
.
.
이해를 돕기 위해 대용량 로그 파일의 분석이나 대규모 데이터베이스의 쿼리 처리 등을 예로 들 수 있는데요. 로그 파일에서 특정 이벤트의 발생 빈도를 분석하거나, 대규모 데이터베이스에서 특정 기간 동안의 거래 내역을 집계하는 경우가 있습니다.
Stream에서 어떤 조건에 일치하는 element 1개를 찾을 때 사용하는 API
** Stream : 데이터 타입인 "인터페이스" (int, String, List 등과 같은 자료형의 일종)
** findAny()와 findFirst()는 Stream이라는 인터페이스 안에 정의되어 있고, 스트림 객체를 통해서만 호출할 수 있기 때문에 "인스턴스 메소드"
Optional: 뒤에 .orElse , .ifPresent 를 붙이면, 값이 있는지 없는지를 확인 후에 있다면 꺼낼 수 있는 '상자'
보통 우리가 null을 건드리면 NullPointerException (널 포인터 에러)이 나죠? 하지만 Optional의 .get()을 썼을 때, 상자가 비어있으면 NoSuchElementException (요소가 없음 에러)이 납니다.
.
이게 무슨 차이냐면요:
.
NullPointerException: "야! 존재하지도 않는(null) 애한테 뭘 시키는 거야?" (자바가 어리둥절함)
.
NoSuchElementException: "야! 네가 상자에 물건이 있다고 확신해서 꺼내려고 했는데, 열어보니 없잖아! 거짓말쟁이!" (자바가 배신감 느낌)

.get(), .ifPresent(), .orElse()