- Q: JavaScript의 클로저(closure)에 대해 설명해주실 수 있나요?
- A: 클로저는 내부 함수가 외부 함수의 접근할 수 있는 모든 변수를 참조하는 JavaScript의 특징입니다. 내부 함수는 자신이 생성될 때의 환경을 '기억'합니다. 이로 인해, 내부 함수는 외부 함수가 종료된 이후에도 외부 함수의 변수에 접근할 수 있습니다. 이것은 데이터 은닉성을 보장하고, 함수형 프로그래밍에서 많이 사용되는 패턴입니다.
- Q: JavaScript의 호이스팅(hoisting)에 대해 설명해주실 수 있나요?
- A: 호이스팅은 JavaScript 엔진이 변수와 함수 선언을 그들이 있는 코드에서 위치와 관계 없이 가장 먼저 처리하는 특성입니다. 이는 변수와 함수를 코드 상단으로 '끌어올리는' 것처럼 보입니다. 그러나, 할당은 실제로 그 위치에서 이루어지므로 초기화되지 않은 변수를 참조하면 undefined가 반환됩니다.
- Q: 이벤트 버블링과 이벤트 캡처링에 대해 설명해주세요.
- A: 이벤트 버블링과 이벤트 캡처링은 DOM 이벤트가 어떻게 전파되는지를 설명하는 개념입니다. 이벤트 버블링은 하위 요소에서 상위 요소로 이벤트가 전파되는 것을 의미하며, 이벤트 캡처링은 그 반대로 상위 요소에서 하위 요소로 이벤트가 전파되는 것을 의미합니다.
- Q: JavaScript의 'this' 키워드에 대해 설명해주실 수 있나요?
- A: 'this' 키워드는 JavaScript에서 컨텍스트를 참조하는 데 사용되며, 그 값은 실행 컨텍스트에 따라 달라집니다. 전역 스코프에서 'this'는 전역 객체를 참조하고, 함수 내부에서 'this'는 전역 객체를 참조합니다. 그러나 'new', 'call', 'apply', 'bind' 등을 사용하여 함수를 호출하면, 'this'는 해당 함수가 생성한 객체 또는 지정된 객체를 참조합니다.
- Q: 프로미스(Promise)와 콜백(callback)의 차이는 무엇인가요?
- A: 콜백과 프로미스는 JavaScript에서 비동기 연산을 다루는 두 가지 주요 패턴입니다. 콜백은 함수를 다른 함수의 인자로 전달하는 패턴입니다. 이 함수는 비동기 작업이 완료될 때 호출됩니다. 그러나 이는 "콜백 지옥"이라는 현상을 초래할 수 있습니다. 즉, 여러 개의 콜백이 중첩되어 코드의 가독성이 떨어지는 문제가 발생할 수 있습니다. 이에 반해, 프로미스는 비동기 작업의 최종 완료 또는 실패를 나타내는 객체입니다. 프로미스는 'then'과 'catch' 메서드를 제공하여 비동기 작업의 연속적인 처리를 가능하게 하고, 콜백 지옥 문제를 해결합니다. 또한, 'async/await' 구문을 이용해 더 명확하고 동기식 코드처럼 비동기 코드를 작성할 수 있습니다.
- Q: JavaScript의 프로토타입에 대해 설명해 주세요.
- A: JavaScript는 프로토타입 기반 언어입니다. 각각의 객체는 프로토타입이라는 다른 객체를 참조할 수 있습니다. 객체의 속성이 조회될 때, 해당 객체에 속성이 없으면 JavaScript는 자동으로 객체의 프로토타입에서 해당 속성을 찾습니다. 이런 체인이 계속되다가 결국 Object.prototype에 도달하고, 이 체인의 끝에 도달하면 null을 반환합니다. 이를 프로토타입 체인이라고 합니다.
- Q: JavaScript의 클래스 문법에 대해 설명해 주세요.
- A: JavaScript의 클래스 문법은 프로토타입 기반 상속을 보다 간결하고 이해하기 쉬운 문법으로 제공하는 문법적 설탕입니다. 클래스는 생성자 함수와 프로토타입 메서드를 한 곳에서 정의할 수 있게 해줍니다. 'class' 키워드를 사용하여 클래스를 정의하며, 'constructor' 함수는 객체를 초기화하는 데 사용됩니다. 또한, 클래스 내에서 정의된 메서드들은 모두 클래스의 프로토타입에 할당됩니다.
- Q: 클래스와 프로토타입의 차이점은 무엇인가요?
- A: JavaScript의 클래스는 프로토타입 기반 상속의 문법적 설탕으로 볼 수 있습니다. 클래스는 생성자 함수와 프로토타입 메서드를 한 곳에서 정의할 수 있게 해줍니다. 이로 인해 코드가 보다 명확하고 관리하기 쉬워집니다. 하지만, 클래스와 프로토타입의 핵심적인 차이점은 클래스는 상속을 정적으로 정의하며 프로토타입은 동적으로 변경될 수 있다는 것입니다.
- Q: 동기와 비동기 처리의 차이점은 무엇인가요?
- A: 동기 처리는 작업이 순차적으로 이루어지며, 한 작업이 완료되기를 기다린 후에 다음 작업이 수행됩니다. 반면에 비동기 처리는 특정 작업의 완료를 기다리지 않고 다음 작업을 진행합니다. 이는 I/O, 네트워크 요청, 타이머 등의 비동기 작업을 처리할 때 유용합니다. JavaScript는 싱글 스레드 언어이므로 비동기 처리를 통해 성능을 개선할 수 있습니다.
- Q: ES6의 새로운 기능에 대해 설명해주세요.
- A: ES6(ES2015)는 JavaScript의 주요 업데이트로 많은 새로운 기능을 도입했습니다. 예를 들면, let과 const 키워드는 블록 스코프 변수 선언을 가능하게 합니다. 화살표 함수는 함수 표현을 간결하게 만들며 'this' 키워드의 범위를 렉시컬로 바꿉니다. 프로미스는 비동기 작업을 더 효과적으로 처리할 수 있게 도와줍니다. 클래스 문법은 프로토타입 기반 상속을 더 쉽게 다룰 수 있도록 합니다. 또한, 모듈 import/export, 템플릿 리터럴, 디스트럭처링 등도 추가되었습니다.
- Q: TypeScript에 대해 어떻게 생각하시나요?
- A: TypeScript는 JavaScript의 슈퍼셋으로, 정적 타입 검사를 제공하는 언어입니다. TypeScript는 코드의 안정성과 가독성을 높이며, 대규모 프로젝트에서 코드를 더 쉽게 관리할 수 있게 도와줍니다. TypeScript를 사용하면 컴파일 시점에 타입 오류를 발견할 수 있어 런타임 오류를 줄일 수 있습니다. 또한, IDE의 자동 완성, 리팩토링 지원 등의 기능을 통해 개발자의 생산성을 향상시킵니다. 하지만, 타입스크립트는 배우고 적용하는데 시간이 필요하며, 런타임에서는 JavaScript와 동일하게 작동하므로 런타임 타입 검사를 대체하지는 못합니다.