Go 주니어 CS 기초 기술면접

Go 주니어 (1~3년) CS 기초 5문항 조회수 96 · 2026-06-26 (금) 19:10:47
1 자료구조
Medium

Q. 스택(Stack)과 큐(Queue)의 차이점을 설명하고, Go에서 각각을 어떻게 구현할 수 있는지 설명해주세요. 슬라이스를 사용한다면 어떤 연산들을 조합해야 하나요?

A. 모범답안

스택은 LIFO(Last In First Out) 구조로 마지막에 삽입된 요소가 먼저 제거되며, 큐는 FIFO(First In First Out) 구조로 먼저 삽입된 요소가 먼저 제거됩니다. Go에서 스택은 슬라이스에 append로 push하고 마지막 요소를 제거하는 방식으로 구현할 수 있습니다. 큐는 슬라이스에 append로 enqueue하고 첫 번째 요소를 제거한 후 슬라이싱(slice[1:])으로 dequeue할 수 있지만, 이는 O(n) 복잡도를 가지므 실무에서는 container/list 패키지의 이중 연결 리스트를 사용하는 것이 더 효율적입니다.

핵심 포인트
  • • 스택은 LIFO, 큐는 FIFO 구조
  • • 스택은 슬라이스로 효율적 구현 가능 (append와 슬라이싱)
  • • 큐는 슬라이스보다 container/list가 더 효율적
Follow-up 질문

우선순위 큐(Priority Queue)가 필요한 상황이라면 Go에서 어떻게 구현하시겠습니까? container/heap 패키지의 사용법을 설명해주세요.

2 알고리즘
Easy

Q. 이진 탐색(Binary Search) 알고리즘의 동작 원리와 시간복잡도를 설명하고, 이 알고리즘을 사용하기 위한 전제 조건은 무엇인지 말씀해주세요.

A. 모범답안

이진 탐색은 정렬된 배열에서 중간 값과 찾고자 하는 값을 비교하여 탐색 범위를 절반씩 줄여나가는 알고리즘입니다. 시간복잡도는 O(log n)으로 선형 탐색의 O(n)보다 훨씬 효율적입니다. 반드시 배열이 정렬되어 있어야 하며, 인덱스를 통한 랜덤 액세스가 가능해야 합니다. 찾는 값이 중간 값보다 작으면 왼쪽 절반을, 크면 오른쪽 절반을 탐색하는 방식으로 재귀적 또는 반복적으로 구현할 수 있습니다.

핵심 포인트
  • • 정렬된 배열에서 중간 값 비교로 탐색 범위를 절반씩 축소
  • • 시간복잡도 O(log n)으로 매우 효율적
  • • 반드시 정렬된 데이터가 전제 조건
Follow-up 질문

Go의 sort 패키지에서 제공하는 Search 함수는 어떻게 사용하며, 직접 이진 탐색을 구현하는 것과 비교했을 때 어떤 장점이 있나요?

3 네트워크
Medium

Q. TCP와 UDP의 차이점을 설명하고, 각각 어떤 상황에서 사용하는 것이 적합한지 실제 애플리케이션 예시와 함께 설명해주세요.

A. 모범답안

TCP는 연결 지향 프로토콜로 3-way handshake를 통해 연결을 수립하고, 데이터 전송의 신뢰성을 보장하며 순서를 유지합니다. UDP는 비연결형 프로토콜로 연결 수립 과정 없이 데이터를 전송하며, 신뢰성은 보장하지 않지만 속도가 빠릅니다. TCP는 HTTP, 파일 전송, 이메일 등 데이터 정확성이 중요한 경우에 사용하고, UDP는 실시간 스트리밍, 온라인 게임, DNS 조회 등 속도가 중요하고 일부 데이터 손실이 허용되는 경우에 사용합니다. Go에서는 net 패키지로 둘 다 구현할 수 있습니다.

핵심 포인트
  • • TCP는 연결 지향, 신뢰성 보장, 순서 유지
  • • UDP는 비연결형, 빠른 속도, 신뢰성 미보장
  • • TCP는 정확성 중요 시, UDP는 실시간성 중요 시 사용
Follow-up 질문

Go에서 UDP 서버를 구현할 때 net.ListenPacket과 net.ListenUDP의 차이는 무엇이며, 패킷 손실을 감지하려면 애플리케이션 레벨에서 어떤 처리를 해야 하나요?

4 데이터베이스
Medium

Q. 데이터베이스 트랜잭션의 ACID 속성이 무엇인지 각각 설명하고, Go에서 database/sql 패키지를 사용할 때 트랜잭션을 어떻게 시작하고 커밋 또는 롤백하는지 설명해주세요.

A. 모범답안

ACID는 Atomicity(원자성, 모두 성공 또는 모두 실패), Consistency(일관성, 트랜잭션 전후 데이터 무결성 유지), Isolation(격리성, 동시 실행 트랜잭션 간 독립성), Durability(지속성, 커밋된 데이터는 영구 저장)를 의미합니다. Go에서는 db.Begin()으로 트랜잭션을 시작하여 sql.Tx 객체를 얻고, 이 객체로 쿼리를 실행한 후 tx.Commit()으로 커밋하거나 tx.Rollback()으로 롤백합니다. 에러 발생 시 반드시 롤백해야 하며, defer를 활용한 에러 처리 패턴이 권장됩니다.

핵심 포인트
  • • ACID: 원자성, 일관성, 격리성, 지속성
  • • db.Begin()으로 시작, tx.Commit() 또는 tx.Rollback()으로 종료
  • • 에러 발생 시 반드시 롤백 필요, defer 활용 권장
Follow-up 질문

여러 goroutine에서 동시에 같은 데이터를 수정하는 트랜잭션을 실행할 때 발생할 수 있는 문제는 무엇이며, 트랜잭션 격리 수준(Isolation Level)은 어떤 역할을 하나요?

5 운영체제
Easy

Q. 프로세스와 스레드의 차이점을 설명하고, 멀티프로세스와 멀티스레드 방식의 장단점을 비교해주세요. Go의 goroutine은 이 중 어디에 가까운가요?

A. 모범답안

프로세스는 독립적인 메모리 공간을 가진 실행 단위이며, 스레드는 프로세스 내에서 메모리를 공유하는 실행 단위입니다. 멀티프로세스는 안정성이 높지만(한 프로세스 오류가 다른 프로세스에 영향 없음) 메모리 사용량이 많고 통신 비용이 큽니다. 멀티스레드는 메모리를 공유하여 효율적이지만 동기화 문제와 한 스레드의 오류가 전체에 영향을 줄 수 있습니다. Go의 goroutine은 OS 스레드보다 훨씬 경량화된 사용자 레벨 스레드로, 적은 메모리로 수천 개를 동시에 실행할 수 있으며 Go 런타임이 스케줄링을 담당합니다.

핵심 포인트
  • • 프로세스는 독립 메모리, 스레드는 메모리 공유
  • • 멀티프로세스는 안정적이나 무겁고, 멀티스레드는 효율적이나 동기화 필요
  • • goroutine은 경량 스레드로 Go 런타임이 스케줄링
Follow-up 질문

Go의 GMP 모델(Goroutine, Machine, Processor)에 대해 들어보셨나요? goroutine이 OS 스레드에 어떻게 매핑되는지 설명해주세요.

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!