header

Day 3 - 2022/10/19

💡 새롭게 알게된 점

자료구조와 알고리즘

자료구조

매모리를 효율적으로 사용하며 빠르고 안정적으로 데이터를 처리하는 것이 궁극적인 목표로 상황에 따라 유용하게 사용될 수 있도록 특정 구조를 이루고 있다. → 잘못 사용시 역효과

자료구조의 종류

  • 선형 구조
    • 한 원소 뒤에 하나의 원소만이 존재하는 형태로 자료들이 선형으로 나열되어 있는 구조
    • ex) 배열, 연결 리스트, 스택 큐
  • 비선형 구조
    • 원소 간 다대다 관계를 가지는 구조로 계층적 구조나 망형 구조를 표현하기에 적절하다.
    • ex) 그래프, 트리

배열

배열 요소 삭제, 추가는 최대의 경우 O(n)의 시간 복잡도를 가지기 때문에 추가와 삭제가 반복되는 로직이라면 배열 사용 권장하지 않고 탐색이 더 많은 경우에 유리하다.

연결 리스트

연결 리스트는 각 요소를 포인터로 연결하여 관리하는 선형 자료구조로 탐색에 O(n), 요소 추가 및 삭제는 O(1)의 시간 복잡도를 가지기 때문에 추가와 삭제가 반복되는 로직일 때 유리하다.

각 요소는 노드라고 부르며 데이터 영역/포인터 영역으로 구성된다.

  • 단일 연결 리스트
    • Head에서 Tail까지 단방향으로 이어지고, tail의 포인터 영역은 NULL이다.
  • 이중 연결 리스트
    • 양방향으로 이어지는 연결 리스트로 단방향보다 크기가 크다.
  • 환형 연결 리스트
    • 위의 연결 리스트들에서 Tail이 Headfh 연결되는 리스트로 메모리 아낄수 있고, 원형 큐 만들때도 사용된다.

스택

Last In First Out(LIFO)

스택을 표현하는 방법은?

  • Array로 표현하기
  • Linked List로 표현하기: head가 top, 제거는 top에서만 되도록


알고리즘

특정 문제를 메모리 효율적이고 빠르게 해결하는 것이 궁극적인 목표로 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것을 의미한다.


그렇다면 자료구조와 알고리즘이 왜 중요할까?

1. 기초 코딩 능력을 기르기 위함
2. 변하지 않기 때문에 알아두면 두고두고 사용 가능

여기까지가 강의 내용을 정리한 것인데, 문득 자바스크립트 자료구조에 무엇이 있는지 궁금해져서 document를 찾아보았다.

자바스크립트 공식 문서를 보던 중, 키 컬렉션 항목의 WeakMap, WeakSet을 발견했다.

??? 그냥 Map, Set은 많이 들어보고 사용했는데, WeakMap과 WeakSetdms 뭐지? Map/Set의 약한 형태?


WeakMap

일반적인 Map은 Map에 추가한 객체를 키로 사용한 경우 의 참조를 null로 덮어쓰더라도, Map이 메모리에 남아있는 한 메모리에 남아 가비지 컬렉션의 대상이 되지 않는다. 따라서 메모리가 낭비되는 문제..

반면 WeakMap은 키로 쓰인 객체가 가비지 컬렉션의 대상이 된다고 한다. 즉, 참조를 null로 덮어 쓴다면 객체가 위크맵과 메모리에서 자동으로 삭제된다.


오? 그러면 앞으로 Map 대신 WeakMap을 애용하면 되는건가?

그런데 여기서 WeakMap의 단점이 드러난다. 키 값으로 객체를 사용할 수 없다는 점과, 반복 작업과 keys(), values(), entries() 메서드를 지원하지 않아 키나 값 전체를 얻는 것이 불가능하다는 점이다.


뭐 때문에 불가능한거지..?

가비지 컬렉션이 일어나는 시점은 자바스크립트 엔진이 결정하기 때문에 동작 시점을 정확히 알 수 없다. 따라서 객체가 참조를 잃었을 때 그 즉시 메모리에서 삭제될 수도 있고, 대기하다가 다른 작업과 같이 삭제될 수도 있기 때문에 WeakMap 속 요소가 몇 개인지 확인하는게 불가능하다는 뜻이다. 그래서 위크맵의 요소 전체를 대상으로 이뤄지는 메소드는 동작 자체가 불가능하다.


..?? 그럼 대체 언제 사용하는건데?

대표적인 예로 두가지가 있다.

  1. 추가적인 데이터를 저장할 곳이 필요할 때
    • 외부 코드에 속한 객체에 추가해야 할 데이터가 객체가 살아있는 동안에만 유효한 상황인 경우(ex: 비밀문서), Map으로 구현한다면 객체가 도달 가능하지 않은 상태가 된 경우에도 Map의 키로 사용되고 있어 메모리에서 삭제되지 않아 메모리가 낭비된다. 여기서 WeakMap으로 구현한다면 객체가 도달 불가능한 상태가 되면 가비지 컬렉션의 대상이 되어 메모리에서 삭제된다.
  2. 캐싱이 필요할 때
    • 일반적인 Map 자료구조로 캐싱을 구현한다면 객체의 참조를 null로 덮어쓸 경우에도 객체가 여전히 캐시에 남아있어 메모리가 낭비된다. 여기서 WeakMap 자료구조로 캐싱을 구현한다면 객체가 더 이상 쓸모 없어졌을 경우에 null로 덮어쓰면 객체가 가비지 컬렉션의 대상이 되어 캐싱된 데이터도 메모리에서 삭제된다.


WeakSet

WeakSet도 WeakMap과 비슷한 맥락이다.

Set과 유사하지만 객체만 저장할 수 있다는 점과, 반복 작업과 size, keys() 메소드를 지원하지 않는다.


그럼 WeakSet은 또 언제 사용해?

WeakMap과 유사하게 부차적인 데이터를 저장할 때 사용할 수 있다. 하지만 복잡한 데이터를 저장해 사용하기 보다는 간단한 답변을 얻는 경우로 사용된다.


❗️ 느낀점

오늘은 나름대로 요약을 조금 했던 것 같다. 아닌가? 그래도 1, 2일차에 비해 매우 요약해서 적은 편이라 생각한다..

그리고 오늘 추가적으로 찾아보면서 느낀건데 강의를 듣는 방식보다는 내가 궁금한 점을 직접 찾아서 학습하는게 더 이해가 잘 되고 기억에 잘 남는 것 같다.

오늘 오전에 이동근 멘토님과의 커피챗☕️ 시간을 가졌는데, 공부하면서 멘토님께서 자신에게 맞는 효율적인 공부 방법을 찾아보라고 하신 말씀이 와닿았다.

물론 이게 나에게 가장 효율적인 방법은 아닐수도 있으니, 앞으로 더 효율적인 방법을 찾을 수 있도록 노력하자!

오늘도 고생했다👊