TypeScript 주니어 CS 기초 면접
새 면접Q. 스택(Stack)과 큐(Queue)의 차이점을 설명하고, TypeScript에서 각각을 구현할 때 배열의 어떤 메서드를 사용하면 좋을지 설명해주세요. 또한 각 자료구조가 실무에서 어떤 상황에 적합한지 예시를 들어주세요.
스택은 LIFO(Last In First Out) 방식으로 마지막에 들어간 데이터가 먼저 나오는 구조이며, push()와 pop()을 사용합니다. 큐는 FIFO(First In First Out) 방식으로 먼저 들어간 데이터가 먼저 나오는 구조이며, push()와 shift()를 사용합니다. 스택은 함수 호출 스택, 실행 취소(Undo) 기능에 적합하고, 큐는 작업 대기열, 메시지 처리 시스템에 적합합니다. TypeScript에서는 제네릭을 활용하여 타입 안전한 스택과 큐 클래스를 구현할 수 있습니다.
- • 스택은 LIFO, 큐는 FIFO 구조
- • 스택은 push/pop, 큐는 push/shift 사용
- • 스택은 함수 호출/Undo, 큐는 작업 대기열에 활용
- • 제네릭을 사용한 타입 안전한 구현 가능
배열 대신 연결 리스트(Linked List)로 큐를 구현하면 어떤 성능상 이점이 있을까요?
Q. 시간 복잡도 O(n)과 O(n²)의 차이를 설명하고, 배열에서 중복된 요소를 찾는 문제를 각각의 시간 복잡도로 해결하는 방법을 비교해주세요. TypeScript에서 Set을 활용하면 어떤 이점이 있나요?
O(n)은 입력 크기에 비례하여 시간이 증가하고, O(n²)은 입력 크기의 제곱에 비례하여 증가합니다. 중복 요소를 찾을 때 이중 for문을 사용하면 O(n²)이 되지만, Set을 사용하여 이미 본 요소를 저장하고 확인하면 O(n)으로 개선할 수 있습니다. Set의 has() 메서드는 O(1) 시간 복잡도를 가지므로 전체 순회 중 조회가 상수 시간에 이루어집니다. TypeScript에서는 Set의 제네릭 타입을 지정하여 타입 안전성을 보장할 수 있습니다.
- • O(n)은 선형, O(n²)은 이차 시간 복잡도
- • 이중 반복문은 O(n²), Set 활용은 O(n)
- • Set의 has() 메서드는 O(1) 조회 성능
- • 대용량 데이터에서 시간 복잡도 차이가 크게 나타남
Map과 Object를 조회 성능 측면에서 비교하면 어떤 차이가 있으며, 언제 Map을 사용하는 것이 유리한가요?
Q. HTTP 상태 코드 2xx, 4xx, 5xx의 의미를 설명하고, TypeScript로 API 클라이언트를 작성할 때 각 상태 코드를 어떻게 처리해야 하는지 설명해주세요. 특히 401과 403의 차이점은 무엇인가요?
2xx는 요청 성공, 4xx는 클라이언트 오류, 5xx는 서버 오류를 나타냅니다. 401은 인증되지 않음(Unauthorized)으로 로그인이 필요한 상태이고, 403은 권한 없음(Forbidden)으로 인증은 되었지만 해당 리소스에 접근 권한이 없는 상태입니다. TypeScript에서는 각 상태 코드별로 다른 에러 타입을 정의하고, 401은 로그인 페이지로 리다이렉트, 403은 권한 없음 메시지 표시, 5xx는 재시도 로직을 구현하는 것이 일반적입니다.
- • 2xx 성공, 4xx 클라이언트 오류, 5xx 서버 오류
- • 401은 인증 필요, 403은 권한 부족
- • 상태 코드별로 다른 에러 처리 전략 필요
- • 커스텀 에러 클래스로 타입 안전한 처리 가능
네트워크 요청이 실패했을 때 자동으로 재시도하는 로직을 구현한다면, 어떤 상태 코드에 대해서만 재시도를 해야 할까요?
Q. 데이터베이스 인덱스(Index)란 무엇이며, 인덱스를 생성하면 어떤 장점과 단점이 있나요? 특히 WHERE 절에서 자주 사용되는 컬럼과 INSERT가 빈번한 테이블에서 인덱스 사용 시 고려해야 할 점을 설명해주세요.
인덱스는 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조로, 책의 색인과 같은 역할을 합니다. 장점은 SELECT 쿼리의 조회 성능이 크게 향상되고, WHERE, ORDER BY, JOIN 연산이 빨라진다는 점입니다. 단점은 인덱스를 저장할 추가 공간이 필요하고, INSERT, UPDATE, DELETE 시 인덱스도 함께 수정되어 쓰기 성능이 저하된다는 점입니다. INSERT가 빈번한 테이블에서는 인덱스를 최소화하고, 꼭 필요한 조회 컬럼에만 선택적으로 생성해야 합니다.
- • 인덱스는 검색 속도 향상을 위한 자료구조
- • 조회 성능은 향상되지만 쓰기 성능은 저하
- • 추가 저장 공간 필요
- • 자주 조회되는 컬럼에 선택적으로 생성
복합 인덱스(Composite Index)는 무엇이며, 컬럼의 순서가 쿼리 성능에 어떤 영향을 미치나요?
Q. 프로세스(Process)와 스레드(Thread)의 차이점을 설명하고, Node.js가 싱글 스레드 기반임에도 불구하고 비동기 I/O 작업을 효율적으로 처리할 수 있는 이유를 설명해주세요. TypeScript로 CPU 집약적 작업을 처리할 때는 어떤 방법을 사용해야 하나요?
프로세스는 독립적인 메모리 공간을 가진 실행 단위이고, 스레드는 같은 프로세스 내에서 메모리를 공유하는 실행 단위입니다. Node.js는 메인 스레드는 하나지만, 이벤트 루프와 libuv의 스레드 풀을 활용하여 파일 I/O, 네트워크 요청 같은 비동기 작업을 백그라운드에서 처리합니다. 메인 스레드는 이벤트 루프를 통해 콜백만 처리하므로 블로킹되지 않습니다. CPU 집약적 작업은 Worker Threads를 사용하거나, 별도의 프로세스로 분리하여 처리해야 메인 스레드가 블로킹되지 않습니다.
- • 프로세스는 독립 메모리, 스레드는 메모리 공유
- • Node.js는 이벤트 루프와 스레드 풀로 비동기 처리
- • I/O 작업은 효율적이지만 CPU 집약 작업은 블로킹 발생
- • Worker Threads로 CPU 집약 작업 분리 가능
이벤트 루프의 각 단계(phases)는 어떻게 구성되어 있으며, setTimeout과 setImmediate의 실행 순서는 어떻게 결정되나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!