노트

[노트] 자바스크립트 Set, localeCompare, 객체지향 프로그래밍 (2024.05.25)

hminor 2024. 5. 25. 15:13

2024.05.25(토)

1. Set
자바스크립트로 갑작스런 코테를 보게 되어서 푸는 와중;;;
단순히 Set() 타입의 객체를 values()로 나온 걸 for 문으로 돌리면 바로 해결 가능한건데
계속 반복문이 안돌아져서 결국 해결하지 못했는데 알고 보니 2가지 방법이 있었는데 values()로 하는게 아니라
첫 번째는 Arrays.from() 에 Set 객체를 넣어서 배열로 만드는 거고
두 번째는 스프레드 연산자를 활용하는 것이 있어서 다음부터는 이런 문제에도 해결할 수 있을 것 같다... ㅠ

2. localeCompare
문자열이 있고 해당 문자열을 오름차순 또는 내림차순으로 정렬하고 싶다면 localeCompare을 사용하면 되는데
우선 정렬을 할 때 단순 sort()를 사용하여 정렬할 수 있지만 인자값을 넣어서 적용할 수 있다는 걸 
잊고 있었고 만약 오름차순이면 sort((a,b)=>a.locateCompare(b)) 이고 내림차순이면 a,b를 바꿔서 적용하면 된다.
그리고 문자열을 배열로 만들고 싶다면 Array.from()도 가능하고 split("") 또한 가능하다는 것!

3. Set.has
코테 문제에서 빠른 탐색을 위해 2차원 배열을 set 타입에 넣어서 has로 특정 배열을 찾으려고 했는데 
계속 원하는대로 안되서 끝나고 찾아보니 참조를 기반으로 중복을 체크하기에
같은 값이어로 다른 배열 객체로 생성된 것으로 확인되어 동일하지 않다고 인식되기에 해결이 안되었다
그래서 의도한대로 해결하기 위해선 아래와 같이 작성하여 해결할 수 있다.
2차원 배열을 map으로 순회하며 각 배열을 JSON.stringify로 변환한 다음 
찾고자 하는 배열을 변환하여 has로 찾기

const s = new Set([[1,2],[3,4]].map(JSON.stringify))
console.log(s.has(JSON.stringify([1,2]))) // true



4. 객체지향 프로그래밍
캡슐화, 추상화, 상속, 다형성에 대해 설명하라는 문제가 나왔지만 정처기 공부한지 오래되어 
기억이 나지 않는 이슈가 발생하여 기억하기 위해 아래에 정리

// 캡슐화 (Encapsulation)

캡슐화는 객체의 데이터를 보호하고, 객체 내부의 상태를 외부에서 직접 접근하지 못하게 하며, 
대신 메서드를 통해서만 접근하도록 하는 원칙. 
이를 통해 데이터 무결성을 유지하고, 객체의 내부 구현을 감추어 유지보수를 쉽게 할 수 있다.
예를 들어 자바에서 Getter, Setter를 사용하는 것을 생각할 수 있다.

class Person {
  constructor(name, age) {
    this._name = name; // private-like property
    this._age = age;   // private-like property
  }

  // Getter for name
  getName() {
    return this._name;
  }

  // Setter for name
  setName(name) {
    this._name = name;
  }

  // Getter for age
  getAge() {
    return this._age;
  }

  // Setter for age
  setAge(age) {
    if (age > 0) {
      this._age = age;
    }
  }
}

let person = new Person('Alice', 25);
console.log(person.getName()); // Alice
person.setAge(30);
console.log(person.getAge());  // 30
// 추상화 (Abstraction)

추상화는 객체의 복잡성을 숨기고, 필요한 중요한 특징이나 동작만을 외부에 노출하는 개념. 
인터페이스나 추상 클래스 등을 통해 구현.

class Animal {
  constructor(name) {
    if (new.target === Animal) {
      throw new TypeError("Cannot construct Animal instances directly");
    }
    this.name = name;
  }

  makeSound() {
    throw new Error("This method must be overridden!");
  }
}

class Dog extends Animal {
  makeSound() {
    return "Woof!";
  }
}

let dog = new Dog("Rex");
console.log(dog.makeSound()); // Woof!
// 상속 (Inheritance)

상속은 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 재사용할 수 있게 하는 개념. 
이를 통해 코드 재사용성과 유지보수성을 높임.

class Animal {
  constructor(name) {
    this.name = name;
  }

  eat() {
    return `${this.name} is eating.`;
  }
}

class Dog extends Animal {
  bark() {
    return "Woof!";
  }
}

let dog = new Dog("Rex");
console.log(dog.eat());  // Rex is eating.
console.log(dog.bark()); // Woof!
// 다형성 (Polymorphism)

다형성은 동일한 인터페이스나 메서드가 다양한 형태로 동작할 수 있게 하는 개념. 
메서드 오버로딩, 오버라이딩 등을 통해 구현.

class Animal {
  makeSound() {
    return "Some generic sound";
  }
}

class Dog extends Animal {
  makeSound() {
    return "Woof!";
  }
}

class Cat extends Animal {
  makeSound() {
    return "Meow!";
  }
}

let animals = [new Animal(), new Dog(), new Cat()];
animals.forEach(animal => console.log(animal.makeSound()));
// Some generic sound
// Woof!
// Meow!

쉽게 생각하면
캡슐화는 외부에서 직접적으로 접근하지 못하게 보호하는 것.
추상화는 객체의 복잡성을 숨기고 필요한 특징이나 동작만을 외부에 노출하는 것.
상속은 기존 클래스의 속성과 메서드를 새로운 클래스에게 재사용 가능하도록 하는 것.
다형성은 동일한 인터페이스나 메서드가 다양한 형태로 동작할 수 있도록 하는 것으로,
               메서드 오버로딩과 메서드 오버라이딩이 있다.