boostcamp-challenge

[7/24] OOP에 절여진 네게 함수형 프로그래밍을

blopz 2024. 7. 24. 14:43

(사실 OOP를 제대로 알고있는지도 모르겠다는게 사실이지만)

 

함수형 프로그래밍이 뭐야 대체..

무지한 첫 생각 : 하던대로 함수 짜는게 함수형 프로그래밍 아님?

학습한 결과 : 불변성과 가변성에 대해 생각한게 함수형 프로그래밍이다.

순수함수 그리고 불변성

순수함수가 뭘까?

함수형 프로그래밍함수형 프로그래밍 : 부수 효과를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임

부수 효과 = 외부의 상태를 변경하는 것 또는 함수로 들어온 인자의 상태를 직접 변경하는 것

순수 함수 = 부수효과가 없는 함수 즉, 어떤 함수에 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수 + 외부의 상태를 변경하지 않는 함수

출처: https://jeong-pro.tistory.com/23 [기본기를 쌓는 정아마추어 코딩블로그:티스토리]

 

함수에 Input값과 Return값이 있는데, Input값을 포함한 모든 함수 외부환경 데이터를 건들지 않고 내부에서만 처리하면, 함수가 환경의 영향의 영향을 전혀 받지 않기 때문에 같은 입력값이면 같은 출력값이 보장된다!

 

이러한 함수를 순수함수라고 부르는 듯 하다.

 

순수함수로 코드를 짜면 외부환경의 불변성이 지켜지게 된다.

 

그리고 순수함수로 조합한 고차함수로 코드를 짜게 된다. 레고조립하는것 같았다.

왜 불변해야하는가?

  • 외부데이터에서 영향을 받지 않기 때문에 해당 함수만 보고도 어떻게 작동할지 알수 있다. 동작이 예측 가능하다.
  • 동시에 처리할때 안전하다. 동시에 처리하면서 외부환경이 변경되도 데이터가 변경되지 않는다.

OOP VS FP

https://velog.io/@ryh0629/OOP-vs-FP
https://velog.io/@teo/functional-programming-study#q-%EA%B7%B8%EB%9F%AC%EB%A9%B4-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EA%B3%BC-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EB%AD%94%EA%B0%80%EC%9A%94

 

 

OOP vs FP

OOP(Object Oriented Programming)은객체지향 프로그래밍을 뜻한다.OOP는 객체지향 프로그래밍이란 프로그램을 단순히 데이터와 처리방법으로 나눈 것이 아니라, 객체(object)라는 기본 단위로 나누고 이들

velog.io

 

 

함수형 프로그래밍을 배워보자!

함수형 프로그래밍에 대해서 이론을 공부해도 감이 잘 오지 않는 분들에게 어떻게 함수형 프로그래밍에 접근을 해나가면 좋을지 도움이 되고자 1부 파트였던 **함수형 사고에 대한 이론과 실습

velog.io

 

  • OOP : 비슷한것끼리 객체로 묶어서 관리하자!
  • FP : 불변한것과 가변하는것을 나누어서 관리하자!

함수 프로그래밍으로 LinkedList와 Node 구현하기

const createNode = (value, next=null) => (selector) => {
    if (selector === 'value') return value;
    if (selector === 'next') return next;
};

createNode함수를 순수함수로 의도하고 구현했다

const createNode = (value, next=null) => {
    return (selector) => {
        if (selector === 'value') return value;
        if (selector === 'next') return next;
    };
};

와 같은 문법이다.


const LinkedList = (() => {
    const createEmpty = () => null;
    const add = (list, value) => createNode(value, list);
})();

LinkedList함수를 고차함수로 의도하고 구현했다.

불변성이 지켜지는지 테스트

let lista = LinkedList.createEmpty();
lista = LinkedList.add(lista, 1);
lista = LinkedList.add(lista, 2);
lista = LinkedList.add(lista, 3);

listb = LinkedList.add(lista, 4);

 

image

lista의 불변성이 잘 지켜진다

그럼 중간값을 update하거나 delete하면 불변성이 깨지는거 아님?

그럼 update하거나 delete한 linkedlist를 새로만들어 return해주면 불변성이 지켜진다.

const deleteNode = (list, value) => {
    // 끝이면 null 반환
    if (list === null) return createEmpty();
    const currentValue = getValue(list);
    // 재귀로 돌면서
    const next = deleteNode(getNext(list), value);

    // 삭제할 값이랑 일치하면
    if (currentValue === value) {
        // 건너뜀
        return next;
    } else {
        // 일치 안하면 새로운 노드로 복사해 불변성을 지킴
        return createNode(currentValue, next)
    }
}

 

image

linkedlist를 재귀로 돌면서 삭제할 값과 일치하면 건너뛰어 잇도록 복사해서 return한다.