[TIL] 함수형 프로그래밍

swing·2021년 1월 27일
0

[TIL]

목록 보기
4/10
post-thumbnail

클로저 closure에 대해 학습하고 정리한다.

1. 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 칭한다.

- 응집성을 위해 함수안에 내부함수와 내부 변수를 지정한다.

- 내부 함수에서 외부 함수의 지역변수에 접근 할 수 있다.

- 외부 함수가 사용되지 않는 경우에도 내부 함수가 외부 함수에 접근 가능하다.


function outter(){
    var title = 'coding everybody';  
    return function(){        
        alert(title);
    }
}
let inner = outter();
inner();
  • return을 하면 내부함수는 생을 마감한다.
  • inner변수에 outter()를 하는 순간 함수는 실행됨과 동시에 생을 마감
  • 내부 함수에서 이미 사라진 외부 함수에 접근하고 성공적으로 이뤄진다.
  • 내부 함수를 포함하는 외부 함수에 접근 할 수 있을 뿐 아니라 외부 함수가 종료되도 내부 함수로 인해 접근할 수 있다.
  • 그래서 어디에 쓰는데? 아래의 코드를 보자.
function factory_movie(title){
    return {
        get_title : function (){
            return title;
        },
        set_title : function(_title){
            title = _title
        }
    }
}
ghost = factory_movie('Ghost in the shell');
matrix = factory_movie('Matrix');
 
alert(ghost.get_title()); // Ghost in the shell
alert(matrix.get_title()); // Matrix
 
ghost.set_title('공각기동대');
 
alert(ghost.get_title()); // 공각기동대
alert(matrix.get_title()); // Matrix
  • method(내부함수로 이해한다.) 2개가 있는 객체를 return 하고 있다.

  • 참조!
    title은 내부 함수의 지역 변수로 사용한다.

  • private 변수가 가능하다.

    • 외부 함수가 종료됨으로써 내부함수에서만 외부 함수의 지역 변수에 접근이 가능하다.
  • 필요한 이유?

    • 여러 사람의 손을 거치며, 데이터가 훼손되는 경우를 방지함.
    • 메소드를 통해서만 접근이 가능하기 때문에 프라이빗하다.

  • closure 예제를 통해 빈번히 일어나는 실수를 알아보자.

var arr = []
for(var i = 0; i < 5; i++){
    arr[i] = function(){
        return i;
    }
}
for(var index in arr) {
    console.log(arr[index]());
}
  • 예상 아웃풋은 0~4 가 출력되는 것이지만, 실제로는 5가 다섯번 출력된다.
  • 이유?
    i의 값은 정의한 함수의 외부의 값이 아니기 때문이다.
  • 정의된 함수를 내부 함수로 하는 외부 함수를 만들고 내부 함수에서 외부 함수의 지역 변수를 참조하게 만든다.

var arr = []
for(var i = 0; i < 5; i++){
    arr[i] = function(id) {
        return function(){
            return id;
        }
    }(i);
}
for(var index in arr) {
    console.log(arr[index]());
}
  • 이렇게 바꾼다.

2. 순수함수 pure function에 대해 학습하고 정리한다.

- 같은 입력을 받으면, 동일한 출력을 반환한다.

- 사이드 이펙트를 갖지 않는다.


위 두 특징을 예시코드를 보며 이해한다.

  • Math.random()함수는 호출할 때 마다 다른 출력 값을 만들어낸다. 즉 순수하지 않다.

  • const highpass = (cutoff, value) => value >= cutoff;
    이 함수는 외부의 값 변화에 상관없이 항상 동일하게 출력한다. 두 인자를 받아 boolean 형식의 값을 반환한다. 순수 함수이다.


3. 고차 함수 higher-order function에 대해 학습하고 정리한다.

- map,filter,reduce,forEach 등이 대표적인 예이다.

  • 위의 메소드 들은 for문 등을 사용하지 않고 더욱 간결하게 코딩할 수 있는 획기적인 메소드 이다.
    여기서 중요한 관점은 자스에선 함수가 값으로 받을 수 있다.
    이를 통해 콜백 함수의 개념이 있어서 위의 메소드들을 동작 시킬 수 있는 것이다.

4. 프로그래밍 패러다임이 무엇인지 알아보고, 왜 필요한지 토론한다.

- '프로그래밍을 구성하는 요소들을 어떤 관점으로 보고 이해하는가' 정도로 생각한다.

  • 명령형 프로그래밍
    • 절차지향 프로그래밍
    • 객체지향 프로그래밍
  • 선언형 프로그래밍
    • 함수형 프로그래밍
    • 반응형 프로그래밍

이 중 객체지향 프로그래밍(OOP)와 함수형 프로그래밍(FP)를 자세히 알아보자.

5. 객체지향 패러다임과 함수형 패러다임 공통점과 차이점을 토론한다.

OOP

Object Oriented Programming의 약자로써 class와 object에 기반한 프로그래밍 패러다임(디자인 패턴) 이다. 관련된 데이터끼리 묶어서 class를 형성하고 그 안에서 object instance를 만듬으로써 프로그램을 디자인한다.

장점
  • 상속과 다형성을 통해 재사용률을 높이고 간결하게 함으로써 유지보수가 용이하다.
  • 캡슐화를 통해 데이터를 안전하게 보존할 수 있다.

FP

side effect가 없는 pure function을 구현함으로써 프로그램을 디자인한다. 여러개의 작은 function을 엮으며 하나의 큰 function을 구현하고 불변성을 지키게 됨.

장점
  • 디버깅이 쉽다.
  • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉽다.
  • 함수 단위의 코드 재사용이 증가한다.
  • 높은 수준의 추상화를 제공한다.

OOP와 FP의 공통점과 차이점

공통점
  • 간결한 코드를 만들기 위해 존재하는 패러다임이다.
차이점
  • OOP는 객체 안에 상태를 저장하고, 이 상태를 이용해 메소드를 추가한다.
    상태변화를 조정하기 위해 다양한 기능을 사용한다.
  • FP는 상태 제어보단, 없애는 것이 포인트이다.
    함수라는 것은 입력값에 따른 출력값이 나오는 것이므로 상태를 저장하지 않는다.
    이로 인해 간결한 코딩이 가능하다.
profile
if(기록📝) 성장🌱

0개의 댓글