JavaScript
13. JavaScript가 다른 언어와 다른 특징 3가지를 서술하세요.
- JavaScript는 먼저 인터프리터 기반 언어입니다. 실행 전에 전체 코드를 컴파일하지 않고, 브라우저나 Node.js엔진이 코드를 한줄씩 해석하며 즉시 실행합니다. 두 번째는 동적 타이핑 언어입니다. 변수의 자료형을 미리 지정하지 않고, 실행 시점에 값에 따라 타입이 결정됩니다. 마지막은 싱글 스레드 언어입니다. JavaScript는 싱글 스레드 언어이지만, 이벤트 루프와 비동기처리 메커니즘을 통해 동시에 여러 작업이 수행되는 것처럼 동작합니다.
14. JavaScript에서 클로저란 무엇이고 언제 사용하나요?
- JavaScript에서 클로저는 함수가 선언될 때의 스코프(환경)를 기억하고, 그 스코프 밖에서 해당 변수에 접근할 수 있게 하는 기능을 말합니다. 즉, 함수가 실행이 끝나서 스코프가 사라진 뒤에도 내부 함수가 외부 함수의 변수에 계속 접근할 수 있는 현상입니다. 클로저는 주로 상태를 은닉하거나 유지해야 할 때, 그리고 함수형 프로그래밍 스타일로 변수를 캡슐화할 때 사용됩니다.
15. 프로토타입에 대해 설명해주세요.
- JavaScript에서 프로토타입은 객체 간의 상속을 구현하기 위한 메커니즘입니다. 모든 객체는 내부적으로 프로토타입이라는 숨겨진 프로퍼티를 가지고 있고, 이는 자신의 부모 역할을 하는 프로토타입 객체를 참조합니다. 객체에서 특정 속성이나 메서드를 찾을 때, 자신에게 없으면 프로토타입 체인을 따라 상위 객체에서 탐색할 수 있습니다.
16. 프로토타입과 상속 구조는 어떻게 되나요?
- JavaScript에서 객체는 생성될 때
[[Prototype]]을 통해 상위 객체와 연결되며, 이를 프로토타입 기반 상속이라고 합니다.
예를 들어 생성자 함수로 객체를 만들면, 그 인스턴스의 [[Prototype]]은 Constructor.prototype을 참조합니다. 해당 prototype에는 인스턴스들이 공유하는 메서드와 속성이 정의됩니다.
객체에서 프로퍼티를 조회할 때, 자신에게 없으면 prototype을 따라 상위 객체를 탐색하는데, 이를 프로토타입 체인이라고 합니다. 최종적으로 Object.prototype까지 올라가며, 그곳에도 없으면 undefined를 반환합니다.
17. 깊은 복사와 얕은 복사의 차이점은 무엇인가요?
- 얕은 복사는 객체의 1차 속성까지만 복사하고, 내부에 있는 중첩 객체는 참조를 그대로 복사합니다. 그래서 복사본을 수정하면 원본에도 영향을 줄 수 있습니다. 반면 깊은 복사는 중첩된 객체까지 완전히 새로운 메모리 공간에 복사해서 복사본과 원본이 서로 독립적으로 존재합니다. 예를 들어 spread 연산자나 Object.assign은 얕은 복사, structuredClone이나 JSON.parse(JSON.stringify)는 깊은 복사에 해당합니다.
18. Function 키워드로 사용하는 일반 함수와 화살표 함수의 차이점은 무엇인가요?
- 일반 함수와 화살표 함수는 문법뿐 아니라 동작 방식에서도 차이가 있습니다. 첫번째, 일반함수는 this가 동적으로 바인딩되지만, 화살표 함수는 선언된 위치의 상위 스코프 this를 그대로 사용합니다. 두번째는 일반함수는 arguments 객체를 가지지만 화살표 함수는 갖지 않습니다. 마지막으로 일반함수는 생성자 함수로 new 키워드를 사용할 수 있지만, 화살표 함수는 프로토타입이 없어 생성자로 사용할 수 없습니다.
19. 화살표 함수를 사용했을 때는 new 생성자를 사용해서 새로운 객체, 상속등을 할 수 없습니다. 그 이유에 대해서 설명해주세요.
- 화살표 함수는 new 키워드로 사용할 수 없습니다. 내부적으로 생성자 호출에 필요한 [[Construct]] 메서드가 없고, 프로토타입 프로퍼티도 존재하지 않기 때문에 상속 체인을 만들 수 없습니다. 또 화살표 함수는 lexical this, 즉 상위 스코프의 this를 그대로 사용하기 때문에 새로운 인스턴스용 this를 생성할 수도 없습니다. 그래서 주로 생성자보다는 콜백이나 짧은 함수 표현식에 사용됩니다.
20. 배열 메서드
- 배열 메서드는 원본을 변경하는 메서드와 변경하지 않는 메서드로 나눌 수 있습니다. 예를 들어 push, splice, sort는 원본 배열을 변경하고, map, filter, slice는 새로운 배열을 반환합니다. forEach는 단순 반복용이고, map은 변환용이며, reduce는 배열을 누적해 하나의 값으로 축약할 때 사용합니다.

