CS 공부
면접 대비 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을 기반으로 다음을 처리
- HTML 파싱 및 DOM 트리 생성
- CSS 파싱 및 렌더 트리 구성
- JS 파싱 및 실행
- 이미지, 글꼴, 스크립트 등의 리소스 추가 요청
- 최종적으로 화면에 페이지 렌더링
✅ 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을 중심으로 예시를 정리했다.