본문 바로가기
  • soldonii's devlog
Javascript 공부/바닐라코딩

바닐라코딩 부트캠프 2주차 후기

by soldonii 2020. 1. 19.

2020년 1월 6일(월)에 시작한 바닐라코딩 부트캠프 2주차가 지났다. 1주차 피드백을 잘 적용했는지, 2주차는 어땠는지 회고하고자 한자.


이번 주는 자료 구조에 대해서 배운 한 주였다. Stack, Queue, Hash Table, Linked List 등을 배웠고, 각 자료구조의 메소드를 테스트 케이스가 통과될 수 있도록 직접 구현해보는 등의 과제가 주어졌다. 다행이도 부트캠프 들어오기 전 몇 달 동안 독학을 해서 아주 생소하지는 않았다. 다만 그 때 혼자 공부하면서도 각 자료구조 별로 필요한 필수 메소드들의 구현 로직를 강의로 듣기도 했고, 나 혼자서도 여러 차례 해봤는데 시간이 좀 지나서 그런지 약간 헤매면서 풀었다.

 

특히 Hash Table에서 해쉬 충돌이 일어났을 때 자료들을 어떻게 처리할지와 size가 다 찼을 때 동적으로 메모리를 2배로 늘려주고, 또는 필요할 때 메모리를 1/2로 줄여주는 부분을 구현하는데에서 애를 많이 먹었다. 해쉬 충돌 시 linked list를 이용해서 연결지어 주는 것이 일반적이라는 것 또한 공부해서 알고 있었지만 직접 해보려고 하니 참 어려웠다. 그래도 어찌어찌 해냈는데, 완전히 100% 내 것으로 만들기 위해서 주말 간 다시 복습해야 한다.


# 2주차 피드백 정리

[ 개선점 피드백 ]

  • 생성자 호출을 할 함수는 첫글자를 대문자로 네이밍하는 것이 일반적이다. (ex. function MakeNode() {...}) => 몰랐던 부분은 아니지만 실천하지 않으면 모르는 것과 똑같다. 제출 전에 꼼꼼히 확인이 필요.
  • in operato 의 경우 return 값이 boolean이므로, 불필요하게 if (something in obj) { return true }와 같이 조건문을 작성할 필요가 없다. => true/false를 return하길 원할 경우에는 작성하는 구문에 조건문이 필요할지 고민해보고 한 번 더 확인이 필요하다.
  • if, else if로 두 값을 비교할 경우 비교값의 방향을 일관성있게 맞추는 것이 가독성에 좋다. => 의식하지 않고 내 머리속 흐름대로 작성했던 것 같은데, 이 부분도 다음 과제부터 주의가 필요.
  • 조건문 내부에 최대한 불필요한 중첩 조건이 덜 발생해야 가독성에 좋다. => 각 경우의 수를 세세하게 나눈 후, 공통적으로 묶어서 따로 처리할 수 있는 부분을 빼야 한다. 이 부분은 로직 상의 문제라 많은 연습이 필요하다. 코드를 쓸 때 손부터 나가지 말고 각 경우의 수를 최대한 모두 나열한 후에 이들을 다시 공통점이 있는 case끼리 묶어서 최대한 조건문 내부에 또 조건문이 중첩되지 않도록..
  • 파일 마지막에 빈줄 => 이건 지난 주에 ken님이 말씀하셔서 조사도 해보고 왜 필요한지도 알았던 내용이라 최초 제출 시 신경써서 확인했는데, 주말에 코드 수정하다가 재확인을 안하고 제출해버렸다. 제출 전에 모든 파일을 한 번씩 추가로 점점하는 습관을 들여야겠다.
  • 마지막으로 중요한 피드백 하나는 따로 밑에 작성한다.

 

# 생성자 함수의 property로 있어야 한다.

Set 자료구조를 implementing할 때, 내가 이상한 코드를 작성했다.

const Set = function () {
  const set = Object.create(setPrototype);

  return set;
}

const setPrototype = {
  _storage: null;
}

 

우선 지금 위의 코드는 최초 Set 함수를 생성자 호출을 하여 1) 새로운 set 인스턴스를 생성한 후, 2) 생성된 인스턴스가 여러 메소드들을 상속받을 수 있도록 setPrototype이 prototype 체인으로 연결된 빈 객체를 Set 함수 내의 set 변수에 리턴시킨 것이다.

 

위 코드의 문제는 _storage, 즉 set의 값을 보관할 대상이 Set 생성자 호출 시 생성된 인스턴스 내부에 존재하지 않고, 상속을 받게 된다는 점이다. 인스턴스가 생성되면 각 인스턴스들은 고유한 자신만의 프로퍼티(특히나 값을 보관할 storage 같은 것은 더더욱!)를 가지고 있어야 하고, 자신이 가지고 있지 않은 메소드를 상위 프로토타입 체인에서 빌려와서 써야하는데, 내 코드를 보면 인스턴스는 아무것도 가진 것이 없고 모든 것을, 심지어 값을 보관할 _storage 조차 상위에서 상속받게 된다.

 

이렇게 되면 여러 인스턴스를 생성하고 각 인스턴스들에 메소드들을 사용할 경우, 해당 메소드들이 각 인스턴스의 프로퍼티를 변경하는 대신 프로토타입 체인 상위의 _storage를 직접 수정하고 이를 인스턴스가 상속받게 되기 때문에 값이 뒤죽박죽이 될 수 있다.

 

따라서 위의 코드는 아래처럼 반드시 변경되어야 한다.

 

const Set = function () {
  const set = Object.create(setPrototype);
  set._storage = null;

  return set;
};

const setPrototype = {};

댓글