심볼(Symbols)
- 심볼(Symbols)은 ECMAScript 6에서 새로 추가된 원시 데이터 타입이다.
- 심볼은 고유하고 변경 불가능한 값을 나타내며, 주로 객체 속성의 식별자로 사용된다.
- 심볼은 다른 값들과 구분되기 때문에 유일성이 보장된다.
심볼의 생성
심볼은
Symbol()
함수를 사용하여 생성할 수 있다.
간단한 형태로는Symbol()
을 호출하면 새로운 고유한 심볼이 생성된다.![]()
심볼의 고유성
심볼은 고유하므로 두 개의 심볼은 항상 서로 다르다.
동일한 심볼을 생성하려고 해도 항상 새로운 심볼이 반환된다.![]()
심볼의 설명
심볼은 선택적으로 설명을 가질 수 있다.
이는 주로 디버깅과 코드 가독성을 위해 사용된다.
심볼의 설명은 디버깅 도구나 개발자 도구에서 심볼을 표시할 때 유용하다.![]()
심볼과 객체 속성
심볼은 객체의 속성 식별자로 사용될 수 있다.
이를 통해 다른 속성들과 충돌하지 않고 고유한 키를 만들 수 있다.![]()
심볼과 반복 가능한 객체
심볼은 반복 가능한(iterable) 객체에서는 자동으로 무시된다.
따라서for...of
루프나Array.from()
등과 같은 메서드를 사용하여 객체의 요소를 순회할 때 심볼 속성은 제외된다.
이는 심볼이 주로 객체의 메타데이터를 나타내고, 심볼 속성은 반복 가능한 객체에서 숨겨져야 한다는 의도에 기인한다.![]()
심볼과 Well-known 심볼
JavaScript는 일부 내장된 심볼을 제공하는데, 이를 Well-known 심볼이라고 한다.
Well-known 심볼은 특정한 동작을 가지고 있으며, 객체에서 재정의할 수 있다.
예를 들어,Symbol.iterator
는 객체의 반복 동작을 정의하는 데 사용된다.![]()
심볼의 활용 예시
심볼은 다양한 상황에서 유용하게 활용될 수 있다.
유일한 객체 식별자
![]()
Private 멤버
아래의 코드는 심볼(Symbol)을 사용하여 클래스 내부에 비공개(private) 메서드를 구현한 예시이다.
심볼은 고유하고 변경할 수 없는 값으로, 클래스 내부에서만 접근할 수 있는 비공개 멤버를 생성하는 데 사용된다.
privateMethod 심볼은 MyClass 클래스의 비공개 메서드를 정의하기 위해 사용되었다.
publicMethod 메서드는 공개 메서드로, 외부에서 접근 가능한 멤버이다. 이 메서드 내부에서 privateMethod 메서드를 호출할 수 있다.
이렇게 심볼을 활용하여 비공개 멤버를 구현함으로써 정보 은닉화와 객체의 캡슐화를 달성할 수 있다.![]()
속성 충돌 방지
아래의 코드는 심볼을 사용하여 객체의 속성 충돌을 방지하는 예시이다. SIZE라는 심볼을 생성하여 Collection 클래스의 인스턴스에서만 접근 가능한 비공개 속성을 만들었다. Collection 클래스의 생성자에서 SIZE 심볼을 사용하여 인스턴스의 크기를 나타내는 속성을 초기화했다. add 메서드는 새로운 아이템을 Collection 인스턴스에 추가하고, SIZE 속성을 증가시켜 크기를 유지한다. size 게터(getter)는 SIZE 심볼을 사용하여 인스턴스의 크기를 반환한다. 이렇게 심볼을 사용하면 외부에서는 접근할 수 없는 비공개 속성을 생성함으로써 속성 충돌을 방지하고, 객체의 정보를 보호할 수 있다.
![]()
심볼과 프로퍼티 숨기기
password라는 심볼을 생성하고, user 객체에 심볼을 키로 사용하여 프로퍼티를 추가했다.
username은 일반적인 문자열 키로 접근할 수 있지만, password는 심볼 키로만 접근할 수 있다.
console.log(user.username)은 "john_doe"를 출력합니다. 이는 일반적인 프로퍼티에 접근한 예시이다.
console.log(user[password])는 "12345"를 출력합니다. 이는 심볼 키를 사용하여 프로퍼티에 접근한 예시이다.
심볼은 유일한 값을 가지기 때문에 외부에서 심볼을 알지 못하면 해당 프로퍼티에 접근할 수 없다.
이를 통해 중요한 정보를 보호하고, 프로퍼티를 숨길 수 있다.![]()
Well-known 심볼 활용 - Symbol.iterator
아래 코드는 Symbol.iterator를 활용하여 반복 가능한(iterable) 객체를 만드는 예시이다.
myIterable 객체는 values 배열과 Symbol.iterator를 가지고 있다.
Symbol.iterator 메서드는 이터레이터(iterator)를 반환하는데, 이터레이터는 next() 메서드를 가지고 있다.
next() 메서드는 반복문에서 호출될 때마다 순차적으로 values 배열의 요소를 반환하고, 반복이 끝나면 done 값을 true로 설정한다.
for...of 문을 사용하여 myIterable 객체를 순회하면, values 배열의 요소들이 차례대로 출력된다.
Symbol.iterator는 Well-known 심볼 중 하나로, JavaScript에서 이터레이션을 지원하는 자료 구조와 함께 사용된다.
이를 통해 사용자 정의 객체도 for...of 문 등과 함께 사용할 수 있다.![]()
Well-known 심볼 활용 - Symbol.toStringTag
아래 코드에서 MyClass 클래스는 Symbol.toStringTag를 가지고 있다.
Symbol.toStringTag는 객체의 문자열 표현을 제어하는데 사용된다.
MyClass 클래스의 get [Symbol.toStringTag]() 메서드는 "MyClass"를 반환하도록 정의되어 있다.
이는 toString() 메서드 호출 시 반환되는 문자열에 영향을 준다.
instance 객체를 출력할 때 toString() 메서드가 호출되면, "[object MyClass]"와 같은 문자열이 반환된다.
이는 Symbol.toStringTag에 정의된 값과 함께 표현된니다.
Symbol.toStringTag는 Well-known 심볼 중 하나로, 자바스크립트에서 내장 객체의 문자열 표현을 커스터마이징할 때 사용된다.![]()
ㄹ