you__me 2025. 5. 11. 19:16

 

면접 대비 CS 공부하기

 

https://garden1500.tistory.com/11

 

IT 기술면접 이건 꼭 알고 가자. (면접 다수 기출, CS 면접, 1차 면접, CS 준비)

IT 기술 면접 다수 기출입니다. 질문 키워드 만 드릴테니 검색해서 따로 정리해주시길 바라겠습니다. 다른 곳에 정리할 때 질문 출처를 남겨주시면 감사하겠습니다. 1. HTTP 관련 질문 - HTTP, HTTPS(TL

garden1500.tistory.com

위 링크에서 질문 참고

 

 


1. HTTP 관련 질문

 

✅ HTTP vs HTTPS (TLS/SSL)

  • HTTP (HyperText Transfer Protocol): 클라이언트와 서버 간의 통신 규약. 기본적으로 비암호화.
  • HTTPS: HTTP + TLS(SSL) 암호화. TLS는 데이터를 암호화하여 도청/위조/변조를 방지. SSL은 현재 보안 취약으로 사용 x

✅ HTTP 1.1 / 2.0 / 3.0 차이

  • HTTP 1.1 : 기본. Keep-Alive, 파이프라이닝 지원. 직렬 처리 → HOL(Head-of-line) 문제 발생
  • HTTP 2.0 : 바이너리 프로토콜. 멀티플렉싱(동시 다중 전송). 헤더 압축. 서버 푸시 지원
  • HTTP 3.0 : UDP 기반의 QUIC 프로토콜. 지연시간 감소, 더 빠른 재전송 지원

✅ RESTful이란?

 

  • 자원(Resource), 행위(Method), URI로 구성된 HTTP 디자인 패턴
  • ex) GET /users/1, POST /posts
  • 상태 비저장성(Stateless), 일관된 인터페이스, 계층 구조, 캐시 처리 가능 등 특징
  • RESTful하지 않은 경우 : 행위(동사)가 URL에 포함, HTTP 메서드가 일관되지 않음, 자원의 계층 구조가 명확하지 않음 등

✅ 주요 HTTP 응답 코드

코드 의미
200 OK (성공)
201 Created (리소스 생성)
204 No Content (응답 없음)
301 Moved Permanently (영구 리디렉션)
302 Found (임시 리디렉션)
304 Not Modified (캐시 사용)
400 Bad Request (잘못된 요청)
401 Unauthorized (인증 필요)
403 Forbidden (접근 금지)
404 Not Found
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable

 

 

 

2. 웹 브라우저에 google.com을 입력하면 일어나는 과정

 

✅ 1단계. URL 입력 및 파싱

 

  • 사용자가 브라우저 주소창에 https://www.google.com 입력
  • 브라우저는 URL을 프로토콜, 호스트명, 경로, 쿼리 스트링 등으로 분해
    • 프로토콜(https), 호스트명(www.google.com), 경로/~

✅ 2단계. DNS 조회

  • 브라우저는 www.google.com의 IP 주소를 찾기 위해 DNS 질의 실행
  • 먼저 브라우저 캐시 → OS 캐시 → 라우터(hosts 파일 확인) → DNS 리졸버(로컬 네트워크의 DNS 서버) 질의 → 루트/도메인 네임 서버 순으로 조회
    • 리졸버 계층적 질의 : 루트 네임 서버 -> TLD 네임서버(.com, .org, .kr 등) -> 권한 있는 DNS 서버 -> IP 주소 반환
  • 최종적으로 IP 주소(예: 142.250.206.132)를 획득

✅ 3단계. TCP 연결 (3-way Handshake)

 

  • 클라이언트와 서버 간에 TCP 연결 수립
  • HTTP/3의 경우 UDP 기반 QUIC 사용

✅ 4단계. TLS 핸드셰이크 (HTTPS인 경우)

 

  • 보안 통신을 위한 TLS 핸드셰이크 수행
    • 클라이언트는 서버에게 공개키 기반 인증서 요청
    • 대칭키 암호화를 위한 세션 키 교환
  • 이 과정에서 서버 인증서 유효성 검사 및 암호 알고리즘 협상이 일어남

✅ 5단계. HTTP 요청 전송

  • TLS 암호화 하에 다음과 같은 HTTP 요청 전송
GET / HTTP/1.1
Host: www.google.com
User-Agent: ...

 

✅ 6단계. 서버 처리 및 HTTP 응답

  • 서버는 요청을 파싱하고 필요한 데이터를 조회한 뒤 HTTP 응답 반환
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: ...
...
<html>...</html>

 

 

 

 

✅ 7단계. 브라우저 렌더링

  • 브라우저는 받은 HTML을 기반으로 다음을 처리
  1. HTML 파싱 및 DOM 트리 생성
  2. CSS 파싱 및 렌더 트리 구성
  3. JS 파싱 및 실행
  4. 이미지, 글꼴, 스크립트 등의 리소스 추가 요청
  5. 최종적으로 화면에 페이지 렌더링

✅ 8단계. 캐싱 및 쿠키 저장

  • 응답 헤더에 따라 HTML, 이미지 등의 캐싱 여부 결정
  • 쿠키 저장 또는 세션 정보 관리 수행

 

3. OS의 프로세스와 스레드 

✅ 프로세스(Process)와 스레드(Thread)의 차이

항목  프로세스 (Process) 스레드 (Thread)
정의 실행 중인 프로그램의 인스턴스 프로세스 내에서 실행되는 최소 단위
독립성 독립적 메모리 공간 사용 같은 프로세스 내 다른 스레드들과 메모리 공유
메모리 구조 코드, 데이터, 힙, 스택 모두 별도 코드, 데이터, 힙은 공유 / 스택은 독립
비용 생성 및 전환 비용 큼 (context switching) 비용이 작음 (lightweight)
충돌 위험 낮음 (격리되어 있음) 높음 (공유 자원 접근 시 동기화 필요)
사용 예시 브라우저 창 여러 개 하나의 탭에서 여러 요청 처리, 채팅 UI + 네트워크 처리 병렬

 

✅ 멀티프로세스 vs 멀티스레드

  • 멀티프로세스
    • 독립된 프로세스를 여러 개 실행
    • 하나가 죽어도 다른 프로세스에 영향 없음
    • 메모리 사용량 많고 IPC(프로세스 간 통신) 필요
    • 예: Chrome 브라우저 (탭마다 다른 프로세스), 워드/엑셀/파워포인트 각각 실행
  • 멀티스레드
    • 하나의 프로세스 내 여러 스레드 동시 실행
    • 메모리 효율 좋고 빠름
    • 동기화 처리 어려움, 하나의 스레드가 죽으면 전체에 영향 가능
    • 예: 게임, 웹서버의 요청 처리, 워드 안에서 오타 검사, 그림 삽입, 저장을 동시에 진행

✅ PCB (Process Control Block)

  • 운영체제가 프로세스를 관리하기 위해 유지하는 제어 정보 구조체
    주요 내용:
    • PID (Process ID)
    • 프로세스 상태 (준비, 실행, 대기 등)
    • Program Counter (다음 실행 명령어 위치)
    • Register 상태
    • 메모리 할당 정보
    • 파일 입출력 정보
  • 스레드에도 TCB(Thread Control Block) 이 있으며, PCB보다 더 가볍고 간단함

✅ 핵심 요약

개념 키워드
프로세스 독립 실행 단위, 메모리 분리, PCB
스레드 경량 프로세스, 메모리 공유, TCB
멀티프로세스 안정성 ↑, 속도 ↓
멀티스레드 속도 ↑, 동기화 필수

 

 

4. DB 트랜잭션과 특성(ACID)

✅ 트랜잭션(Transaction)

  • 데이터베이스에서 하나의 논리적 작업 단위를 구성하는 일련의 작업
  • 예시: 은행 계좌 이체 → 두 작업은 반드시 모두 성공하거나, 모두 실패해야 함

✅ 트랜잭션의 4대 특성 (ACID)

특성 설명 예시
A - 원자성 (Atomicity) 모든 작업이 완전히 수행되거나, 전혀 수행되지 않아야 돈이 인출되었는데 입금이 실패하면 전체 작업 취소
C - 일관성 (Consistency) 트랜잭션 실행 전과 후에 DB 상태가 유효한 규칙을 유지해야 함 계좌 잔고 총합이 작업 전후 동일
I - 고립성 (Isolation) 동시에 실행되는 트랜잭션은 서로 영향을 주지 않아야 두 사람이 동시에 상품을 주문해도 재고 충돌 없음
D - 지속성 (Durability) 트랜잭션이 성공하면 그 결과는 영구적으로 반영되어야 함 전원 꺼져도 입금 기록은 DB에 저장됨

 

✅ 트랜잭션의 주요 명령어

 

  • BEGIN or START TRANSACTION : 트랜잭션 시작
  • COMMIT : 트랜잭션 정상 종료 및 반영
  • ROLLBACK : 문제 발생 시 모든 작업 취소
  • SAVEPOINT / ROLLBACK TO : 중간 지점 저장 및 복귀 (선택적)

✅ 예제 (SQL)

BEGIN;

UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;

COMMIT;

# 문제 발생 시
ROLLBACK;

 

 

✅ 예제 (MySQL)

START TRANSACTION;

-- A 계좌에서 1000원 차감
UPDATE accounts
SET balance = balance - 1000
WHERE id = 1;

-- B 계좌에 1000원 추가
UPDATE accounts
SET balance = balance + 1000
WHERE id = 2;

-- 모든 작업 성공 시 영구 반영
COMMIT;

-- 오류 감지 후 롤백
ROLLBACK;

 

✅ ACID의 중요성

  • 데이터 무결성 보장
  • 동시 사용자 환경에서 일관성 있게 처리
  • 복구와 오류 대응의 기본 단위

 

5. 데드락과 동기화 기법

 

✅ 데드락(Deadlock)

  • 둘 이상의 프로세스(또는 스레드)가 서로가 점유 중인 자원을 기다리며 무한 대기 상태에 빠지는 상황

✅ 데드락 발생 조건 (4가지 모두 만족할 때 발생)

조건 설명
상호 배제 (Mutual Exclusion) 자원은 하나의 프로세스만 사용할 수 있음
점유 대기 (Hold and Wait) 자원을 점유한 채, 다른 자원을 기다림
비선점 (No Preemption) 자원을 강제로 빼앗을 수 없음
순환 대기 (Circular Wait) 자원들이 순환적으로 서로 기다림

 

✅ 데드락 해결 방법

 

  • 예방: 조건 중 하나를 아예 만족하지 않도록 설계 (예: 순환 대기 금지)
  • 회피: Banker’s algorithm 등으로 위험 상태 진입 방지
  • 발견 및 복구: 데드락 감지 후 프로세스 강제 종료
  • 무시: 성능 우선, 데드락이 드물게 발생하는 경우 (Windows 대부분)

 

✅ 동기화 기법

 

1. 뮤텍스 (Mutex)

 

  • 하나의 스레드만 자원 접근 가능
  • 소유자만 잠금 해제 가능
import threading

lock = threading.Lock()

def critical_section():
    with lock:
        # 임계영역
        print(f"{threading.current_thread().name} is working")

threads = []
for i in range(5):
    t = threading.Thread(target=critical_section)
    threads.append(t)
    t.start()

for t in threads:
    t.join()

 

2. 세마포어 (Semaphore)

 

  • 정수값 기반 동기화 도구
  • 0 이상의 카운트, 여러 스레드 동시 접근 허용
  • P()(wait) / V()(signal) 연산으로 동작
  • 이진 세마포어는 뮤텍스처럼 사용
import threading
import time

sem = threading.Semaphore(2)  # 동시에 2개 스레드만 접근 가능

def task(i):
    with sem:
        print(f"Thread-{i} entered")
        time.sleep(1)
        print(f"Thread-{i} exiting")

for i in range(5):
    threading.Thread(target=task, args=(i,)).start()

 

3.모니터 (Monitor)

  • 언어/시스템 수준에서 제공하는 동기화 구조
  • 임계영역 + 조건 변수 포함
  • 자바의 synchronized, 파이썬의 threading.Lock()이 대표적인 구현
import threading

cond = threading.Condition()
queue = []

def producer():
    with cond:
        queue.append(1)
        print("Produced an item")
        cond.notify()  # 소비자에게 알림

def consumer():
    with cond:
        while not queue:
            cond.wait()  # 대기
        queue.pop()
        print("Consumed an item")

t1 = threading.Thread(target=consumer)
t2 = threading.Thread(target=producer)

t1.start()
t2.start()

t1.join()
t2.join()

 

4. 스핀락 (Spinlock)

 

  • 락이 해제될 때까지 계속 CPU를 소모하며 루프
  • 대기 시간이 짧을 때 효율적이지만, 긴 경우 CPU 낭비 큼
# 라이브러리에 없지만 CPU를 사용하며 락 상태를 체크(성능 손해가 크므로 사용 x)
import threading
import time

spinlock = False

def acquire_spinlock():
    global spinlock
    while True:
        if not spinlock:
            spinlock = True
            break
        time.sleep(0.001)  # busy wait

def release_spinlock():
    global spinlock
    spinlock = False

def critical_section():
    acquire_spinlock()
    print(f"{threading.current_thread().name} entered")
    time.sleep(0.1)
    release_spinlock()

for _ in range(5):
    threading.Thread(target=critical_section).start()

 

5. 어토믹 연산 (Atomic Operation)

  • 한 번에 끝나는 연산, 중간에 끼어들 수 없음
  • CPU 수준에서 락 없이 경량 동기화 가능
  • 예: atomic_increment, Compare-and-Swap (CAS)
from multiprocessing import Value, Process

def safe_increment(counter):
    for _ in range(100000):
        with counter.get_lock():
            counter.value += 1

counter = Value('i', 0)

p1 = Process(target=safe_increment, args=(counter,))
p2 = Process(target=safe_increment, args=(counter,))
p1.start()
p2.start()
p1.join()
p2.join()

print(counter.value)

 

✅ 요약

기법 특징 상황 Python 구현
Mutex 하나만 접근, 명시적 잠금 일반 임계영역 보호 threading.Lock()
Semaphore 제한된 개수 접근 리소스 풀 관리 threading.Semaphore(n)
Monitor 고수준 동기화 Java, Python 등 언어 제공 threading.Condition()
Spinlock 락 짧게 유지할 때 커널/드라이버, 저지연 시스템 사용자 정의 루프 구현
Atomic 락 없는 연산 성능 중요할 때, CAS 기반 동기화 multiprocessing.Value, GIL 영향

 

 

6. 언어 관련 지식

 

✅ Java vs C vs Python

비교 항목 Java C Python
실행 방식 컴파일 → JVM 실행 컴파일 → 바이너리 실행 인터프리터 즉시 실행
객체지향 지원 완전 지원 미지원 (함수/구조체 기반) 완전 지원
가상함수 기본 지원 (dynamic binding) 직접 구현 (함수 포인터) 기본 동적 바인딩
GC 있음 없음 있음
다형성 오버로딩 + 오버라이딩 불완전 오버라이딩
추상화 interface, abstract 없음 추상 클래스 (abc 모듈)

 

✅ 주요 개념 설명

 

1.객체지향 (Object-Oriented Programming, OOP)

  • 현실 세계를 추상화하여 객체 단위로 구조화하는 프로그래밍 패러다임
  • 구성 요소: 캡슐화, 상속, 다형성, 추상화

2. 캡슐화 (Encapsulation)

  • 데이터와 메서드를 하나의 클래스 안에 숨기고, 접근을 제한하는 기법
  • Java: private, protected, public 키워드
  • Python: _변수, __변수로 암묵적 제한

3. 상속 (Inheritance)

  • 기존 클래스를 확장하여 재사용성과 계층 구조를 만드는 기법
  • Java: class Dog extends Animal
  • Python: class Dog(Animal)

4. 다형성 (Polymorphism)

  • 동일한 인터페이스로 다른 동작을 수행할 수 있게 하는 특성
  • 오버라이딩(재정의): 부모 메서드를 자식이 다시 정의
  • 오버로딩(다중정의): 같은 이름, 다른 매개변수로 메서드 작성

5. 추상화 (Abstraction)

  • 공통된 개념을 일반화하고, 불필요한 세부사항은 숨김
  • Java: abstract class, interface
  • Python: abc 모듈의 ABC, @abstractmethod

6. 가상 함수 (Virtual Function) / 동적 바인딩

  • 컴파일 타임이 아닌 런타에 호출할 메서드를 결정하는 기법(객체의 실제 타입에 따라 실행되는 함수가 결정)
  • Java: 모든 메서드는 기본적으로 가상
  • C: 함수 포인터 + 구조체 조합으로 흉내 가능
  • Python: 기본적으로 모두 런타임에 동적으로 결정됨

7. JVM (Java Virtual Machine)

  • 자바 바이트코드를 플랫폼에 독립적으로 실행하는 가상 컴퓨터
  • 메모리 구조: Method Area, Heap, Stack, PC Register 등
  • 실행 단계: .java → .class → JVM → 실행

8. Garbage Collection (GC)

  • 사용하지 않는 메모리(객체)를 자동으로 해제하는 기능
  • Java: JVM GC (G1, ZGC 등)
  • Python: 참조 카운트 기반 + 순환 참조 탐지기 (gc 모듈을 사용해 세대 기반 GC를 수행)
  • C: GC 없음 (직접 할당/해제 필요 → malloc, free)

9. 절차지향 프로그래밍 (Procedural Programming)

  • 프로그램을 순차적인 명령어의 흐름으로 구성하는 방식
  • C 언어의 대표적 특징
  • 복잡한 상태 관리가 힘들고, 유지보수가 어려움

10. 인터프리터 vs 컴파일러

구분 인터프리터 컴파일러
작동 방식 한 줄씩 해석하며 실행 전체 코드를 한번에 번역
대표 언어 Python, JavaScript C, C++
장점 빠른 실행 시작 빠른 성능
단점 느린 실행 속도 빌드 시간 필요
  • Java는 바이트코드로 컴파일한 뒤, JVM에서 인터프리팅 또는 JIT 컴파일을 통해 실행되는 하이브리드 언어

11. 객체 지행 설계의 5대 원칙(SOLID)

원칙 이름 핵심 요약
S 단일 책임 원칙 (SRP) 하나의 클래스는 하나의 책임만 가져야 한다
O 개방-폐쇄 원칙 (OCP) 확장에는 열려 있고, 변경에는 닫혀 있어야 한다
L 리스코프 치환 원칙 (LSP) 자식 클래스는 부모 클래스의 역할을 대체할 수 있어야 한다
I 인터페이스 분리 원칙 (ISP) 클라이언트는 사용하지 않는 인터페이스에 의존하면 안 된다
D 의존 역전 원칙 (DIP) 고수준 모듈은 저수준 모듈에 의존하면 안 되고, 둘 다 추상에 의존해야 한다

 

 

7. TCP vs UDP

✅ TCP와 UDP란?

  • 전송 계층(Transport Layer)의 프로토콜로, IP 위에서 작동
  • TCP : 신뢰성 보장, 연결 지향
  • UDP : 빠름, 비연결형, 신뢰성 없음

✅ TCP의 특징 (Reliable)

  • 3-way Handshake로 연결 설정 (SYN, SYN-ACK, ACK)
  • 신뢰성 있는 데이터 전송: 손실/중복/순서 문제 해결
  • 흐름 제어 (Flow Control): 수신자 처리 속도에 맞춰 조절
  • 혼잡 제어 (Congestion Control): 네트워크 상태에 따라 전송 속도 조절
  • 패킷 순서 보장: 순서대로 도착하도록 관리
  • 전이중 통신: 양방향으로 동시에 데이터 송수신 가능
  • 예시: 웹 브라우징(HTTP), 이메일(SMTP), 파일 전송(FTP), 원격 접속(SSH)

✅ UDP의 특징 (Fast)

  • 비연결형: Handshake 없이 바로 전송
  • 신뢰성 없음: 패킷 유실/중복/순서보장 없음
  • 가볍고 빠름: 헤더가 작고, 제어 정보가 거의 없음
  • 브로드캐스트/멀티캐스트 지원
  • 예시: 실시간 스트리밍(RTP), 게임, VoIP, DNS 질의 등

 

8. 메모리 관리 전략

✅ 페이징(Paging)

  • 고정 크기(Page)의 블록 단위로 메모리를 나누는 방식
  • 논리 주소 공간을 **페이지(Page)**로, 물리 메모리를 **프레임(Frame)**으로 나눔
  • 페이지 테이블을 통해 논리 주소 → 물리 주소 변환
  • 외부 단편화 없음
  • 내부 단편화 가능 (한 페이지에 조금만 쓰면 공간 낭비)
  • 구현 간단, 주소 계산 빠름

✅ 세그멘테이션(Segmentation)

  • 가변 크기(Segment)의 의미 있는 단위로 메모리를 나누는 방식
  • 코드, 데이터, 스택 등을 각각 세그먼트로 분리
  • 주소는 (세그먼트 번호, 오프셋)으로 표현
  • 내부 단편화 없음, 그러나 외부 단편화 발생
  • 페이지보다 유연하지만, 구현 복잡도↑

✅ 단편화(Fragmentation)

  • 내부 단편화 (Internal Fragmentation)
    • 고정 크기 블록에 데이터를 넣을 때 남는 공간 낭비
    • 예: 4KB 페이지에 3.7KB 저장 → 0.3KB 낭비
  • 외부 단편화 (External Fragmentation)
    • 메모리 전체는 여유가 있어도, 연속된 큰 공간이 없어 할당 불가
    • 주로 세그멘테이션 방식에서 발생

 

9. DB 인덱스

✅ DB 인덱스(Index)

  • 데이터베이스에서 검색 성능을 높이기 위해 사용하는 자료구조
  • 조회 속도, 정렬 속도 향상
  • INSERT, UPDATE, DELETE 시 인덱스 갱신 비용 발생, 디스크 공간 사용 증가

✅ 인덱스의 대표 자료구조

  • Hash Index (해시 인덱스)
    • 키 → 해시 함수를 통해 위치 계산
    • 조회는 매우 빠르지만 범위 검색 불가
  • B-Tree / B+Tree Index (기본값)
    • 균형 이진 탐색 트리의 확장형
    • 범위 검색 / 정렬 / 부분 탐색이 가능함
    • MySQL InnoDB에서는 B+Tree 기반 클러스터드 인덱스 사용

✅ 실습 예 (MySQL)

-- 인덱스 생성
CREATE INDEX idx_name ON users(name);

-- 인덱스 확인
SHOW INDEX FROM users;

 

 

 

 

10. 메모리 구조

✅ 프로세스 메모리 구조 (전형적인 구조)

1. Code Segment (텍스트 영역)

  • 프로그램의 **기계어 코드(명령어)**가 저장됨
  • 읽기 전용이며, 함수나 루틴이 위치
  • ex: 함수 정의 자체, main 함수 내부 동작

2. Data Segment

  • 초기값이 있는 전역 변수 또는 static 변수 저장

3. BSS Segment

  • 초기값이 없는 전역/정적 변수 저장

4. Heap

  • 동적 메모리 할당 영역
  • 런타임 중 malloc, new, alloc 등을 통해 할당됨
  • 프로그래머가 직접 해제해야 함 (C/C++)

5. Stack

  • 함수 호출 시 생성되는 프레임지역 변수 저장
  • 함수가 종료되면 해당 스택 프레임 자동 해제됨

 

11. 자료구조 비교

✅ Map vs HashMap

항목 Map HashMap
의미 인터페이스 Map의 구현체
정렬 구현체마다 다름 정렬 없음
동기화 없음 동기화 안 됨 (Hashtable은 동기화됨)
시간복잡도 O(1) (평균) O(1) 삽입/조회

 

✅ List vs Array

항목 Array(배열) List
크기 고정 가변
삽입/삭제 느림 상대적으로 유연
메모리 연속 공간 구현 방식에 따라 다름
시간복잡도 조회 O(1), 삽입 O(n) 조회 O(1), 삽입 O(n) (ArrayList 기준)

 

✅ 3. Stack vs Queue

항목 Stack Queue
구조 LIFO FIFO
주요 연산 push/pop enqueue/dequeue
활용 예 괄호 검사, 재귀 처리 작업 대기열, BFS 탐색 등

 

 

12. 정렬 알고리즘

✅ 주요 정렬 알고리즘 종류

정렬 시간복잡도 공간 안정성 특징
버블 O(n²) O(1) 느리고 비효율적
선택 O(n²) O(1) 교환 적음
삽입 O(n²) / O(n) O(1) 거의 정렬된 경우 빠름
병합 O(n log n) O(n) 안정적, 대용량 적합
O(n log n) / O(n²) O(log n) 빠르지만 불안정
O(n log n) O(1) 자료구조 기반
계수 O(n + k) O(n + k) 정수에만 사용 가능

 

✅ 버블 정렬 (Bubble Sort)

  • 인접한 두 값을 비교하고 교환하여 가장 큰 값을 뒤로 ‘밀어내는’ 방식

✅ 선택 정렬 (Selection Sort)

  • 최솟값을 찾아 맨 앞과 교환하는 방식

✅ 삽입 정렬 (Insertion Sort)

  • 앞에서부터 정렬된 부분에 새로운 원소를 삽입

✅ 병합 정렬 (Merge Sort)

  • 배열을 반으로 나눈 뒤 정렬하여 합치는 분할 정복(Divide & Conquer) 방식

✅ 퀵 정렬 (Quick Sort)

  • Pivot을 기준으로 작고 큰 값을 나누어 재귀적으로 정렬하는 분할 정복 알고리즘

✅ 힙 정렬 (Heap Sort)

  • 최대/최소 힙 자료구조를 이용하여 정렬

✅ 계수 정렬 (Counting Sort

  • 정수 데이터를 대상으로 카운트를 통해 정렬

 

13. OSI 7계층

✅ OSI 7계층 요약

계층 번호 계층 이름 주요 기능 대표 프로토콜/기술
7 응용 계층 (Application) 사용자와 직접 상호작용 HTTP, FTP, SMTP, DNS
6 표현 계층 (Presentation) 데이터 형식, 암호화/복호화, 압축 JPEG, MPEG, SSL/TLS
5 세션 계층 (Session) 연결 제어, 세션 생성/관리/종료 NetBIOS, RPC
4 전송 계층 (Transport) 신뢰성 있는 전송, 흐름 제어 TCP, UDP
3 네트워크 계층 (Network) 경로 선택, 논리 주소(IP) IP, ICMP, ARP, RIP, OSPF
2 데이터링크 계층 (Data Link) 물리 주소(MAC), 프레임 전송 Ethernet, PPP, Switch
1 물리 계층 (Physical) 비트 전송, 하드웨어 LAN 케이블, 허브, 전압/펄스

 

 

14. DB 정규화와 비정규화

✅ 정규화(Normalization)

  • 데이터 중복을 제거하고, 이상(Anomaly)을 방지하여 논리적이고 효율적인 테이블 구조를 만드는 과정
  • 목적 : 중복 최소화, 삽입/삭제/갱신 이상(Anomaly) 방지, 데이터 무결성 보장

✅ 정규화의 단계별 요약

단계 이름 규칙
1NF 제1정규형 원자값만 허용 (중첩/반복 필드 금지)
2NF 제2정규형 부분 함수 종속 제거 (기본키 일부에만 종속된 속성 제거)
3NF 제3정규형 이행적 함수 종속 제거 (A→B→C 관계 제거, 비주요 속성 간 종속 제거)
BCNF 보이스-코드 정규형 모든 결정자가 후보키여야 함 (3NF 강화 버전)
4NF 제4정규형 다치 종속 제거
5NF 제5정규형 조인 종속 제거 (희귀)

 

✅ 비정규화(Denormalization)

  • 성능 향상을 위해 정규화된 테이블을 다시 통합/중복 허용하는 과정
  • 목적 : 조인 비용 줄이기, 읽기 성능 개선, 실시간 처리나 통계 집계 테이블에서 활용

 

15. DB 트랜잭션 격리 수준

✅ 트랜잭션 격리 수준

  • 동시에 여러 트랜잭션이 수행될 때, 각 트랜잭션이 다른 트랜잭션의 작업을 어느 정도까지 볼 수 있는지를 결정하는 규칙(동시성 속에서 데이터 일관성 유지 결정)
  • 높은 격리 수준 → 데이터 정합성 보장 ↑, 성능 ↓
  • 낮은 격리 수준 → 성능 ↑, 정합성 ↓

✅ 트랜잭션 충돌 현상 3가지

현상 설명 예시
Dirty Read 다른 트랜잭션이 커밋하지 않은 변경값을 읽음 T1이 UPDATE → T2가 읽음 → T1이 ROLLBACK
Non-repeatable Read 같은 SELECT 쿼리를 반복했는데 결과가 바뀜 T1이 조회 → T2가 UPDATE 후 커밋 → T1이 다시 조회
Phantom Read 같은 조건의 SELECT인데 행 수가 달라짐 T1이 SELECT → T2가 INSERT 후 커밋 → T1이 다시 SELECT

✅ 4가지 격리 수준 (ANSI SQL 기준)

 

수준 설명 허용되는 현상
READ UNCOMMITTED 커밋되지 않은 데이터도 읽음 Dirty Read, Non-repeatable, Phantom 발생
READ COMMITTED 커밋된 데이터만 읽음 Non-repeatable, Phantom 발생
REPEATABLE READ 조회한 데이터는 다른 트랜잭션이 변경 불가 Phantom Read 발생
SERIALIZABLE 가장 높은 격리, 모든 트랜잭션 순차 실행처럼 보임 없음 (가장 엄격)

 


# 회고

 

기본적인 CS 정리

자주 사용하는 MySQL, Python을 중심으로 예시를 정리했다.