Java 21 기반으로 30가지 자료구조와 알고리즘을 직접 구현하는 학습 프로젝트입니다. 각 구현은 POP(절차지향) 와 OOP(객체지향) 두 가지 패러다임으로 작성되어 있습니다.
- 자료구조의 내부 동작 원리 이해
- 시간/공간 복잡도 분석 능력 배양
- 두 가지 프로그래밍 패러다임 비교 학습
- 테스트 주도 개발(TDD) 경험
- Java 21 최신 기능 활용 (Record, Pattern Matching, Virtual Threads 등)
- POP vs OOP 동일 문제를 두 가지 방식으로 해결
- 테스트 우선 각 프로젝트당 30개 이상의 테스트 케이스
- 문서화 상세한 풀이 해설 및 복잡도 분석 포함
| 구분 | POP (절차지향) | OOP (객체지향) |
|---|---|---|
| 데이터 | 배열, Map, 기본형 중심 | 클래스, 객체 중심 |
| 로직 | 함수/메서드에 집중 | 객체의 책임으로 분산 |
| 장점 | 단순함, 성능 | 확장성, 유지보수성 |
| 학습 | 알고리즘 로직 이해 | 설계 패턴 학습 |
| # | 프로젝트 | 핵심 개념 | 난이도 |
|---|---|---|---|
| 01 | 동적 배열 | 배열 확장, Amortized O(1) | ⭐ |
| 02 | 연결 리스트 | 노드 연결, 포인터 조작 | ⭐ |
| 03 | 스택 | LIFO, 괄호 매칭 | ⭐ |
| 04 | 큐/덱 | FIFO, 양방향 연산 | ⭐ |
| 05 | 해시맵 | 해싱, 충돌 해결 | ⭐⭐ |
| 06 | 이진 탐색 트리 | BST 속성, 순회 | ⭐⭐ |
| 07 | 힙/우선순위 큐 | 완전 이진 트리, Heapify | ⭐⭐ |
| 08 | 그래프 | 인접 리스트, BFS/DFS | ⭐⭐ |
| 09 | 트라이 | 접두사 트리, 자동완성 | ⭐⭐ |
| 10 | LRU 캐시 | 해시맵 + 이중 연결 리스트 | ⭐⭐ |
| # | 프로젝트 | 핵심 개념 | 난이도 |
|---|---|---|---|
| 11 | 블룸 필터 | 확률적 자료구조, 해시 함수 | ⭐⭐ |
| 12 | 스킵 리스트 | 확률적 균형, 다층 리스트 | ⭐⭐⭐ |
| 13 | 구간 트리 | 구간 쿼리, 지연 전파 | ⭐⭐⭐ |
| 14 | 유니온 파인드 | 경로 압축, 랭크 최적화 | ⭐⭐ |
| 15 | B-트리 | 다진 트리, 디스크 최적화 | ⭐⭐⭐⭐ |
| 16 | Red-Black 트리 | 자가 균형, 색상 규칙 | ⭐⭐⭐⭐ |
| 17 | 펜윅 트리 | 비트 조작, 누적 합 | ⭐⭐⭐ |
| 18 | 서킷 브레이커 | 장애 격리, 상태 전이 | ⭐⭐ |
| 19 | 토큰 버킷 | 속도 제한, 버스트 허용 | ⭐⭐ |
| 20 | 일관된 해싱 | 분산 시스템, 가상 노드 | ⭐⭐⭐ |
| # | 프로젝트 | 핵심 개념 | 난이도 |
|---|---|---|---|
| 21 | 작업 스케줄러 | 우선순위, 지연 실행, Cron | ⭐⭐⭐ |
| 22 | 타임시리즈 DB | 시간 인덱싱, 다운샘플링 | ⭐⭐⭐ |
| 23 | 문서 인덱서 | 역인덱스, TF-IDF | ⭐⭐⭐ |
| 24 | 분산 락 | 상호 배제, Fencing Token | ⭐⭐⭐ |
| 25 | 블록체인 | 해시 체인, 작업 증명 | ⭐⭐⭐ |
| 26 | 파일 시스템 | 트리 구조, 경로 탐색 | ⭐⭐⭐ |
| 27 | 의존성 해결기 | 위상 정렬, 순환 탐지 | ⭐⭐⭐ |
| 28 | 메모리 풀 | 메모리 할당, 버디 시스템 | ⭐⭐⭐⭐ |
| 29 | 이벤트 소싱 | 이벤트 저장소, 프로젝션 | ⭐⭐⭐ |
| 30 | 분산 ID 생성기 | Snowflake, UUID, ULID | ⭐⭐⭐ |
data-structure/
├── README.md # 이 파일
├── 01-dynamic-array/
│ ├── build.gradle
│ ├── settings.gradle
│ ├── README.md # 문제 정의
│ ├── docs/
│ │ └── SOLUTION.md # 풀이 해설
│ └── src/
│ ├── main/java/com/datastructure/dynamicarray/
│ │ ├── pop/ # 절차지향 구현
│ │ │ └── DynamicArray.java
│ │ └── oop/ # 객체지향 구현
│ │ ├── DynamicArray.java
│ │ └── DynamicArrayImpl.java
│ └── test/java/com/datastructure/dynamicarray/
│ ├── PopTest.java # POP 테스트 (30개)
│ └── OopTest.java # OOP 테스트 (30개)
├── 02-linked-list/
│ └── ...
└── ...
| 파일/폴더 | 설명 |
|---|---|
README.md |
문제 정의, 입출력 형식, 예제 |
docs/SOLUTION.md |
알고리즘 해설, 복잡도 분석, 핵심 코드 |
src/main/.../pop/ |
절차지향 구현 (TODO 상태) |
src/main/.../oop/ |
객체지향 구현 (TODO 상태) |
src/test/...Test.java |
테스트 케이스 (구현 검증용) |
- Java 21 이상
- Gradle 8.x (Wrapper 포함)
# 프로젝트 클론
git clone <repository-url>
cd data-structure
# 특정 프로젝트로 이동
cd 01-dynamic-array
# 테스트 실행 (구현 전에는 실패)
./gradlew test
# 전체 빌드
./gradlew buildIntelliJ IDEA (권장)
File > Open에서 프로젝트 폴더 선택- Gradle 프로젝트로 인식됨
- Java 21 SDK 설정 확인
VS Code
- Extension Pack for Java 설치
- 프로젝트 폴더 열기
- Java 21 경로 설정
1단계: 기초 (1-4)
├── 동적 배열 → 연결 리스트 → 스택 → 큐
└── 기본적인 자료구조의 원리 이해
2단계: 핵심 (5-10)
├── 해시맵 → BST → 힙 → 그래프 → 트라이 → LRU
└── 탐색, 정렬, 캐싱의 핵심 개념
3단계: 고급 (11-17)
├── 블룸 필터 → 스킵 리스트 → 구간 트리 → ...
└── 확률적 자료구조, 균형 트리, 구간 쿼리
4단계: 시스템 (18-30)
├── 서킷 브레이커 → 토큰 버킷 → 일관된 해싱 → ...
└── 실무 시스템 설계에 사용되는 패턴
-
README.md 읽기
- 문제 정의 이해
- 입출력 형식 파악
- 예제로 동작 확인
-
테스트 먼저 실행
./gradlew test- 실패하는 테스트 확인
- 테스트 케이스로 요구사항 파악
-
POP 구현
src/main/.../pop/의 TODO 채우기- 알고리즘 로직에 집중
- 테스트 통과 확인
-
OOP 구현
src/main/.../oop/의 TODO 채우기- 객체 설계에 집중
- 테스트 통과 확인
-
SOLUTION.md 참고
- 구현 후 풀이 해설 확인
- 더 나은 방법 학습
- 복잡도 분석 이해
// POP 스타일 - 함수와 데이터 분리
public class DynamicArray {
private int[] data;
private int size;
public void add(int element) {
// 직접적인 배열 조작
}
}
// OOP 스타일 - 객체의 책임
public class DynamicArray<E> implements List<E> {
private Object[] elements;
private int size;
@Override
public boolean add(E element) {
// 인터페이스 계약 준수
}
}cd 01-dynamic-array
./gradlew test./gradlew test --tests "PopTest"
./gradlew test --tests "OopTest"./gradlew test --tests "PopTest.test01_*"# 테스트 실행 후
open build/reports/tests/test/index.html# 프로젝트 루트에서
for dir in */; do
if [ -f "$dir/build.gradle" ]; then
echo "Testing $dir..."
(cd "$dir" && ./gradlew test)
fi
done| 자료구조 | 접근 | 탐색 | 삽입 | 삭제 | 공간 |
|---|---|---|---|---|---|
| 동적 배열 | O(1) | O(n) | O(1)* | O(n) | O(n) |
| 연결 리스트 | O(n) | O(n) | O(1) | O(1) | O(n) |
| 스택 | O(n) | O(n) | O(1) | O(1) | O(n) |
| 큐 | O(n) | O(n) | O(1) | O(1) | O(n) |
| 해시맵 | - | O(1)* | O(1)* | O(1)* | O(n) |
| BST | - | O(log n)* | O(log n)* | O(log n)* | O(n) |
| 힙 | O(1) | O(n) | O(log n) | O(log n) | O(n) |
*평균 시간복잡도
| 자료구조 | 주요 연산 | 시간복잡도 | 공간 |
|---|---|---|---|
| 블룸 필터 | 추가/조회 | O(k) | O(m) |
| 스킵 리스트 | 탐색/삽입/삭제 | O(log n)* | O(n) |
| 구간 트리 | 쿼리/갱신 | O(log n) | O(n) |
| 유니온 파인드 | 합집합/찾기 | O(α(n)) | O(n) |
| B-트리 | 탐색/삽입/삭제 | O(log n) | O(n) |
| Red-Black 트리 | 탐색/삽입/삭제 | O(log n) | O(n) |
| 펜윅 트리 | 쿼리/갱신 | O(log n) | O(n) |
- Introduction to Algorithms (CLRS)
- Algorithms by Robert Sedgewick
- 데이터 중심 애플리케이션 설계 (DDIA)
- visualgo.net - 자료구조 시각화
- Big-O Cheat Sheet
- GeeksforGeeks
이 프로젝트는 학습 목적으로 제작되었습니다.
- 버그 리포트 및 개선 제안 환영
- 추가 테스트 케이스 기여 환영
- 문서 개선 기여 환영
Happy Coding! 🚀