본문 바로가기
코드잇 스프린트 6기/JS Q.R 스터디

[JS Q.R] 7번째 온라인 모임

by 학습하는 청년 2024. 5. 6.

질문 작성 : 2024-05-06

 

17시 온라인 모임

(참여 인원 : 5명)

 

1. 객체의 특성을 설명해주시고, 객체 변경 방지 방법들의 차이점과 이들의 한계에 대한 해결방법을 함께 얘기해주세요.

객체는 변경 가능한 값이므로 재할당 없이 직접 변경할 수 있다. 즉 프로퍼티를 동적으로 추가하거나 삭제 및 갱신할 수 있다. 이런 객체의 특성으로 인해 프로퍼티 어트리뷰트 즉, 객체의 상태 역시 재정의할 수 있다.

 

그러나 객체의 값과 상태가 자주 변경되는 것은 안정성의 이유에서 좋지 않다. 그렇기에 객체의 변경을 방지하는 메서드(preventExtensions, seal, freeze)가 존재한다.

 

Object.preventExtensions 메서드는 객체의 확장을 금지한다. 즉, 프로퍼티를 동적으로 추가하는 것이 불가능하다. 확장만 불가능하므로 나머지는 모두 가능하다.

 

Object.seal 메서드는 객체를 밀봉한다. 밀봉된 이미지를 떠올리면 이해하기 쉽다. 그 안의 값과 상태를 변경하거나 추가할 수 없고 삭제할 수도 없는 것이다. 그러나 밀봉된 것은 읽기와 쓰기는 가능하다. 어떤 값이 있는지 알기 때문에 읽을 수 있고, 사용할 수 있는 것이다.

 

Object.freeze 메서드는 객체를 동결한다. 말 그대로 꽁꽁 얼리는 것이다. 프로퍼티를 추가하거나 삭제하거나 상태를 재정의 할 수 없다. 갱신자체가 불가능하다. 얼려져 있으므로 내용물은 그대로 존재하기 때문에 눈으로만 볼 수 있다. 즉, 읽기만 가능한 것이다.

 

그러나 이 변경 방지 메서드들은 얕은 변경 방지로 중첩 객체까지는 영향을 주지 못한다. 이를 해결하기 위해서는 재귀적으로 Object.freeze 메서드를 호출함을 통해 해결해야 한다.


2. 객체 지향의 장점과 프로토타입의 존재 이유를 연관하여 설명해주세요.

프로토타입(프로토타입 객체)는 객체지향 프로그래밍의 근간을 이루는 객체 간 상속을 구현하기 위해 사용된다. 즉, 어떤 객체의 상위 객체의 역할을 하는 객체로서 다른 객체에 공유 프로퍼티를 제공한다. 이러한 상속을 구현하여 불필요한 중복을 제거하고 기존의 코드를 적극적으로 재사용할 수 있도록 유도한다. 또한 개발 비용을 현저히 줄일 수 있는 잠재력을 갖고 있다.

 

--

프로토타입 기반의 객체지향과 클래스기반의 객체지향 차이는 무엇인가요?

다른 방식으로도 상속을 구현할 수 있는가?


3. 프로토타입 - 객체 - 생성자 함수의 상관관계를 설명해주세요.

객체는 리터럴 표기법 또는 생성자 함수에 의해 생성되므로 결국 모든 객체는 생성자 함수와 연결되어 있다. 생성자 함수는 사용자 정의 생성자 함수와 빌트인 생성자 함수로 구분되고 객체를 생성하는 방법만 다를 뿐 큰 틀에서 보면, 객체라는 점에서는 차이가 없다. 결국 객체로서 동일한 특성을 갖는 것이다.

 

모든 객체는 하나의 프로토타입을 갖는다. 그리고 모든 프로토타입은 생성자 함수와 연결되어 있다. 이때 프로토타입은 생성자 함수가 생성되는 시점에 더불어 생성된다. 다시 말해, 각각은 단독으로 존재할 수 없고 언제나 쌍으로 존재한다.

 

--

빌트인 생성자 함수에서 프로토타입은 언제 생성이 되는가?


4. 프로토타입 체인에 대해 설명해주세요.

프로토타입 체인은 단방향 링크드 리스트(마치, 리액트의 프롭스 전달 방식)으로 구현되어야 한다. 또한 자바스크립트의 객체지향 프로그래밍의 상속을 구현하는 메커니즘이다. 프로토타입 체인의 최상위에 위치하는 객체는 언제나 Object.prototype이다. 따라서 모든 객체는 Object,prototype을 상속받는다. 또한, 자바스크립트 엔진은 프로토타입 체인을 따라 프로퍼티/메서드를 검색한다. 검색은 단방향으로 진행되므로 연결된 순서를 따라 진행된다. 즉, 프로토타입 체인은 상속과 프로퍼티 검색을 위한 메커니즘이라고 말할 수 있다.

 

--

오버라이딩

검색하면서 올라간다고 설명하셨는데, 같은 이름을 갖고 있는 것을 뭉엇이라고 말하나요?


5. for ... in 반복문을 사용하는 것과 객체의 메서드(keys, values, entries)를 사용하는 것의 차이점은 무엇인가요?

어트리뷰트의 어떤 값이 true일 때 순회할 수 있는가? Enumable

for ... in을 할 떄 주의해야 할 점은 무엇인가요? 순서를 보장하지 않는다.

for ... in문에서 상속받은 프로퍼티를 제외하고 열거할 수 있는 방법이 있나요?

prototype.jasOwnProprty 메서드를 사용하여

객체의 메서드를 사용하여 어떤 식으로 객체의 프로퍼티를 순회할 수 있는가? 이터러블을 이터레이터 객체로 반환된 것으 forEach()를 돌려야 한다.

댓글