[ 2024.12.11 TIL ] 면접 카타(1)

박지영·2024년 12월 11일
0

Today I Learned

목록 보기
88/88

Javascript

var, let, const 에 대해 설명해주세요.

  • var - 함수 스코프, 재선언/재할당 가능, 호이스팅 시 undefined로 초기화

  • let - 블록 스코프, 재선언 불가/재할당 가능, TDZ 존재

  • const - 블록 스코프 재선언/재할당 불가, TDZ 존재

  • TDZ(Temporal Dead Zone) - 스코프의 시작 지점부터 초기화 시작 지점까지의 구간
    TDZ 발생 이유 - var는 선언과 초기화를 동시에 진행 / let,const는 3단계로 진행

Promise란 무엇인지 설명해주세요.

  • 비동기 작업의 최종 완료/실패를 나타내는 객체

  • Promise를 사용하면 비동기 메서드에서 마치 동기 메서드처럼 값을 반환할 수 있다

  • Pending(대기) / Fulfilled(이행) / Rejected(거부) 3가지 상태로 구분

  • then(a,b) - 이행된 경우의 a, 거부된 경우 b를 반환하는 콜백 함수

  • Promise.all() - 주어진 모든 프로미스가 이행하거나, 한 프로미스가 거부될 때까지 대기하는 새로운 프로미스를 반환

async/await 이란 무엇인지 설명해주세요.

  • Promise 체인을 사용하면 콜백 지옥과 같이 가독성이 훼손되고 에러가 발생한 지점을 알기 어렵기때문에 이를 보완하고 좀 더 쉽게 다루기 위한 생긴 문법.

  • async - async 함수는 항상 Promise를 반환

  • await - Promise의 상태가 변할 때까지 대기

Hoisting이란 무엇인지 설명해주세요.

  • 변수와 함수 선언이 코드의 최상단으로 끌어올려지는 현상

  • var는 호이스팅 시 undefined로 초기화됨

  • let/const는 TDZ로 인해 참조 에러 발생

  • 함수 선언문은 전체가 호이스팅 -> 정상 작동

Arrow Function 이란 무엇인지 설명해주세요.

  • function 키워드 대신 =>를 사용하는 함수 표현식

  • this 바인딩이 없음 (렉시컬 스코프의 this 사용)

  • 생성자 함수로 사용할 수 없음

  • arguments 객체를 가지지 않음

Express란 무엇이고 왜 필요하며 대안은 무엇이 있는지 설명해주세요.

  • Node.js 웹 애플리케이션 프레임워크이며, 미들웨어 기반으로 유연성이 높음

  • HTTP req/res를 단순화해 빠르게 API 서버를 구축할 수 있음

  • 미들웨어 함수는 req/res 사이클 도중에 목적에 맞게 처리를 하는 함수

  • 대안으로 NestJS 등이 존재

  • NestJS는 express 기반

깊은 복사와 얕은 복사의 차이는 무엇이고 JS에서 각각을 구현하는 방법은 어떻게 되는지 설명해주세요.

  • 깊은 복사 - 모든 객체를 재귀적으로 복사
    structuredClone() 사용으로 손쉽게 가능해짐 -> but 함수 등은 유실
    JSON.parse(JSON.stringify()) -> 느리고 함수 유실

  • 얕은 복사 - 1단계까지만 복사, 중첩 객체는 참조를 공유
    전개 연산자, Object.assign()

JWT에 대해 설명해주세요. 구체적으로 JWT를 어디서 처리하는지, 어떠한 방식으로 검증하는지, 재발급 방식과 주기는 어떻게 처리하는지, 다른 API 서비스 호출 시 어떻게 잡아서 인증 처리하는지 말씀해주세요.

  • 온라인 네트워크에서 정보를 안전하게 통신할 때 사용하는 인터넷 표준 토큰

  • header, payload, signature로 구성 -> stateless

  • HTTP 요청 헤더로 전달 -> 서버에서 JWT 검증 후 사용자 식별 및 요청 처리

  • req 헤더에서 추출 -> 시그니처 검증 -> 페이로드 확인

  • JWT는 Access Token, Refresh Token으로 관리 -> 클라는 AT가 만료되면 RT를 서버에 전달
    -> RT 검증 후 새 AT 발급 / AT 유효 기간 짧음, RT 유효 기간 김

Node.js는 single-threaded 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주세요.

  • nodejs는 Single-threaded지만, 이벤트 루프와 libUV를 통해 효과적으로 비동기 작업을 처리.

  • 비동기 작업은 콜백 큐를 통해 처리.

  • 싱글 스레드이기 때문에 CPU 집약적인 처리는 느리고 주의가 필요

  • 요청이 처리되는 동안 다른 요청도 같이 처리. 논블로킹

  • 작업이 완료될 때까지 무작정 대기하지 않고 콜백이나 Promise로 결과를 처리

Node.js의 이벤트 루프란 무엇이고 왜 필요하며 어떻게 작동하는지 아는 만큼 설명해주세요.

  • nodejs의 핵심 메커니즘으로 비동기 작업을 관리한다.

  • 호출 스택과 콜백 큐 등을 감시하다가 어디가 비어있고 어떤 것을 채워야할지 정하고 이를 수행한다.

Node.js의 libUV 라이브러리에 대해 설명해주세요.

  • nodejs의 비동기 I/O를 지원하는 C 라이브러리

  • 플랫폼 간 호환성 제공

  • 비동기 I/O 작업 처리

  • 스레드풀을 통해 CPU 집약적 작업과 블로킹 작업을 처리

  • I/O 루프와 스레드풀로 구성

  • 작업이 완료되면 이벤트 루프을 통해 콜백 실행

동기와 비동기의 차이, 블락킹과 논블락킹의 차이, 비동기와 논블락킹에 차이에 대해 설명해주세요.

  • 동기는 작업이 순차적으로 진행되는 것, 비동기는 작업이 병렬로 실행되는 것 -> 결과는 콜백이나 Promise로 처리

  • 블로킹은 호출이 완료될 때까지 대기, 논블로킹은 호출 후 즉시 반환 -> 작업은 백그라운드

  • 비동기는 작업의 실행 방식과 관련, 논블로킹은 호출의 반환 방식과 관련

알고리즘

BigO에 대해 설명해주세요.

  • 알고리즘의 성능을 분석할 때 사용되는 표기법

  • 입력 크기(n)에 따른 시간 복잡도와 공간 복잡도를 표현

  • 최악의 경우 실행 시간을 나타냄.

  • 알고리즘의 성능을 입력 크기에 따라 비교하기 쉽도록 수학적으로 표현.

다음의 정렬을 설명하고 본인이 가장 편한 언어를 사용하여 로직을 구현해주세요.

  • 선택 정렬(Selection Sort)
    배열에서 가장 작은 값을 선택하여 맨 앞 요소와 교체하는 과정을 반복.

    • 시간 복잡도: O(n²) (모든 경우)
    • 공간 복잡도: O(1) (제자리 정렬)
  • 버블 정렬(Bubble Sort)
    인접한 두 요소를 비교해 더 큰 값을 뒤로 보내는 작업을 반복.

    • 시간 복잡도: O(n²) (모든 경우)
    • 공간 복잡도: O(1)
  • 병합 정렬(Merge Sort)
    배열을 반으로 나누고 각각을 정렬한 뒤 병합.

    • 시간 복잡도: O(n log n) (모든 경우)
    • 공간 복잡도: O(n) (추가 메모리 필요)
  • 삽입 정렬(Insertion Sort)
    현재 요소를 적절한 위치에 삽입하는 방식으로 정렬.

    • 시간 복잡도: O(n²) (최악), O(n) (최선)
    • 공간 복잡도: O(1)
  • 퀵 정렬(Quick Sort)
    피벗을 기준으로 작은 값과 큰 값으로 분할하여 재귀적으로 정렬.

    • 시간 복잡도: O(n log n) (평균), O(n²) (최악)
    • 공간 복잡도: O(log n) (재귀 깊이에 따라 다름)
  • 힙 정렬(Heap Sort)
    최대 힙/최소 힙을 이용해 정렬.

    • 시간 복잡도: O(n log n) (모든 경우)
    • 공간 복잡도: O(1) (제자리 정렬)

DFS와 BFS의 차이를 말해주세요.

  • DFS - 깊이 우선 탐색. 한 경로를 끝까지 탐색

    • 보통 재귀, 스택 방식으로 구현.
    • 경로 찾기, 순열/조합 생성에 사용
    • 해가 없는 경로에 깊이 빠질 가능성 존재, 해가 최적이 아닐 수 있음
  • BFS - 넓이 우선 탐색. 동일 계층의 노드를 탐색

    • 보통 큐 방식으로 구현.
    • 최단 거리 탐색(그래프, 트리)에 사용
profile
신입 개발자

0개의 댓글