타입스크립트 기초 - 10

Stulta Amiko·2022년 7월 4일
0

타입스크립트 기초

목록 보기
10/24
post-thumbnail

순수함수

저번에 하다만 순수함수 이야기를 더 해야한다.

함수 내에서 매개변수를 바꾸거나 외부변수값을 함수내에서 사용한다면 불순함수이다.

const impure = (array: number[])=>{
    array.push(1)
    array.slice(0,1)
}

위와같은 형태는 매개변수로 들어온 배열의 값을 바꾸게 되므로 순수함수가 아니게 된다.

만약 순수함수로 구현을 하고싶고 실수를 방지하려면 readonly 키워드를 사용하면된다.
readonly 키워드를 사용해서 파라미터의 타입 앞에 붙이게 되면 만약 매개변수의 값을 바꾸려고 할때 오류를 띄우게 된다.

const impure = (array: readonly number[])=>{
    array.push(1)
    array.slice(0,1)
}

위와같은 현상이 발생하게 된다.

const나 readonly를 사용하게 되면 값이 불변하게 되므로 불변 변수라고 부르게된다.
만약 위 키워드가 붙어있지않고 값이 변경되는 변수를 가변 변수라고 부른다.

깊은복사와 얕은복사

타입스크립트에서 number타입과 boolean타입은 깊은복사가된다.
하지만 객체와 배열은 얕은복사로 된다.
이게 무슨말이냐면 그냥 단순하게 = 연산자를 이용해서 했을때 number와 boolean의 경우 원본 변수의 주소값을 참조하는것이 아닌 원래 값을 가져오기 때문에 주소값에 구애받지않고 깊은복사를 이루게 해주지만
객체와 배열의경우는 원본 배열 혹은 객체의 주소값을 참조하기 때문에 원본 배열이나 객체가 수정되는 경우 복사된 객체와 배열도 수정되게 된다는점이다.

const arr: number[] = [1,2,3,4,5]
const copy_arr : number[] = arr
copy_arr[0] = 0
console.log(arr,copy_arr)

위와같은 배열이 있다고 하면
실행결과는 둘이 동일하게 인덱스의 0번째 값이 0으로 바뀐 동일한 배열이 두번 출력 될것이다.

const arr: number[] = [1,2,3,4,5]
const copy_arr : number[] = [...arr]
copy_arr[0] = 0
console.log(arr,copy_arr)

하지만 전개연산자를 이용해서 복사를 하게되면 깊은 복사를 구현할 수 있다

튜플

타입스크립트에는 튜플이 없다.
하지만 튜플처럼 이용할수 있는걸 만들 수는 있는데 타입을 any로 설정하고 만들면 비슷하게 나오기는 한다.

이터레이터

const createRangeIterable = (from: number,to: number) =>{
    let currentValue = from
    return{
        next(){
            const value = currentValue < to ? currentValue++ : undefined
            const done = value == undefined
            return {value,done}
        }
    }
}

const iterator = createRangeIterable(1,4)
while(true){
    const {value, done} = iterator.next()
    if(done) break;
    console.log(value)
}

iterable 하다는 말을 여러번 들어봤다.
자바에도 이터레이터라는 개념이 있었지만 자세히 알지 못하고 넘어간듯 하다.
아직까지 실제로 왜 사용해야하는지 모르겠지만 다음과 같은 방식으로 구현한다.
1부터 3까지 출력하는 이터레이터를 만들려면 먼저 iterator를 구현해야하는데
createRangeIterable 에서 iterator를 구현했다. value와 done 두개의 값을 사용하고
인덱스 내부에서 벗어나기 전까지는 계속해서 돌리는 모습을 보이다가
벗어나는 순간 undefined를 반환하면서 done의 값이 true가 되면서
반복문을 탈출하게된다.
출력값은 의도하는대로 나오게된다.

0개의 댓글