
객체의 속성 이름으로 사용할 수 있다.
심볼을 사용하면 다른 속성들과 충돌하지 않는 유일한 식별자를 생성할 수 있다. 속성 이름 충돌을 방지하고 객체의 속성을 더 안전하게 관리할 수 있다.
const id = Symbol('id');
const person = {
name: 'John',
[id]: 123
};
console.log(person[id]); // 123
심볼은 명시적으로 접근해야 하는 숨김 속성(hidden property)을 생성할 때 유용하다. 이를 통해 외부에서 접근할 수 없는 속성을 만들 수 있다.
숨김 속성이란 객체 내부에서만 접근 가능한 속성을 의미한다. 일반적으로 외부에서 직접적으로 접근하거나 수정할 수 없으며, 객체의 내부 동작에 사용되거나 보호되어야 하는 데이터를 나타낸다.
심볼로 생성된 속성은 객체에 대괄호 표기법(bracket notation)을 사용하여 접근하며, 점 표기법(dot notation)을 사용하면 접근할 수 없다.
심볼은 숨김 속성을 만드는 데 사용될 수 있습니다. 객체의 외부에서 접근할 수 없는 비공개 속성을 만들기 위해 심볼을 사용할 수 있다. 이는 정보 은닉 및 캡슐화를 위해 유용하다.
const password = Symbol();
class User {
constructor(username, password) {
this.username = username;
this[password] = password;
}
authenticate(inputPassword) {
return inputPassword === this[password];
}
}
const user = new User('John', 'password123');
console.log(user.authenticate('password123')); // true
console.log(user[password]); // 접근 불가능
this.username과 this[password]this.username은 객체의 속성 이름이 "username"인 일반적인 속성을 의미한다.person.username과 같이 사용할 수 있다.this[password]는 심볼로 생성된 속성을 나타낸다. password는 심볼 값이고, 이를 객체에 대괄호 표기법(bracket notation)을 사용하여 접근한다.User 클래스의 생성자에서 username과 password 매개변수를 받아와서 this.username과 this[password]로 속성을 설정하고 있다. 이렇게 함으로써 username은 일반적인 속성으로서 외부에서 접근할 수 있지만, password는 심볼로서 내부에서만 접근 가능한 숨김 속성으로 설정되는 것이다.Symbol.iterator 심볼은 객체에 이터레이터(iterator)를 구현하기 위해 사용된다. const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
JavaScript에는 여러 내장 심볼이 있다. 내장 심볼은 특정 동작이나 기능을 나타내는 데 사용된다.
예를 들어, Symbol.iterator는 객체의 이터레이터(iterator)를 나타내며 for...of 루프 등에서 사용될 수 있다.
다른 원시 데이터 타입(문자열, 숫자, 불리언, null, undefined)과 마찬가지로 값으로 사용된다.
심볼은 생성자 함수로 사용하여 생성될 수 있다.
const symbol = Symbol();
const symbol = Symbol('설명');
// 유일한 식별자로서의 심볼 사용 예시
const RED = Symbol('red');
const BLUE = Symbol('blue');
const GREEN = Symbol('green');
function getColorName(color) {
switch (color) {
case RED:
return '빨강';
case BLUE:
return '파랑';
case GREEN:
return '초록';
default:
return '알 수 없음';
}
}
const selectedColor = BLUE;
console.log(getColorName(selectedColor)); // 출력: 파랑
위의 예시에서는 RED, BLUE, GREEN과 같은 심볼을 사용하여 색상을 나타내고, getColorName 함수에서 해당 심볼 값을 기반으로 색상 이름을 반환한다. 심볼을 사용하면 문자열을 사용하는 대신 고유하고 의미 있는 상수 값을 가지는 것이 가능하다. 이를 통해 코드의 가독성을 높이고 실수로 인한 문제를 방지할 수 있다.
// 숨김 속성으로서의 심볼 사용 예시
const password = Symbol();
class User {
constructor(username, passwordValue) {
this.username = username;
this[password] = passwordValue;
}
authenticate(inputPassword) {
return inputPassword === this[password];
}
}
const user = new User('John', 'password123');
console.log(user.username); // 출력: John
console.log(user[password]); // 출력: password123 (접근 가능)
console.log(user.password); // 출력: undefined (접근 불가능)
console.log(user.authenticate('password123')); // 출력: true
위의 예시에서는 password라는 심볼을 사용하여 User 클래스의 비밀번호를 숨김 속성으로 설정하고, authenticate 메서드를 통해 비밀번호를 확인할 수 있다. 심볼을 사용하여 속성을 숨김으로 설정하면 외부에서 직접 접근할 수 없으므로 정보의 보안성을 향상시킬 수 있다.