20210118 - TIL

Starve·2021년 1월 18일
0

TIL

목록 보기
12/38
post-thumbnail

오늘 한 일

  • 함수형 프로그래밍에 대한 공부

    • 함수형 프로그램에는 인풋과 아웃풋이 존재하고, 외부 환경으로부터 독립적이다.
      외부환경에 독립적이므로 인풋이 같다면, 아웃풋 또한 달라지지않는다.(순수함수)

      순수 함수:

      • 부수효과(주어진 값 이외의 변수 및 프로그램 실행에 영향을 끼치지 않는 것)가 없는 함수를 순수 함수라고 한다.
      • 멀티쓰레드에서도 안전하고, 병렬처리 및 계산이 가능하다.
      • 특징: 아래의 조건을 만족해야한다.
        1. 동일한 입력에 대해 항상 같은 값을 반환
        2. 부작용(다른 요인에 따른 결과변경)이 없는 결과 생성
          -> 함수에서 인자를 변경하거나 프로그램 상태를 변경하지 않음.
    • 함수형 프로그래밍 사용 시, 일정 단위의 작업에 있어서 안전성이 보장되고,
      예측 가능한 프로그램을 제작할 수 있다.

    • 객체 지향 프로그래밍은, 데이터를 어떻게 처리 할지에 대해 명령을 통해 풀어나갔다면,
      함수형 프로그래밍은 선언적 함수를 통해, 무엇을 풀어나갈지 결정하는 것이다.

  • 함수형 프로그래밍에서 사용되는 함수는 1급객체(first-class citizens) 이어야 한다.

    1급 객체:
    일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체.
    다음 조건을 만족하는 객체이다.

    • 변수나 데이터 구조 안에 담을 수 있다.
    • 객체의 인자로 넘길 수 있다.
    • 반환 값(return value)으로 사용 가능하다.
    • 동적으로 프로퍼티 할당 가능

    자바 8에서 함수는 1급 시민이 되어, 함수형 프로그래밍의 핵심이 되었다.

  • 코드를 간결하게 만들어주고, 가독성을 높이는 장점이 있다.

참고 영상: https://youtu.be/jVG5jvOzu9Y

  • 람다식과 스트림에 대한 공부

    • 람다(Lamda)

      • 함수의 구조로 되어있으며, 자바 내에서 -> 와 같은 화살표 형태의 기호를 이용해 매개변수를 전달하는 형태를 취한다.

        ( parameters ) -> expression body       // 인자가 여러개 이고 하나의 문장으로 구성
        ( parameters ) -> { expression body }   // 인자가 여러개 이고 여러 문장으로 구성
        () -> { expression body }               // 인자가 없고 여러 문장으로 구성
        () -> expression body                   // 인자가 없고 하나의 문장으로 구성
      • 장점:

        1. 효율적인 사용을 통해 불필요한 루프문 삭제가 가능하며, 함수의 재활용에 용이
        2. 필요한 정보만을 사용하는 방식을 통한 성능 향상
        3. 병렬처리에 유리
      • 단점:

        1. 단순하게 모든 원소를 순회하는 경우, 람다식의 속도가 조금 느릴 수 있음.
        2. 디버깅시 함수 콜스택 추적에 어려움이 있다.
        3. 지나친 사용 시, 코드 이해도가 떨어진다.
  • 스트림

    • 데이터 소스를 추상화 하여, 데이터를 다루는 데 자주 사용되는 메서드들을 정의 해 놓은 것.
      데이터 소스가 무엇이든 같은 방식으로 다룰 수 있게 되었다.

    • 특징:

      1. 데이터 소스를 변경하지 않는다.

        • 데이터를 읽기만 할 뿐 변경하지는 않지만, 필요하다면 정렬된 결과를 배열이나 컬렉션에 담아 반환할 수 있다.
      2. 일회용이다.

        • 한 번 사용되면 재 사용할 수 없어, 다시 선언해야한다.
  3. 작업을 내부 작업으로 처리한다.

     * `forEach()` 의 경우, 반복문을 메서드 안에 숨겨, 내부 반복 작업을 진행한다.

       ```java
       void forEach(Consumer<? super T> action) {
         Objects.requireNonNull(action); // 매개변수의 null 체크
           
         for(T t: src){ // 내부 반복
           action.accept(T);
         }
       }
       ```

* 연산의 파이프 라인
  `스트림 생성(Create)` -> `중간연산(Intermediate operating)` -> `최종연산(Final operation)` 의 형태를 가진다.

  ```java
  Arrays.stream(strArr)
  	.distinct()  // 중복 데이터 제거
  	.limit(5)		 // 데이터를 5개로 제한
  	.sorted()    // 데이터 정렬
  	.forEach(System.out::print); // 내부의 데이터를 순차적으로 돌면서 출력
  ```

참고 사이트: https://dinfree.com/lecture/language/112_java_9.html#m1

오늘 느낀점

  • 나름 열심히 공부했다고 생각했는데 다 오산이었다. 아직 배울게 산더미 같다..
    어려운 만큼 확실히 이해하고 넘어가고 싶으니, 이번 미션같은 경우엔 마감 시간안에 끝내고싶다는 강박을 조금 버리는 연습을 해야할 것 같다.

내일 할 일

  • 마스터 클래스 수강
  • 함수형 프로그래밍에 대한 조금 더 자세한 공부 및 정리
profile
노력

1개의 댓글

comment-user-thumbnail
2021년 1월 18일

부수효과(주어진 값 이외의 변수 및 프로그램 실행에 영향을 끼침)가 없는 함수를 순수함수라고 한다.

답글 달기