🔶 JavaScript

  • 클래스는 프로토타입의 문법적 설탕이라고 볼 수 있는가?

: 소위 말하는 문법적 설탕은 동일한 동작을 수행해야 함, 즉 문법적 설탕이라고 보려면 클래스와 프로토타입의 수행 동작이 동일해야 하고 결국 둘 중 무엇을 선택하여 사용하든 차이가 없어야 함
: 큰 틀에서는 클래스와 생성자 함수의 동작이 유사하지만, 세부적인 내부 동작이 다르기 때문에 클래스는 프로토타입의 문법적 설탕이라고 볼 수 없음

  • 클래스와 생성자 함수의 차이는 무엇인가?

: 클래스는 new 연산자를 무조건 사용해야 하지만, 생성자 함수는 new 연산자를 사용하지 않아도 일반 함수로 호출할 수 있음
: 클래스는 extends, super 키워드로 확장할 수 있지만, 생성자 함수에는 extends, super가 존재하지 않음
: 클래스는 let, const로 선언한 변수처럼 호이스팅되지만, 생성자 함수의 경우 선언문은 함수 호이스팅처럼 동작하고 표현식은 변수 호이스팅처럼 동작함
: 클래스는 암묵적으로 엄격 모드가 적용되지만, 생성자 함수에는 엄격 모드가 적용되지 않음
: 클래스의 경우 [[Enumerable]]의 기본 값이 false로 지정되지만, 생성자 함수의 경우 [[Enumerable]]의 기본 값이 true로 지정됨

  • 생성자 함수보다 클래스를 사용해야 하는 이유는 무엇인가?

: 클래스는 new 연산자로 호출하지 않으면 에러가 발생한다는 점에서 생성자 함수보다 더 엄격함, 예상치 못한 결과를 방지할 수 있다는 점에서 클래스를 사용하는 것이 바람직함

  • 클래스 몸체에 정의할 수 있는 메서드의 종류는 무엇이 있는가?

: constructor, 프로토타입 메서드, 정적 메서드

  • constructor는 무엇인가?

: 클래스를 통해 인스턴스를 생성하는 역할을 하는 클래스의 함수

  • constructor는 어떻게 인스턴스를 생성하는가?

: 먼저 암묵적으로 빈 객체를 생성하고, this에 생성한 빈 객체를 바인딩함, 그 후 constructor 내부의 문을 토대로 인스턴스에 프로퍼티를 초기화

  • constructor의 특징은 무엇인가?

: 클래스 이름.constructor와 같은 방식으로 호출할 수 없기 때문에 클래스 내부에 있지만 엄밀히 따지면 메서드라고 볼 수 없음
: 클래스가 생성될 때 constructor는 내부에 기술된 동작을 하는 함수 객체 코드의 일부로서 해석됨

  • constructor는 어떻게 사용할 수 있는가?

: 매개변수로 외부에서 받아올 초기 값을 설정, 설정한 초기 값을 바탕으로 인스턴스를 초기화할 수 있음

  • 클래스의 프로토타입 메서드는 어떻게 사용할 수 있는가?

: 생성자 함수와 달리 메서드 앞에 프로토타입을 작성하지 않아도 됨, 다만 ES6의 메서드 축약 표현으로 작성해야 함

  • 클래스의 정적 메서드는 어떻게 사용할 수 있는가?

: 프로토타입 메서드 앞에 static 키워드를 붙여서 사용해야 함

  • 정적 메서드와 프로토타입 메서드는 어떤 차이가 있는가?

: 정적 메서드와 프로토타입 메서드는 속해 있는 프로토타입 체인이 다름
: 정적 메서드는 클래스 자체로 호출할 수 있고, 프로토타입 메서드는 클래스가 생성한 인스턴스로 호출할 수 있음
: 정적 메서드는 인스턴스 프로퍼티를 참조할 수 없지만, 프로토타입 메서드는 인스턴스 프로퍼티를 참조할 수 있음

  • 클래스의 메서드는 어떤 경우에 각각 잘 활용할 수 있는가?

: 인스턴스의 프로퍼티를 참조해야 하는 경우라면 프로토타입 메서드를 생성하여 사용하는 것이 바람직함
: 인스턴스의 프로퍼티를 참조하지 않아도 된다면 클래스의 정적 메서드로 생성하여 사용하는 것이 바람직함

  • 클래스 필드란 무엇인가?

: 원래는 클래스 기반 객체지향 언어에서 클래스가 생성할 인스턴스의 프로퍼티를 가리키는 용어
: 자바스크립트의 클래스에서도 동일한 개념으로 사용됨, 클래스는 메서드 외에 몸체에 프로퍼티를 선언할 수 없기 때문에 클래스 필드로 대체함
: 클래스 필드를 참조하려면 자바스크립트에서는 this를 반드시 사용해야 함

  • 클래스 필드에 함수를 할당할 수 있는가?

: 함수도 값으로 평가될 수 있기 때문에 클래스 필드에 할당할 수 있음, 그러나 클래스 필드는 인스턴스 프로퍼티가 되기 때문에 클래스 필드에 할당한 함수는 인스턴스 메서드로서 기능하므로 바람직하지 않음

  • 클래스에서 private 필드를 어떻게 사용할 수 있는가?

: 클래스 필드 이름 앞에 #을 붙여서 사용할 수 있음
: private 필드로 선언하면 클래스 외부에서는 참조할 수 없는 프로퍼티가 됨
: 그러나 get, set과 같은 접근자 프로퍼티를 사용하면 private한 클래스 필드에 간접적으로 접근할 수 있음

  • 수퍼 클래스와 서브 클래스는 무엇인가?

: 수퍼 클래스는 상속을 해주는 클래스, 서브 클래스는 상속을 받는 클래스
: 상속 주체에 따라 수퍼 클래스와 서브 클래스로 구분하여 클래스의 상속에 따른 확장을 구현할 수 있음

  • super 키워드란 무엇인가?

: 클래스에서 사용할 때 함수 호출도, 식별자 참조도 가능한 독특한 키워드

  • super 키워드를 호출하는 경우 어떻게 사용할 수 있는가?

: 서브 클래스의 constructor 내부에서 super를 호출하면 수퍼 클래스의 constructor를 호출할 수 있음
: 서브 클래스의 constructor생략하더라도 반드시 호출

  • super 키워드를 참조하는 경우 어떻게 사용할 수 있는가?

: . 표기법으로 참조하면 수퍼 클래스의 메서드를 호출할 수 있음

  • super 를 참조할 때 어떤 방식으로 수퍼 클래스를 호출할 수 있는가?

: 메서드 안의 내부 슬롯 [[HomeObject]]를 바탕으로 메서드 자신이 바인딩한 객체를 참조할 수 있게 됨
: 다만 [[HomeObject]]ES6 메서드 축약 표현으로 정의된 함수만 가지고 있음, 그렇기 때문에 클래스 내부가 아니더라도 ES6의 메서드 축약 표현은 모두 super 키워드를 참조하여 사용할 수 있음

  • 서브 클래스의 constructor에서 super를 반드시 호출해야 하는 이유는 무엇인가?

: super를 호출하지 않으면 애초에 인스턴스가 생성되지 않기 때문에 class를 사용하는 목적에 위배

  • extends 키워드는 어떤 역할을 하는가?

: 프로토타입뿐만 아니라 클래스끼리도 프로토타입 체인을 연결시켜 줌

  • 클래스를 상속하여 확장하는 경우 인스턴스는 어떻게 생성되는가?

: extends로 연결한 서브 클래스를 new 연산자로 호출하면 서브 클래스의 constructor 내부의 super를 통해 수퍼 클래스의 constructor를 호출하여 인스턴스를 생성하고 초기화 과정을 수행함

  • 자바스크립트 엔진은 수퍼 클래스와 서브 클래스를 어떻게 구분하는가?

: 내부 슬롯 [[ConstructofKind]]의 값base로 설정되면 수퍼 클래스, 값이 derived로 설정되면 서브 클래스로 판단함

profile
𝙸'𝚖 𝚊 𝚍𝚎𝚟𝚎𝚕𝚘𝚙𝚎𝚛 𝚝𝚛𝚢𝚒𝚗𝚐 𝚝𝚘 𝚜𝚝𝚞𝚍𝚢 𝚊𝚕𝚠𝚊𝚢𝚜. 🤔

0개의 댓글