Developer/자바스크립트

자바스크립트 , Set

단님 2024. 6. 4. 20:57
728x90

Set 이란 ?

value 값을 저장하고 , 중복을 허용하지 않는 컬렉션이다.

중복일 경우 중복값은 인지하지 않는 특징을 지녔다.

대소문자를 구분해 대문자 소문자는 다른 값으로 인지한다.

값의 순서가 인지되지 않는다.

 

대체 Set , 왜사용하는걸까 ?

한마디로 Set 는 , 순서가 없고 , 중복되지 않는 데이터의 집합이라고 할 수 있다.

 

배열과의 차이점을 인식하여야 하는데,

배열은 데이터를 순서 있게 저장하고 , 순서를 알고 있기에 인덱스를 통한 접근이 가능하다.

값이 중복되더라도 배열은 인덱스가 다르기 때문에 저장이 가능하다.

 

Set 객체의 메서드
  1. 요소 추가: Set.add(value)
  2. 요소 일부 삭제: Set.delete(value)
  3. 요소 존재 확인: Set.has(value)
  4. 요소 갯수 확인: Set.size
  5. 요소 전체 삭제: Set.clear()

 

배열과의 가장 큰 차이점의 중복확인 저장에 대해서 알아보자.

 

배열일경우 , 값들을 하나하나 비교하여 같으면 저장하지 않는 반복 작업이 필요하다.

    // ** Array
    // => 문자열의 중복을 허용하지 않는 배열 정의하기
    //   ( 조원들의 이름을 중복을 허용하지 않고 배열에 담기 )
    //    -> 1) 배열정의
    //    -> 2) 중복확인기능 (함수로 만들기)
    //    -> 3) 배열에 자료 담기
    // 1)
    let names = [];
    //let names = new Array();
    // 2) unique 확인 함수 만들기
    // =>  매개변수 text 로 전달된 값을 배열 names 의 요소들과 비교 해서
    //     동일값이 없으면 return true, 있으면 return false 
    const unique = (text) => {
        for ( let name of names ) {
          if ( text==name ) return false;
        } //for
        return true;
    }
    // 3) str 을 names 에 담기 (중복없이)
    let str = ['조현주', '조현주', '김이지', '김찬미', '김진휘', '김이지', '김찬미'];
    for ( let name of str ) {
      // 중복검사 후 담기
      if ( unique(name) ) names.push(name) ;
    }
    // 4) 출력 확인
    for ( let name of names ) {
      console.log(`** Name => ${name}`);
    }

 

코드가 복잡해짐을 알 수 있다.

 

이번에는 Set 을 이용한 비교를 해본다면,

// ** Set 과 비교
    // => str -> mySet 에 담기
    let mySet = new Set();
    for (let n of str) { mySet.add(n) }
    for(name of mySet) { console.log(`** Name = ${name}`); }

    mySet.delete('김진휘');
    mySet.delete('김진휘');  // 없는 값 delete 하는경우 (Error 없이 통과)
    console.log(`** mySet.has => 김진휘=${mySet.has('김진휘')}, 김찬미=${mySet.has('김찬미')}`);
    console.log(`** mySet.size => ${mySet.size}`);
    console.log(`** mySet 출력 => ${mySet}`);

Set 을 새롭게 생성하고 , 그후에 add 만 해주면 자동으로 중복되는 값은 인정하지 않으면서 저장된다.

복잡한 비교식이 없고 단 , 몇줄에 의해 중복되지 않는 값들을 저장할 수 있다.

 

Set 메서드의 체이닝

처리후 값을 계속 리턴하고 있기 떄문에 계속 . 으로 연결하여 사용할 수 있다.

단 , delete 나 has 는 boolean 값을 반환하기 때문에 체이닝 중간에 사용할 수 없음. 마지막으로는 사용할 수 있겠다.

// => Set 생성과 동시에 초기화
    let mySet2 = new Set(str);
    mySet2.add('설수현').add('신혜진').add('연제승').add('설수현').delete('설수현');
    for(name of mySet2){ console.log(`** Name2 = ${name}`); }

 

 

다시 짚고 넘어가는 forEach

- 특징

콜백 함수나 화살표로 축약된 함수를 사용 할 수 있다

호출하는 배열을 변경하는건 가능하지만,  값을 리턴하여 받아낼수 없다.(forEach를 변수에 저장한다면.undefined)

리턴하여 저장해야할 경우 , map을 사용하자.

break를 사용할 수 없다.

 

배열에 이어 Map 과 Set 의 사용 방법.

배열.forEach(현재 요소값, 현재 인덱스, 현재 순회중인 배열객체 자체)

Map.forEach (현재 value, 현재 key, 현재 순회중인 map객체 자체 )

Set.forEach (현재 요소값, 현재 요소값, 현재 순회중인 set객체 자체)

 


Weak Collections 이란 ?

 

Map 과 Set 이 참조하는 객체들은 강하게 연결되어 있다.

이 뜻은 , 자바스크립트의 가비지 컬렉션이 메모리 수거를 못하게 막는 원인이 되며,

큰 메모리의 객체가 더이상 쓰이지 않게 된다면 , 가비지컬렉션은 이것을 가져가기 위해 비싼 비용을 치러야 한다.

굉장히 비효율적이라는 것이다.

메모리의 효율성을 위해 새롭게 추가된 Weak Collections 이며 , 

사용이 완료된 메모리 영역을 재활용이 가능하도록 비워주는 활동을 한다.

모든 기능이 정확하고 오류없이 구현하되, 메모리에 최적화가 되어야하는것이 우리들의 최종 목표이기 때문이다.

가비지 컬렉션에서 사용이 완료되었는지 안되었는지 판단하는 기준은,

사용을 마친 객체가 있다면 그 주소에 null 값을 집어 넣게 되며,

추후 참조하지 않는다면 추후에 지워지게 된다.

가비지 컬렉션도 결국은 알고리즘이며 , 정교하고 규칙적으로 자기만의 규칙으로 인해 움직이는 컬렉션이다.