티스토리 뷰
1.함수형프로그래밍에서의 값의부재란
const array1 = [1, 2, 3, undefined];
const array2 = [1, 2, 3, null];
console.log(sumArray(array1)); // 어떤 값이 나올까요?
console.log(sumArray(array2)); // 어떤 값이 나올까요?
우리는 흔하게 조건처리를 하거나 map함수를 사용하며 값이 undifined이거나 null일경우 값이 없다고 하여 이를 함수형프로그래밍에서는 값의 부재다. 라고 표현합니다.
함수형 프로그래밍에서의 모든 함수는 순수함수이루어져, 모든 입력값에 대해 출력값을 정해주어야 하기때문에(undefined포함) map함수를 처리하더라도 undefined일 경우나 null일경우 값의 부재를 명시적으로 돌려주어야 합니다.
결국엔 에러가 발생할수도, 유지보수가 어려울수도있고, 디버깅을 하는데 어디서부터 손을대야할지가 이유가 될수있을것같습니다.
2.어떻게?
그렇다면 값의부재를 어떻게 명시적으로 표현해야할까요?
태그드유니언을 모방한 ADT 대수자료구조에서의 합타입을 통해서 가능합니다. 태그를 생각하실때 이 카카오열매가 1등급이다. 3등급이다 할때를 나타내는 스티커라고 보시면 될것같습니다.
저희는 이제 값이 있을땐 Some, 없을땐 None으로 말입니다.
3._tag작성 함수
태그드 유니언을 통해 값의 부재여부를 명시적으로 태그를 달아주었지만
문제점은 매번 _tag를 작성해주어야하기 때문 에 귀찮습니다. 이를위해 함수를 사용한다면
some, none함수를 통해서 const n1처럼 _tag를 계속 작성하는 일은 없을겁니다.
해당 some,none 함수를 통해서 undifined를 식별하여 태그와 값을 리턴하는 함수를 만들면?
이런식으로 작성이 가능합니다.
값이 없다면 none, 값이 있다면 some함수를 반환하는 형식으로 태그가 각각 "Some", "None" 으로 명시적으로 작성이 가능합니다.
4.값이 없을땐 어떻게 처리할까
함수형 프로그래밍 원칙에 맞게 모든 함수는 순수함수이어야 하며 모든 입력값에 대해 출력값을 정해주어야 한다.
라고 했습니다. 그럼 여기서 함수형 프로그래밍은 왜 순수함수이어야 하고 순수함수는 무엇을 말하는걸까요? 그리고 값이 없을땐 명시적으로 처리된 태그를 어떻게 활용할까요? 먼저 순수함수에 대해 알아보고 태그를 활용한 함수는 그이후에 보겠습니다.
5.순수함수
순수함수란 쉽게말해서 동일한 입력값이 들어간다면 동일한 출력값이 나와야 하는 함수를 말합니다.
순수함수가 중요한 이유는 상태변화와도 관련이 있는데요, 함수내에서 리턴값을 처리하지않고
상태를 변화시킬경우 극단적으로 봤을때 디버깅이 어려운 예시를 볼까요
counter = 0
def increment_counter():
global counter
counter += 1
def double_counter():
global counter
counter *= 2
increment_counter()
double_counter()
print(counter) # 출력: ?
해당 코드는 counter라는 전역변수에 상태를 변화시키면서
두가지 함수를 모두 한번씩, 어느함수를 호출하는지에 따라서 값이 2가 되기도 1이 되기도합니다.
때문에 함수형프로그래밍에서는 하나의 함수에 값을 꼭 리턴하여야 하면서, 어떤 입력값이 들어오더라도 항상 결과가 같아야하는 원칙을 가지고 있는것이 함수형 프로그래밍입니다.
6.값의부재를 명시적을 표현해야하는이유
상태변화가 테스트와 디버깅에 어렵다는 아시겠다면, 값의부재는 왜 명시적으로 해야하는지 궁금증이 드실 수 있습니다.
배열내에 값이 없다면 위와같은 조건문을 통해 처리(not undefined)가 가능할텐데 말이죠,
자세히보시면 이글을 잘 읽어보셨을경우 어느정도 이해가 되실겁니다. discountPrice를 0으로 해두고, 조건문을 통해 discountPrice에 값을 넣고 있습니다.
이는 상태변경을 말합니다. 상태변경에 안좋은예는 위에 설명이 되어있으니 참고부탁드립니다.
이렇듯 값이 없다면 상태를 변화시키는 코드 이외에 값이없는 태그를 명시적으로 반환하고 디폴트값을 새로반환하는 함수가 필요합니다. 그렇지 않으면 상태변화를 해야하기때문이죠.
7.getOrElse함수
isSome과 isNone은 해당 타입이 some인지 none인지 판별하는 함수이고,
getOrElse함수를 통해서 해당 타입이 isNone이면 즉 태그가 None이면 디폴트값을 리턴하고
아니면 Some타입에서 태그를 제외한 값을 리턴하는 코딩이 되겠습니다.
8.활용
자 그럼 실코딩에서 어떻게 활용할까요?
이런식으로 사용이 가능합니다.
saleText에 나온 mapOrElse도 getOrElse와 비슷한 맥락인데요
글이너무 길어져서 mapOrElse 함수에 대해서는 다음시간에 설명드리도록하겠습니다.
글의 두서가 없지만 이글을 전부 읽어보셨다면, 상태변경할 경우의 안좋은 예시, 값의부재를 명시적으로 나타내어야 하는 이유, 순수함수가 무엇인지, 함수형프로그래밍에서 부부함수를 옵션으로 처리하는 과정에 대한 개념을 알아가셨을거라고 생각합니다.
'개발' 카테고리의 다른 글
[python] await/asyncio.gather 비동기와 병렬처리 (0) | 2024.03.14 |
---|---|
[DB] PlanetScale db Export 그리고 Import (0) | 2024.02.18 |
[python] FastApi / uvicron 세팅 (0) | 2024.02.11 |
[NPM] npm 트래킹api 라이브러리 만들기 (ESM,CJS지원) (0) | 2023.10.19 |
[React] Redux / Recoil 상태관리 차이점과 특징 (0) | 2023.09.29 |