/* 1. 빈 Set 객체 생성 */
const emptySet = new Set(); // 아무 값도 없는 빈 Set
console.log(emptySet); // Set(0) {size: 0}

/* 2. 초깃값을 가진 Set 생성
      배열을 전달하여 초깃값 설정 */
const numbers = new Set([1, 2, 3, 2, 1]);
console.log(numbers); // Set(3) {1, 2, 3} → 중복 자동 제거

/* 3. 값 추가 */
numbers.add(7);
console.log(numbers); // Set(4) {1, 2, 3, 7}

numbers.add(2); // // 중복되는 값은 추가되지 않음
console.log(numbers); // Set(4) {1, 2, 3, 7}

/* 4. 값 개수 확인 */
console.log(numbers.size); // 4

/* 5. 값이 있는지 체크 */
console.log(numbers.has(1)); // true
console.log(numbers.has(8)); // false

/* 6. 값 삭제 */
numbers.delete(1); // 1 삭제
console.log(numbers); // Set(3) {2, 3, 7}
// 배열은 같은 값을 여러 번 저장할 수 있어 중복 제거가 자동으로 되지 않습니다.
const arr = [1, 2, 2, 3, 3];
console.log(arr); // [1, 2, 2, 3, 3]
const arr = [1, 2, 2, 3, 3];
console.log(arr); // [1, 2, 2, 3, 3]

// Set 예제
const uniqueSet = new Set(arr);
console.log(uniqueSet); // Set {1, 2, 3}
// 1부터 1,000,000까지 데이터를 가진 Set 객체 생성
const bigSet = new Set();
for (let i = 1; i <= 1000000; i++) {
  bigSet.add(i);
}

// 값 존재 확인
console.log(bigSet.has(500000)); // true → 매우 빠르게 확인 가능

// 값 삭제
bigSet.delete(500000);
console.log(bigSet.has(500000)); // false → 빠른 삭제
// 1. 빈 Set 객체 생성
new Set()

// 2. 초깃값을 가진 Set 객체 생성
new Set(iterable)
// 1) 빈 Set 객체 생성
const emptySet = new Set();
console.log(emptySet); // 출력: Set(0) {size: 0}

// 2) 이터러블(iterable)인 배열을 전달해 초깃값을 가진 Set 생성
const initializedSet = new Set([
    "apple", 
    "banana",
    "orange"
]);
console.log(initializedSet); // 출력: Set(3) {'apple', 'banana', 'orange'}
// Set 객체 생성
const mySet = new Set();

// 값 추가
mySet.add("apple");
mySet.add("banana");
mySet.add("orange");

// size 속성으로 값 개수 확인
console.log(mySet.size); // 출력: 3

// 값 하나 삭제
mySet.delete("banana");
console.log(mySet.size); // 출력: 2

// 모든 값 삭제
mySet.clear();
console.log(mySet.size); // 출력: 0
// Set 객체 생성
const mySet = new Set();

// .add(value)로 값 추가
mySet.add("apple");
mySet.add("banana");

// .has(value)로 값 확인
console.log(mySet.has("apple")); // 출력: true

// .delete(value)로 값 삭제
mySet.delete("banana");
console.log(mySet.has("banana")); // 출력: false

// clear()로 전체 값 삭제
mySet.clear();
console.log(mySet.size); // 출력: 0

// .forEach()로 Set 순회
mySet.add("apple");
mySet.add("orange");

mySet.forEach((value) => {
  console.log(value);
});
// 출력:
// apple
// orange
const fruits = new Set(["사과", "바나나", "포도"]);

// Set 객체에 값이 추가된 순서대로 요소를 하나씩 꺼내 사용합니다.
for (const item of fruits) {
  console.log(item); 
}
// 출력:
// 사과
// 바나나
// 포도
const animals = new Set(["Dog", "Cat", "Fish"]);

// 콜백 함수에 Set의 값이 전달되어, 각 요소를 처리합니다.
animals.forEach((value) => {
  console.log(`현재 처리 중인 값: ${value}`);
});
// 출력:
// 현재 처리 중인 값: Dog
// 현재 처리 중인 값: Cat
// 현재 처리 중인 값: Fish
const letters = new Set(["a", "b", "c"]);
const lettersArray = [...letters].map(l => l.toUpperCase());

console.log(lettersArray); // 출력: ["A", "B", "C"]
const letters = new Set(["a", "b", "c"]);

// Set → 배열 변환
const lettersArray = [...letters];

console.log(lettersArray); // 출력: ["a", "b", "c"]
const numbers = new Set([1, 2, 3]);

// Set → 배열 변환
const numbersArray = Array.from(numbers);

console.log(numbersArray); // 출력: [1, 2, 3]
// 요청을 보낸 IP를 저장하는 Set 객체
const visitorIPs = new Set();

// 사용자가 들어올 때마다 호출되는 함수
function recordVisit(ip) {
  visitorIPs.add(ip); // 중복되는 IP는 자동으로 제거됨
  console.log(`현재 기록된 고유 IP 수: ${visitorIPs.size}`);
}

// 여러 IP가 섞여 반복 방문하는 상황
recordVisit("192.168.0.10"); 
recordVisit("192.168.0.11"); 
recordVisit("192.168.0.10"); // 중복 처리됨
recordVisit("192.168.0.12"); 
recordVisit("192.168.0.11"); // 중복 처리됨

// 최종 고유 방문자 수 확인
console.log(`최종 집계된 고유 방문 IP 수: ${visitorIPs.size}개`);
console.log(visitorIPs);
출력 결과