JavaScript Quiz - 데이터 타입, Promise, async/await
1. JavaSctipt는 무슨 언어인가요?
- 웹 브라우저에서 동작하는 언어
- 인터프리터 언어(interpreter language)
- 기계어로 컴파일하지 않고 즉시 실행되는 프로그래밍 언어
- 멀티패러다임 프로그래밍 언어
- 명령형, 함수형, 프로토타입 기반의 객체 지향 프로그래밍을 지원하는 언어
- 동적 타이핑 언어
- 싱글 스레드 언어
1.1 웹 브라우저에서 동작하는 다른 언어는 뭐가 있을까요?
1.2 컴파일러 언어와 인터프리터 언어의 차이에 대해 설명해주세요.
- 컴파일러 언어는 컴파일 타임에 소스 코드 전체를 기계어로 변환한 후 실행하는 반면에, 인터프러터 언어는 런타임에 한줄씩 바이트코드로 변환한 후 실행합니다.
- 컴파일러 언어는 컴파일 단계와 실행 단계가 분리되어 있어서 실행 속도가 빠른 반면에, 인터프리터 언어는 인터프리트 단계와 실행 단계가 분리되어 있지 않아서 실행 속도가 느립니다.
1.3 프로토타입 기반 객체 지향 언어에 대해 설명해주세요.
- 프로토타입 체인 상에 존재한다면, 프로토타입을 기반으로 상속 받아서 속성과 메서드를 사용할 수 있는 언어입니다.
1.4 동적 타이핑에 대해 설명해주세요.
- 런타임에 값의 타입이 결정되는 것을 말합니다.
2. 변수 선언, 초기화, 할당의 차이점에 대해 설명해주세요.
- 변수 선언은 런타임 이전에 실행되지만, 값의 할당은 런타임에 실행됩니다. var로 선언된 변수는 변수 선언 즉시 초기화하는 반면에, let으로 선언된 변수는 선언문 실행될 때 초기화됩니다.
2.1 변수 호이스팅에 대해 설명해주세요.
- 변수 선언문이 코드의 선두로 끌어올려진 것처럼 동작하는 특징을 말합니다. 이렇게 동작하는 이유는 변수 선언이 런타임 이전에 먼저 실행되기 때문입니다.
3. 데이터 타입에 대해 설명해주세요.
- 데이터 타입에는 원시 타입과 참조 타입이 있습니다.
- 원시 타입에는 null, undefined, boolean, number, string, symbol이 있습니다.
- 참조 타입에는 object, array, function 등이 있습니다.
3.1 원시값과 참조값의 차이에 대해 설명해주세요.
- 원시값은 변경 불가능한 값이고, 참조값은 변경 가능한 값입니다. 원시값을 갖는 변수의 값을 변경하려면 재할당을 해야합니다. 반면에 참조값을 갖는 변수는 재할당 없이 속성을 변경할 수 있습니다.
3.2 undefined와 null의 차이에 대해 설명해주세요.
- undefined는 JavaScript 엔진이 변수를 초기화할 때 사용하는 값이고, null은 변수에 값이 없다는 것을 명시할 때 사용하는 값입니다.
4. 생성자 함수에 대해 설명해주세요.
- 생성자 함수는 new 연산자와 함께 호출하여 인스턴스를 생성하는 함수입니다. 인스턴스는 생성자 함수에 의해 생성된 객체를 말합니다.
5. this에 대해 설명해주세요.
- this는 자신이 속한 객체나 자신이 생성한 인스턴스를 참조하는 자기참조변수입니다.
5.1 this 바인딩이 무엇이고 함수 호출 방식에 따라 어떻게 달라지는지 설명해주세요.
- this 바인딩은 this와 this가 가리키는 객체를 연결하는 것입니다.
- 일반 함수를 호출할 때 this는 전역 객체를 가리키고, 메서드를 호출할 때 this는 메서드를 호출한 객체를 가리킵니다. 그리고 생성자 함수를 호출할 때 this는 생성자 함수가 생성할 인스턴스를 가리킵니다.
5.2 call, apply, bind에 대해 설명해주세요.
- apply, call, bind 모두 함수 프로토타입의 메서드입니다. 모두 첫 번째 인자로 this가 가리킬 객체를 받습니다.
- apply와 call 메서드는 실행할 때 함수를 호출하는 반면에, bind 메서드는 실행할 때 첫 번째 인자로 this 바인딩된 함수를 반환합니다.
- apply 메서드는 나머지 인수를 배열 형태로 받는 반면에, call 메서드는 나머지 인수를 각각 받습니다.
6. 콜백 함수에 대해 설명해주세요.
- 콜백 함수는 다른 함수에 인수로 전달되는 함수를 말합니다.
6.1 콜백 지옥에 대해 설명해주세요.
- 비동기 프로그래밍시 발생하는 문제로 콜백 함수 호출이 중첩되어 복잡도가 높아지는 현상을 말합니다.
6.2 콜백 지옥을 해결하는 방법을 설명해주세요.
- promise와 후속 처리 메서드 then, catch, finally를 사용하여 콜백 지옥을 해결할 수 있습니다.
- then, catch, finally 메서드는 언제나 프로미스를 반환하므로 연속적으로 호출할 수 있습니다.
- async, await를 통해서 콜백 지옥을 해결할 수 있습니다.
- asnyc, await를 사용하면 프로미스의 후속 처리 메서드 없이 동기 처럼 프로미스가 처리 결과를 반환하도록 할 수 있습니다.
7. Promise에 대해 설명해주세요.
- 프로미스는 비동기 처리 상태와 처리 결과를 관리하는 객체입니다.
7.1 Promise.all()에 대해서 설명해주세요.
- Promise.all 메서드는 여러 개의 비동기 처리를 모두 병렬로 처리할 때 사용합니다. all 메서드는 프로미스를 요소로 갖는 배열을 인수로 받고, 전달 받은 프로미스가 모두 fulfulled 상태가 되면 처리 결과를 차례대로 배열에 저장해 새로운 프로미스를 반환합니다. 인수로 받은 배열의 프로미스가 하나라도 rejected 상태가 되면 나머지 프로미스가 fulfilled 상태가 되는 것을 기다리지 않고 즉시 종료합니다.
7.2 Promise chaining에 대해 설명해주세요.
- 프로미스의 후속 처리 메서드 then, catch, finally는 언제나 프로미스를 반환하므로 연속해서 호출할 수 있습니다. 이를 프로미스 체이닝이라고 합니다.
8. Promise와 Callback 패턴을 비교 설명해주세요.
- 콜백 함수로 비동기 처리를 할 경우, 후속 처리를 비동기 함수 내부에서 수행해야 되서 콜백 함수 호출이 중첩됩니다. 반면에 프로미스는 후속 처리 메서드가 후속 처리를 해줍니다. 프로미스의 후속 처리 메서드는 언제나 프로미스를 반환하기 때문에 연속해서 호출할 수 있어서 콜백 지옥을 피할 수 있습니다.
- 콜백 함수로 비동기 처리를 할 때 에러 처리를 할 수 없는 반면에, 프로미스는 후속 처리 메서드 catch가 에러 처리를 해줍니다.
9. async, await이 무엇인지 어떻게 사용하는지 설명해주세요.
- 함수에 async 키워드를 붙이면, 함수가 항상 프로미스를 반환합니다. 프로미스 앞에 await 키워드를 붙이면, 프로미스가 settled 상태가 될 때까지 기다렸다가 처리한 결과값을 얻습니다.
- async, await는 프로미스의 후속 처리 메서드 없이 동기 처럼 프로미스가 처리 결과를 반환하고자 할 때 사용합니다.
9.1 promise와 async, await의 차이를 설명해주세요.
- promise는 후속처리 메서드 catch를 사용하여 에러 처리하는 반면에, async, await는 try...catch 문을 사용하여 에러 처리합니다.
- async, await는 비동기 코드를 동기 코드처럼 읽을 수 있게 해주기 때문에 가독성이 좋습니다.
참고