[ TS ] 배열과 튜플(4)

유기훈·2022년 6월 28일
0
post-thumbnail

순수 함수란?

  • 함수 몸통에 입출력 관련 코드가 없어야 한다
  • 함수 몸통에서 매개변숫값을 변경시키지 않는다(즉, 매개변수는 const나 readonly 형태로만 사용한다)
  • 함수는 몸통에서 만들어진 결과를 즉시 반환한다
  • 함수 내부에 전역 변수나 정적 변수를 사용하지 않는다
  • 함수가 예외를 발생시키지 않는다
  • 함수가 콜백 함수로 구현되었거나 함수 몸통에 콜백 함수를 사용하는 코드가 없다
  • 함수 몸통에 Promise와 같은 비동기 방식으로 동작하는 코드가 없다

타입 수정자 readonly

타입스크립트에서 인터페이스, 클래스, 함수의 매개변수 등은 let이나 const키워드 없이 선언하기 때문에 const와 같은 효과를 주려면 readonly라는 타입 수정자가 필요합니다.

function forcePure(array: readonly number[]) {
  array.push(1)
}

깊은 복사와 얕은 복사

프로그래밍 언어에서 어떤 변숫값을 다른 변숫값으로 설정하는 것을 복사라고 표현합니다. 복사헤은 '깊은 복사'와 '얕은 복사' 두 종류가 있습니다. 순수 함수를 구현할 때는 매개변수가 불변성을 유지해야 하므로, 깊은 복사를 실행해 매개변숫값이 변경되지 않게 해야 합니다.

아래 코드는 깊은 복사의 예시 입니다. 타입스크립트에서는 number와 boolean타입은 깊은 복사 형태로 동작합니다.

let original = 1
let copied = original
copied += 2
console.log(original, copied) // 1 3

배열을 위와 같이 복사하면 깊은 복사가 아닌 얕은 복사가 되어 매개변수가 변경됩니다. 전개 연산자를 사용해 배열을 복사한다면 깊은 복사를 할 수 있습니다.

const oArray = [1, 2, 3, 4]
const deepCopiedArray = [...oArray]
deepCopiedArray[0] = 0
console.log(oArray, deepCopiedArray) // [ 1, 2, 3, 4 ] [ 0, 2, 3, 4 ]

배열의 filter 메서드와 순수한 삭제

배열에서 특정 아이템을 삭제할 때는 splice 메서드를 사용합니다. 그런데 splice는 원본 배열의 내용을 변경하므로 순수 함수에서는 사용할 수 없습니다. 특정 아이템을 삭제하는 데 filter 메서드를 사용할 수 있습니다. 예를 들어, filter 메서드를 활용해 원본을 훼손하지 않고 조건에 맞는 아이템을 삭제하는 함수를 다음처럼 작성할 수 있습니다.

export const pureDelete = <T>(array: readonly T[], cb: (val:T, index?: number)
=> boolean): T[] => array.filter((val, index) => cb(val, index) == false)

가변 인수 함수와 순수 함수

함수를 호출할 때 전달하는 인수의 개수를 제한하지 않는 것을 가변 인수라고 합니다. 가변 인수 함수를 구현할 때 기본 형태는 다음과 같습니다.

export const mergeArray = <T>(...arrays: readonly T[][]): T[] => {}
profile
개발할 수 있어 감사하다

0개의 댓글