자바스크립트에서 **심볼(Symbol)**은 고유하고 변경 불가능한 원시 데이터 타입입니다. 심볼은 주로 객체의 속성 키를 만들 때 사용되며, 같은 이름을 가진 심볼이 여러 개 존재하더라도 서로 다른 것으로 취급됩니다. 이를 통해 이름 충돌을 방지하고 객체의 속성을 은닉하는 데 유용합니다.
심볼 생성
심볼은 Symbol() 함수를 사용하여 생성합니다
// 심볼 생성
const id = Symbol('id');
const name = Symbol('name');
// 객체에 심볼을 속성 키로 사용
const user = {
[id]: 1,
[name]: "Alice"
};
// 속성 접근
console.log(user[id]); // 1
console.log(user[name]); // Alice
// 심볼 키로 속성 확인
console.log(Object.keys(user)); // [] (심볼은 Object.keys에 포함되지 않음)
console.log(Object.getOwnPropertySymbols(user)); // [Symbol(id), Symbol(name)]
// 심볼로 속성 삭제
delete user[id];
console.log(user); // { [Symbol(name)]: 'Alice' }
설명
- 심볼 생성: Symbol('description')을 통해 심볼을 생성합니다. description은 심볼에 대한 설명을 추가할 수 있지만, 이는 디버깅 목적이며 심볼의 유일성을 보장하지 않습니다.
- 객체 속성으로 사용: 생성된 심볼을 객체의 속성 키로 사용합니다. 이때 대괄호 표기법을 사용합니다.
- 속성 접근: 심볼을 키로 사용하여 속성에 접근할 수 있습니다.
- 속성 확인: Object.keys()를 사용하면 일반 속성만 반환되므로 심볼 속성은 포함되지 않습니다. 대신 Object.getOwnPropertySymbols()를 사용하여 심볼 속성을 확인할 수 있습니다.
- 속성 삭제: 심볼 키를 사용하여 속성을 삭제할 수 있습니다.
이처럼 심볼은 고유성을 보장하므로, 객체의 속성 이름이 겹치는 것을 방지하고, 객체의 구조를 보다 안전하게 관리할 수 있게 도와줍니다.
Object.keys()는 자바스크립트에서 객체의 속성 이름(키)을 배열로 반환하는 메서드입니다. 이 메서드는 객체가 가진 모든 열거 가능한 속성 키를 배열 형태로 반환하므로, 객체의 속성에 접근하거나 반복(iterate)할 때 유용하게 사용됩니다.
Object.keys(obj)
반환 값
- 객체의 열거 가능한 속성 키를 문자열 배열로 반환합니다. 만약 객체에 속성이 없다면 빈 배열을 반환합니다.
const person = {
name: "Alice",
age: 30,
isStudent: false
};
// Object.keys 사용
const keys = Object.keys(person);
console.log(keys); // ["name", "age", "isStudent"]
추가 설명
- 열거 가능성: Object.keys()는 열거 가능한 속성만 반환합니다. 즉, for...in 루프 또는 Object.keys()에 의해 접근할 수 있는 속성을 의미합니다. 프로토타입 체인에 있는 속성은 포함되지 않습니다.
- 정렬 순서: 반환된 배열은 속성이 추가된 순서대로 배열됩니다. 숫자로 시작하는 키는 먼저 정렬되며, 그 다음 문자열이 오는 순서입니다.
예제: 객체 속성 반복
Object.keys()와 함께 forEach()를 사용하여 객체의 모든 속성을 반복할 수 있습니다.
const car = {
brand: "Toyota",
model: "Camry",
year: 2020
};
Object.keys(car).forEach(key => {
console.log(`${key}: ${car[key]}`);
});
// 출력:
// brand: Toyota
// model: Camry
// year: 2020
이와 같이 Object.keys()는 객체의 속성을 쉽게 다루고 확인할 수 있게 해주는 유용한 메서드입니다.
Object.getOwnPropertySymbols()는 자바스크립트에서 객체의 자신의 심볼 속성 키를 배열로 반환하는 메서드입니다.
이 메서드는 객체에 정의된 심볼 속성만을 가져오며, 프로토타입 체인에 있는 심볼은 포함하지 않습니다.
사용법
Object.getOwnPropertySymbols(obj)
- obj: 심볼 속성을 가져오고자 하는 객체.
반환 값
- 객체의 심볼 속성 키를 포함하는 배열을 반환합니다. 만약 객체에 심볼 속성이 없다면 빈 배열을 반환합니다.
const myObj = {
[Symbol('id')]: 1,
[Symbol('name')]: 'Alice',
age: 30
};
// 심볼 속성 가져오기
const symbols = Object.getOwnPropertySymbols(myObj);
console.log(symbols); // [Symbol(id), Symbol(name)]
추가 설명
- 열거 가능성: Object.getOwnPropertySymbols()는 심볼 속성만 반환하며, 일반 문자열 속성은 포함하지 않습니다.
- 심볼의 고유성: 심볼은 고유한 식별자를 제공하므로, 같은 이름의 심볼이 여러 개 있어도 서로 다른 것으로 간주됩니다.
예제: 심볼과 일반 속성 혼합
const person = {
[Symbol('id')]: 1,
name: 'Bob',
age: 25
};
// 일반 속성 확인
console.log(Object.keys(person)); // ["name", "age"]
// 심볼 속성 확인
console.log(Object.getOwnPropertySymbols(person)); // [Symbol(id)]
활용 예시
심볼을 사용하여 객체의 속성을 은닉할 때 Object.getOwnPropertySymbols()를 사용하면 객체 내부에서만 사용할 수 있는 속성을 쉽게 다룰 수 있습니다.
const secretKey = Symbol('secret');
const secureData = {
[secretKey]: 'mySecretData',
publicData: 'this is public'
};
console.log(secureData.publicData); // "this is public"
console.log(secureData[secretKey]); // "mySecretData"
// 심볼 속성 확인
const keys = Object.getOwnPropertySymbols(secureData);
console.log(keys); // [Symbol(secret)]
이처럼 Object.getOwnPropertySymbols()는 객체의 심볼 속성을 다루는 데 매우 유용한 메서드입니다.