호이스팅은 var, let, const, function, class 키워드 등을 사용해서 선언하는 모든 식별자(변수, 함수, 클래스 등)이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징입니다.
우선 let,const와 var의 호이스팅 방식의 차이를 봐야합니다.
var의 경우 선언 단계와 함께 undefined로 초기화되므로 초기화 코드를 만나기 전부터 참조가 가능합니다.
반면에, let, const로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 진행됩니다. 즉, 스코프에 변수를 등록하지만, 초기화 단계는 변수 선언문 코드에 도달했을때 이루어지기 때문에 초기화 이전에 변수에 접근하려고 하면 참조 에러(Reference Error)가 발생합니다.
따라서 스코프의 시작 지점부터 초기화 시작 지점까지는 변수를 참조할 수 없는데, 이를 Temporal Dead Zone이라고 합니다.
따라서, let과 const는 호이스팅이 되기는 하지만 초기화가 이루어지지 않은 상태 (Uninitialized)에서 호이스팅이 되기 때문에 초기화 단계를 만나기 전에는 참조할 수가 없으며 일시적 사각지대 (TDZ)가 생기는 것입니다.
*웹 인터랙션이 뭐죠? 라는 꼬리 질문이 들어올 수 있습니다.
웹 인터랙션이란?
인터랙션은 정적인 화면이 아니라 움직임이 있는 있는 화면 및 액션 입니다.
예를 들어 화면에 있는 사물들을 터치하거나 기울이면 화면이 바뀌거나 안에 있는 사물들이 즉각 반응을 합니다. 그리고 언어도 선택할 수 있어서 다른 나라의 언어도 함께 배울 수 있고 단어는 물론 음성까지도 들으면서 텍스트를 읽을 수 있습니다. 화면에 강아지를 터치하면 멍멍대며, 강아지의 소리를 들을 수 있거나, 글에서 볼 수 있는 내용들이 그림으로 변형되어 화면에 펼쳐지며 이 화면에 있는 사물들이나 배경들을 터치해서 즉각 반응을 느낄 수 있는 것 등 다양한 예시가 있습니다.
즉 웹 상에서 움직임이 있거나 유저와 상호 작용을 할 수 있는 화면 및 액션을 웹 인터랙션이라고 합니다.
*왜 가장 상단에 위치할 수 있죠? 라는 꼬리 질문이 들어올 수 있습니다.
스택이라는 자료구조가 후입선출이라는 구조를 가지고 있기 때문에 가능한 일입니다.
두 개의 .js 파일에서 같은 변수를 사용하고 있어서, 변수 간 충돌이 일어났습니다.
딱 한 번 불러오는 프레임워크 코드가 8MB라서, 인터넷 속도가 느린 국가의 모바일 환경에서 사용자가 불편을 호소합니다.
번들 파일 사이즈를 줄이기 위해서 파일의 공백을 모두 지웠는데, 가독성이 너무 떨어져서 코딩하기기 어렵습니다. 결국 그대로 공백을 되돌려서 코딩합니다.
배포 코드가 너무 읽기 쉬워 개발을 할 줄 아는 사용자가 프론트엔드 애플리케이션을 임의로 조작하여 피해가 발생했습니다.
등의 어려움이 생길 수 있기 때문에 번들링은 꼭 필요합니다.
//이런 식으로 뒤에 extends Component를 확장한다고 명시해야만 class Component를 사용할 수 있습니다.
class Counter extends Component {
...
}
그러나 Function Component는 순수 함수이기 때문에 이러한 확장 과정을 거치지 않고도 컴포넌트를 만들 수 있습니다.//순수 함수이기 때문에 확장 과정을 거치지 않고도 컴포넌트를 만들 수 있습니다.
function Counter () {
...
}
또한 Class Component는 React 수명 주기 메서드(ex. componentDidMount)를 사용해 React Life Cycle을 세밀하게 조작할 수 있고, Function Component는 React 수명 주기 메서드는 사용할 수 없는 대신 React Hook을 사용하여 상태 값을 사용하거나 최적화할 수 있는 기능들을 보완했습니다.Class Component와 Function Component를 비교해둔 게시물이 GeeksforGeeks에 존재합니다.
한 번 확인해보시고 자신만의 언어로 바꿔보세요!
리액트 함수의 최상위에서만 호출해야 합니다. 반복문, 조건문, 중첩된 함수 내에서 Hook을 실행하면 예상한 대로 동작하지 않을 우려가 있습니다.
오직 리액트 함수 내에서만 사용되어야 합니다. 리액트 함수형 컴포넌트나 커스텀 Hook이 아닌 다른 일반 JavaScript 함수 안에서 호출해서는 안 됩니다.
애초에 Hook은 React의 함수 컴포넌트 내에서 사용되도록 만들어진 메소드이기 때문에 근본적으로 일반 JavaScript 함수 내에서는 정상적으로 돌아가지 않습니다. 따라서 이 규칙 또한 반드시 준수해야 하는 규칙입니다.
해당 질문에 답을 하면 바로 이어서 어떻게 동작하는지 설명해달라고 할 수 있습니다.
위의 질문의 대답을 하면 됩니다.
그러면 어떤 방식으로 가비지 컬렉션이 일어나나요? 라고 물어볼 수 있습니다.
mark and sweep 알고리즘 방식에 의해 가비지 컬렉션이 일어난다고 설명하면 됩니다. 객체에 in-use flag를 두고, 사이클마다 메모리 관리자가 모든 객체를 추적해서 사용 중인지 아닌지를 표시(mark)합니다. 그 후 표시되지 않은 객체를 삭제(sweep)하는 단계를 통해 메모리를 해제하는 방식을 mark and sweep 알고리즘이라고 합니다.
이진 탐색 트리에 대해 질문이 들어올 수 있습니다.
이진 탐색 트리란 이진 탐색(binary search)과 연결 리스트(linked list)를 결합한 이진트리를 말합니다. 이진 탐색의 효율적인 탐색 능력을 유지하면서도, 빈번한 자료 입력과 삭제를 가능하게끔 고안됐습니다.