[우아한테크코스] 3월 16일 TIL
오늘 배운 것
- Java8 Lambda, Stream API
Java8 Lambda, Stream API
구체적인 작업 방식은 라이브러리가 결정한다. 무엇을 수행할지에 집중하자.
side-effect 발생하지 않음
- 함수랑 무엇인가
- 같은 인수값으로 함수를 호출했을 때 항상 같은 값을 반환한다.
- 함수나 메서드는 지역 변수를 변경해야만 한다. 함수나 메서드에서 객체를 참조한다면 참조하는 객체는 불변객체여야 한다.
- 메서드 내에서 생성한 객체의 필드는 갱신할 수 있으나 그것이 외부에 노출되지 않아야 하고 다음 메서드의 결과에 영향을 미치지 않아야 한다.
- 함수나 메서드가 어떠한 예외도 일으키지 않아야 한다.
- 함수형 프로그래밍의 멀티코어와 동시성 제어
- 자바 8 전까지는 멀티 코어를 활용하려면 스레드 활용이 추천되었다. 스레드, 락, 스레드 풀, concurrent collection, 포크/조인 프레임워크 등
- 자바 8은 간결한 코드, 멀티코어 프로세서의 쉬운 활용을 기반으로 한다.
- 함수형 프로그래밍의 특징
- 변경 불가능한 값을 활용한다.
- 함수가 1급 시민의 역할을 한다. 함수가 함수를 인자로 받거나, 함수의 반환값으로 활용하거나, 자료구조에 저장할 수 있어야 한다.
- Lambda expression
- 메서드로 전달할 수 있는 익명 함수로, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트 등을 가질 수 있다.
- 람다 표현식을 사용하면 메서드 참조보다 참조가 한번 더 일어난다.
- enum abstract method
```java enum Operation implements Double~~ { PLUS(“+”) { @Override public double applyAsDouble(double left, double right) { return left + right; } }; }
enum Operation implements Double~~ { PLUS(“+”, (l, r) -> l + r); } ```
- FuncionalInterface란?
단 하나의 추상 메서드만 선언된 인터페이스
입력에서 참조값이 있으면 side effect가 생기지만, 단순히 입력에 의해서만 출력이 결정된다면 side effect가 없는 순수한 함수를 만들 수 있다. -
식/문에 따라 달라지는 람다 문법
식: () -> expression;
문: () -> { return expression; } - auto boxing
언박싱, 박싱도 비용이므로 기본형 특화 스트림을 사용하자. - 캐싱
람다에서는 캐싱을 이용해 최적화한다.- Stream API
- Intermediate / Terminate Operation
오늘의 배운점
- 깊은 복사 vs 얕은 복사 vs 방어적 복사
깊은 복사: 아예 새로운 객체를 만들어내는 것
방어적 복사: 요소를 참조하여 새로운 객체를 만드는 것 (요소의 불변성이 보장되어야 함)
얕은 복사: 주소값을 참조해 복사하는 것 - 체스 미션 진행
- assertDoesNotThrow 하면 예외가 생기지 않는다 확인