자바스크립트 기본 문법 – 데이터 타입 – 기본 데이터 타입 – 5 – Symbol

자바스크립트 기본 문법 – 데이터 타입 – 기본 데이터 타입 – 5 – Symbol

Symbol이란?

Symbol은 자바스크립트의 기본 데이터 타입 중 하나입니다. Symbol은 유일한 값을 가지며, 주로 객체의 프로퍼티 키로 사용됩니다. 다른 데이터 타입과는 달리 Symbol은 항상 고유하며 변경할 수 없습니다. Symbol은 ES6(ECMAScript 2015)에서 도입되었으며, 기존의 데이터 타입과는 다른 독특한 특성을 가지고 있습니다.

Symbol의 생성

Symbol은 다음과 같이 생성할 수 있습니다.

const mySymbol = Symbol();

위의 코드는 고유한 심볼 값을 생성하여 mySymbol 변수에 할당하는 예시입니다. Symbol 생성 시에는 항상 Symbol() 함수를 호출해야 합니다. 이때 호출 시 인자로 문자열을 전달할 수도 있습니다. 이렇게 전달된 문자열은 Symbol의 설명(description)으로 사용됩니다.

const mySymbol = Symbol('My Symbol');

위의 코드에서는 ‘My Symbol’이라는 문자열을 가진 Symbol을 생성합니다.

Symbol의 유일성

Symbol은 항상 유일한 값을 가지므로, 서로 다른 Symbol 값들은 모두 서로 다른 것으로 간주됩니다. 이를 통해 객체의 프로퍼티 키로 Symbol을 사용할 때 충돌이 발생하지 않도록 보장할 수 있습니다. 예를 들어, 다음과 같이 두 개의 Symbol을 생성하여 비교해 보겠습니다.

const symbol1 = Symbol('symbol');
const symbol2 = Symbol('symbol');

console.log(symbol1 === symbol2);  // false

위의 코드에서 symbol1symbol2는 모두 ‘symbol’이라는 설명(description)을 가진 Symbol입니다. 하지만 두 Symbol은 서로 다르기 때문에 === 연산자를 사용하여 비교하면 false를 반환합니다.

Symbol의 활용 예시

Symbol은 주로 객체의 프로퍼티 키로 사용됩니다. 이를 통해 객체의 프로퍼티를 유일하게 식별하고, 다른 코드에서 프로퍼티를 재정의하는 일이 없도록 보호할 수 있습니다.

const mySymbol = Symbol('myKey');
const obj = {
  [mySymbol]: 'Hello, Symbol!'
};

console.log(obj[mySymbol]);  // 'Hello, Symbol!'

위의 코드에서는 Symbol을 객체의 프로퍼티 키로 사용하여 obj 객체에 mySymbol이라는 프로퍼티를 추가합니다. 이후 해당 프로퍼티에 접근할 때는 [ ]를 사용하여 Symbol을 키로 전달합니다. 이를 통해 다른 코드에서 mySymbol이라는 프로퍼티를 덮어쓰는 일이 발생하지 않습니다.

주의해야 할 점

  1. Symbol은 항상 고유한 값을 가지므로, 동일한 Symbol 값을 비교하기 위해선 === 연산자를 사용해야 합니다. == 연산자로 비교하면 항상 false를 반환하므로 주의해야 합니다.
  2. Symbol은 문자열과 다르게 외부에 노출되지 않습니다. 따라서 Symbol 값 자체를 확인하거나 출력하는 것은 어렵습니다.
  3. Symbol은 프로퍼티 키로 사용되면 순회 대상에서 제외됩니다. for...in 문이나 Object.keys() 등을 사용하여 객체의 프로퍼티를 순회할 때 Symbol 프로퍼티는 무시됩니다.
  4. Symbol은 Object.getOwnPropertySymbols() 메서드를 통해 확인할 수 있습니다. 이를 이용하면 객체의 Symbol 프로퍼티들을 배열로 얻을 수 있습니다.

Symbol은 자바스크립트에서 고유한 값을 생성하기 위해 사용되는 강력한 도구입니다. 객체의 프로퍼티 키로 Symbol을 활용하면 충돌을 피하고, 보다 안전하고 견고한 코드를 작성할 수 있습니다. 하지만 Symbol은 단순한 데이터 타입이 아니므로 사용 시에 주의해야 합니다. Symbol을 적절히 활용하면 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

답글 남기기