[심화] 불변성 / 참조 투명성에 대해 알아보자

728x90

불변성

불변성

한 번 생성 후 변하지 않는 것

예상 가능하고, 신뢰할 수 있는 코드를 지향하기 위하여 사용해야 함

 

Immutable type

원시 타입(Boolean,String,Number,Null,Undefined,Symbol)

메모리 영역 안에서 불변하며, 새로운 값이 재할당

let name = 'foo';
name = 'bar';

name 은 새로운 값이 재할당 됨

 

Mutable type

객체 타입(Object,Array,Map등)

⸰ 변할 수 있는 값이며, 직접적으로 변경 가능

let x = ['foo'];

x.push('bar');
console.log(x); // ['foo', 'bar']

x.push('bar') 라는 코드를 보지 못한다면, x = ['foo'] 라고 생각하여 잘못 코드를 작성할 수도 있음

 

map( )이나, 스프레드 연산자 [...array, 'bar'] 같이, 원본 배열을 변경하지 않는 방식 > 불변성을 지키는 방식

 

참조 투명성

참조 투명성

⸰ 동일한 입력 값에 항상 동일한 출력 값을 보장하는 특성

⸰ 함수가 외부 상태에 의존하지 않고, 전달받은 인자에만 의존

⸰ 함수가 전역 변수를 참조 X, 변경 X > 신뢰성 증가

 

참조 투명성을 지키는 방법

⸰ 전역 변수를 관리하는 전용 객체를 따로 생성하여 사용

⸰ 전역 변수를 참조하는 함수는 전역 변수를 파라미터로 받아야 함

⸰ 랜덤 값 생성하는 코드도 외부 입력으로 처리해야 함

function generateRandom(randomFunc) {
  return randomFunc();
}

const randomValue = generateRandom(Math.random);
console.log(randomValue);


// Testing example
function mockRandom() {
  return 0.5;
}

const mockValue = generateRandom(mockRandom);
console.log(mockValue); // 0.5

 

 

 

 

 

 

728x90