Symbol형

느리게 따라가기·2023년 3월 5일
0

javascript

목록 보기
3/6
  • Symbol은 유일한 식별자를 생성한다.
  • primitive value => 유일무이하고 고유한 존재
  • 비공개 멤버에 대한 Needs에서 탄생(private 기능제공을 위한 필요성)
  • 기본적인 열거대상에서 제외(properties 순회를 이용한 접근불가)
  • 암묵적 형변환 불가

사용법

const a= Symbol(); // new를 쓰지 않음.
const b= Symbole();

console.log(a, b); 
=> Symbole() Symbol()

a==b //false
a===b //false

const id1=Symbol('id')
const id2=Symbol('id')
console.log(id1, id2); 
=> Symbole('id') Symbol('id')
id1==id2 //false
id1===id2 //false

사용예

const id=Symbol('id')
const user={
	name:'jjryu',
  	job:'dev',
  	[id]:'jj_ryu'
}

console.log(user)
=> {name: 'jjryu', job: 'dev', Symbol(id): 'jj_ryu'}

사용목적

1. enum 구현

java script에는 enum 타입이 없어, Symbol을 이용해서 구현함.

// enum 구현
const BLOOD_TYPE=Object.freeze({
 	A:Symbol('A'),
   	B:Symbol('B'),
    O:Symbol('O'),
   AB:Symbol('AB')
 })

// iterator 구현
obj={
	[Symbol.iterator](){
    	return{
        	next(){
            	return 
            }
        }
    }
}
for( type in BLOOD_TYPE){
    console.log(type)
}

2. 멤버변수 접근제어(정보은닉, 멤버변수 중복방지)

    1. 정보은닉

//예제 1 (정보은닉)
const NAME=Symbol('name')
const GENDER=Symbol('gender')
const jj={
	[NAME]:'JJ',
    [GENDER]:'male',
    job: 'dev',
    getName(){
        console.log(this[NAME])
    },
    setName(name){
        this[NAME]=name;
    },
    getGender(){
        console.log(this[GENDER])
    }
   
}
jj.getName()
jj.setName('jjryu')
jj.getName()
jj.getGender();
  • 2.상속을 통한 멤버변수명 conflict 예방
// 예제 2. 멤버변수 conflict 예방
class Counter{
	count=0;
	add(){
      this.count+=1;
      return this;
    }
}

class ChildCounter extends Counter{
	count=function(){...}; // Conflict 발생!!!!
    // Counter가 외부라이브러리라면 의도치 않게 덮어씌어져 오류발생
}

// Counter를 아래와 같이 정의하면 상속시 변수명 중복 방지
const count=Symbol();
class Counter{
	[count]=0;
	add(){
      this[count] +=1;
      return this;
    }
}

Global Symbol Registry

Symbol.for(): 전역심볼

  • 하나의 심볼만 보장받을 수 있음
  • 없으면 만들고, 있으면 가져옴
  • Symbol 함수는 매번 다른 Symbol 값을 생성하지만,
  • Symbol.for 메소드는 하나를 생성한 뒤 키를 통해 같은 Symbol을 공유
let name01=Symbol.for('name')
let name02=Symbol.for('name')
name01==name02  //true
name01===name02 //true
profile
두걸음 뒤에서.. 그래도 끝까지!!

0개의 댓글