[우아한테크코스] 3월 16일 TIL

1 minute read

오늘 배운 것

  1. Java8 Lambda, Stream API

Java8 Lambda, Stream API

구체적인 작업 방식은 라이브러리가 결정한다. 무엇을 수행할지에 집중하자.
side-effect 발생하지 않음

  1. 함수랑 무엇인가
    • 같은 인수값으로 함수를 호출했을 때 항상 같은 값을 반환한다.
    • 함수나 메서드는 지역 변수를 변경해야만 한다. 함수나 메서드에서 객체를 참조한다면 참조하는 객체는 불변객체여야 한다.
    • 메서드 내에서 생성한 객체의 필드는 갱신할 수 있으나 그것이 외부에 노출되지 않아야 하고 다음 메서드의 결과에 영향을 미치지 않아야 한다.
    • 함수나 메서드가 어떠한 예외도 일으키지 않아야 한다.
  2. 함수형 프로그래밍의 멀티코어와 동시성 제어
    • 자바 8 전까지는 멀티 코어를 활용하려면 스레드 활용이 추천되었다. 스레드, 락, 스레드 풀, concurrent collection, 포크/조인 프레임워크 등
    • 자바 8은 간결한 코드, 멀티코어 프로세서의 쉬운 활용을 기반으로 한다.
  3. 함수형 프로그래밍의 특징
    • 변경 불가능한 값을 활용한다.
    • 함수가 1급 시민의 역할을 한다. 함수가 함수를 인자로 받거나, 함수의 반환값으로 활용하거나, 자료구조에 저장할 수 있어야 한다.
  4. 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
    언박싱, 박싱도 비용이므로 기본형 특화 스트림을 사용하자.
  • 캐싱
    람다에서는 캐싱을 이용해 최적화한다.
    1. Stream API
  • Intermediate / Terminate Operation

오늘의 배운점

  1. 깊은 복사 vs 얕은 복사 vs 방어적 복사 깊은 복사: 아예 새로운 객체를 만들어내는 것 방어적 복사: 요소를 참조하여 새로운 객체를 만드는 것 (요소의 불변성이 보장되어야 함)
    얕은 복사: 주소값을 참조해 복사하는 것
  2. 체스 미션 진행
    • assertDoesNotThrow 하면 예외가 생기지 않는다 확인