자바스크립트의 모든 객체는 자신의 부모 역할을 담당하는 객체와 연결되어 있습니다. 이건 마치 객체 지향의 상속 개념과 같이 부모 객체의 프로퍼티나 메소드를 상속 받아서 사용할 수 있게 됩니다. 이러한 부모 객체를 프로토타입(Prototype) 객체 또는 줄여서 프로토타입이라고 합니다.
예컨대 하나의 배열을 만들면 new Array() 의 디폴트 생성자가 내부에서 동작해서 해당 Array.prototype이 해당 배열의 프로토타입이 되고, 우리는 그걸 통해 length나 map과 같은 배열과 관련된 내장함수를 사용할 수 있게 됩니다. 이런 내부 동작은 메모리 효율을 높여주는 장점으로 작용합니다.
이와 같이 어떤 객체에 특정 프로퍼티나 메서드에 접근할 때 특정 프로퍼티나 메서드가 없다면 내부 링크를 통해 상위 프로토타입으로 접근하는 행위를 프로토타입 체인이라고 하는데, 이런 과정에서 볼 수 있듯이 자바스크립트는 프로토타입 객체지향을 사용하고 있습니다.
꼬리 질문
상속과 코드의 재사용성을 구현하는 예시를 알 수 있을까요?
코드를 작성하실 때 상속이나 재사용성을 사용해본 경험이 있으실까요?
다른 언어에서의 OOP와 자바스크립트의 OOP의 차이가 있을까요?
프로토타입 기반 상속: JavaScript는 프로토타입 기반의 상속을 사용합니다. 이것은 객체 간에 상속 관계를 명시적으로 클래스로 정의하지 않고, 객체를 복제하거나 프로토타입 체인을 통해 상속을 구현합니다. 이는 일부 다른 OOP 언어에서 사용되는 클래스 기반 상속과는 다른 접근 방식입니다.
동적 타이핑: JavaScript는 동적 타이핑 언어로, 변수의 데이터 타입이 실행 시간에 결정됩니다. 이는 다른 언어에서 볼 수 있는 정적 타이핑과는 다른 접근 방식입니다. 변수의 타입을 명시적으로 선언하지 않아도 되며, 동일한 변수가 다른 타입의 값을 가질 수 있습니다.
함수가 일급 객체: JavaScript에서 함수는 일급 객체로 취급됩니다. 이것은 함수를 변수에 할당하거나 함수의 인자로 전달하거나 함수를 반환할 수 있다는 것을 의미합니다. 함수를 변수에 저장하고 실행하는 등의 유연한 작업이 가능합니다.
비동기 프로그래밍과 콜백: JavaScript는 비동기 프로그래밍 모델을 강조하며, 이를 위해 콜백 함수와 프로미스, async/await와 같은 기능을 제공합니다. 이는 다른 언어에서는 덜 강조되는 부분입니다.
싱글 스레드와 이벤트 루프: JavaScript는 기본적으로 싱글 스레드 모델을 사용하며, 비동기 작업을 효율적으로 처리하기 위해 이벤트 루프를 활용합니다. 이로 인해 동시성과 병렬성 관련 접근 방식이 다른 다중 스레드 언어와는 다릅니다.
전역 객체와 호이스팅: JavaScript에는 브라우저 환경에서는 window, Node.js 환경에서는 global로 알려진 전역 객체가 있습니다. 또한, 변수 및 함수 선언이 스코프의 맨 위로 끌어올려지는 호이스팅 메커니즘이 있습니다.
유연한 문법과 동적 객체: JavaScript는 유연한 문법을 가지며, 객체의 속성을 동적으로 추가하거나 삭제할 수 있습니다. 이로 인해 런타임 중에 객체의 구조를 변경할 수 있습니다.
new Array() 생성자로 배열을 생성하는 것과 빈 배열을 넣고 생성하는 것에 차이가 있을까요?
new Array() 생성자를 통해 배열을 생성하는 것과 일반적인 대괄호를 통해 배열을 생성하는 것에 속도적으로 큰 차이는 없으나, new Array()를 통한 생성은 직관적이지 않다는 게 가장 차이라고 볼 수 있습니다. 결국은 사람이 하는 일이기에 휴먼 에러를 줄이는 것도 중요한 일이라서 빈 배열을 통한 생성을 주로 하게 된 것이 아닌가 생각이 됩니다.