개발

JavaScript - Java의 enum을 대체하는 자바스크립트의 Object.freeze() 완벽 가이드

syaku 2024. 11. 9. 15:57
728x90
반응형

[JavaScript] Java의 enum을 대체하는 Object.freeze() 완벽 가이드

자바스크립트에서 자바의 enum과 같은 상수를 관리하는 방법을 알아보겠습니다.

Object.freeze()를 사용한 기본 구현

자바스크립트에서는 enum 타입이 없지만, Object.freeze()를 사용하여 비슷한 기능을 구현할 수 있습니다.

const Season = {
    SPRING: "spring",
    SUMMER: "summer", 
    AUTUMN: "autumn",
    WINTER: "winter"
};

Object.freeze(Season);

Object.freeze()의 특징

1. 불변성 보장

  • 객체의 속성 추가 불가
  • 속성 삭제 불가
  • 속성 값 변경 불가

2. 사용 이점

  • 코드의 가독성 향상
  • 타입 안정성 제공
  • IDE 자동완성 지원
  • 오타나 실수 방지

Object.freeze()의 한계: 얕은 동결

Object.freeze()의 주요 한계점은 얕은 동결(shallow freeze)만 제공한다는 것입니다.

const nested = {
    outer: {
        inner: "value"
    }
};

Object.freeze(nested);
nested.outer.inner = "changed"; // 변경 가능!

deepFreeze 구현으로 완벽한 동결 만들기

중첩된 객체까지 완벽하게 동결하기 위해서는 deepFreeze를 구현해야 합니다[4].

function deepFreeze(object) {
    Object.keys(object).forEach(prop => {
        if (typeof object[prop] === 'object' && !Object.isFrozen(object[prop])) {
            deepFreeze(object[prop]);
        }
    });
    return Object.freeze(object);
}

실제 사용 예시

const PaymentType = {
    CREDIT_CARD: {
        code: "CC",
        description: "신용카드"
    },
    BANK_TRANSFER: {
        code: "BT",
        description: "계좌이체"
    }
};

deepFreeze(PaymentType);

Object.seal()과의 차이점

기능 Object.freeze() Object.seal()
속성 추가 불가능 불가능
속성 삭제 불가능 불가능
속성값 수정 불가능 가능
속성 열거 가능 가능

사용 시 주의사항

  1. strict 모드에서는 수정 시도 시 TypeError가 발생합니다
  2. 중첩 객체가 있는 경우 반드시 deepFreeze 사용을 고려해야 합니다
  3. 성능에 민감한 경우 사용을 신중히 검토해야 합니다

결론

Object.freeze()는 자바의 enum을 대체할 수 있는 효과적인 방법이지만, 깊은 동결이 필요한 경우에는 deepFreeze를 구현하여 사용하는 것이 안전합니다. 상수 관리와 코드의 안정성을 높이는데 매우 유용한 도구입니다.

728x90
반응형