42서울 교육과정에서 완수한 16개의 프로젝트 모음입니다.
교육 기간: 2022.11 - 2025.04 교육 기관: 42 Seoul 커리큘럼: Circle 0 ~ Circle 6
- C 표준 라이브러리 함수 구현
- 42개의 함수 직접 구현 (문자열, 메모리, 리스트 등)
- 주요 학습: C 언어 기초, 메모리 관리, Makefile
- 핵심 구현:
- ft_split: 구분자로 문자열 분할 + 메모리 누수 방지
free_all() - ft_calloc: 안전한 동적 메모리 할당 및 0 초기화
- 모든 함수에서 NULL 포인터 및 엣지 케이스 철저히 처리
- ft_split: 구분자로 문자열 분할 + 메모리 누수 방지
- printf 함수 재구현
- variadic 함수, 포맷 지정자 처리
- 주요 학습: va_list, 포맷 파싱, 진법 변환
- 파일에서 한 줄씩 읽어오는 함수
- 정적 변수를 활용한 버퍼 관리
- 주요 학습: 파일 I/O, 정적 변수, 버퍼 관리
- 핵심 구현:
- 정적 버퍼:
static char buf[BUFFER_SIZE + 1]로 읽기 상태 유지 - ft_strjoin_free: 메모리 결합 후 기존 메모리 자동 해제
- 다양한 BUFFER_SIZE (1 ~ 수백만)에서도 정확한 동작 보장
- 정적 버퍼:
- 가상 머신 시스템 관리
- SSH, UFW, sudo 정책 설정
- 주요 학습: 리눅스 시스템 관리, 보안, 모니터링
- 두 개의 스택으로 정수 정렬
- 최소 연산으로 정렬 알고리즘 설계
- 주요 학습: 알고리즘 최적화, 복잡도 분석
- 핵심 구현:
- 5개 이하 최적화: 특수 케이스 처리로 최소 연산 달성
- 청크 분할: 대량 데이터를 구간별로 나누어 처리
- 회전 방향 최적화: 스택 중간 기준 ra/rra 선택
- 유닉스 시그널을 이용한 프로세스 간 통신
- 비트 단위 데이터 전송
- 주요 학습: 시그널, 비트 연산, IPC
- 2D 게임 개발 (MiniLibX)
- 맵 파싱, 그래픽 렌더링
- 주요 학습: 그래픽 프로그래밍, 게임 로직, 이벤트 처리
- 식사하는 철학자 문제 (멀티스레딩)
- 데드락 방지, 동기화 처리
- 주요 학습: 스레드, 뮤텍스, 동시성 제어
- 핵심 구현:
- 데드락 방지: 짝수/홀수 철학자 시작 시간 차등화
- 레이스 컨디션 해결: 모든 공유 변수에 뮤텍스 적용
- 정밀한 타이밍:
usleep(100)짧은 대기로 반응성 향상 - 상태 관리: getter/setter로 스레드 안전한 접근
- Bash 쉘 구현
- 파이프, 리다이렉션, Built-in 명령어
- 주요 학습: 프로세스 관리, 파싱, 시그널 처리
- 핵심 구현:
- 파이프라인:
fork()+pipe()+execve()로 명령어 체이닝 - 리다이렉션:
dup2()로 파일 디스크립터 교체 - Heredoc: 임시 파일 생성 및 delimiter까지 읽기
- 환경변수 확장:
$VAR,$?파싱 및 치환 - 35개 소스 파일로 체계적 모듈화
- 파이프라인:
- 레이트레이싱 3D 렌더링 엔진
- 광선-오브젝트 교차, 조명 계산
- 주요 학습: 3D 수학, 레이트레이싱, 벡터 연산
- 핵심 구현:
- 광선-구 교차: 이차방정식 판별식으로 교차점 계산
- Phong 조명 모델: Ambient + Diffuse + Specular 조합
- 그림자 레이: 교차점에서 광원으로 shadow ray 발사
- 벡터 연산: dot, cross, normalize 등 3D 수학 함수들
- C++98 표준 학습 (10개 모듈)
- OOP, 템플릿, STL, 예외 처리
- 주요 학습: 객체지향, C++ 핵심 개념
- 핵심 구현:
- CSV 파싱 (Module 09):
std::istringstream과std::getline을 활용한 2단계 파싱// 줄 단위 읽기 → 쉼표로 분할 while (std::getline(ifs, line)) { std::istringstream iss(line); while (std::getline(iss, value, ',')) { record.push_back(value); } }
- Bitcoin Exchange:
std::map의upper_bound()로 가장 가까운 이전 날짜 검색 - Orthodox Canonical Form: 생성자, 복사 생성자, 대입 연산자, 소멸자 구현
- Template 프로그래밍: 제네릭 swap, Array 클래스
- CSV 파싱 (Module 09):
- 네트워크 기초 실습
- IP 주소, 서브넷, 라우팅
- 주요 학습: TCP/IP, 서브넷팅, 네트워크 설계
- C++로 HTTP 웹서버 구현
- CGI, 멀티플렉싱, Virtual Host
- 주요 학습: 네트워크 프로그래밍, HTTP 프로토콜
- 핵심 구현:
- I/O 멀티플렉싱:
select()/poll()로 non-blocking 소켓 처리 - HTTP 파싱: Request Line, Headers, Body 파싱
- CGI 실행:
fork()+execve()로 외부 스크립트 실행 - Location 매칭: 가장 긴 prefix 매칭 알고리즘
- 팀 프로젝트: 4명이 협업하여 마이크로서비스 구조로 설계
- I/O 멀티플렉싱:
- Docker로 인프라 구축
- Nginx, WordPress, MariaDB 컨테이너화
- 주요 학습: Docker, 컨테이너 오케스트레이션
- 핵심 구현:
- 멀티 컨테이너: Nginx, WordPress, MariaDB 각각 독립 컨테이너
- TLS 설정: OpenSSL로 자체 서명 인증서 생성 및 HTTPS 구성
- 볼륨 관리: 데이터 영속성 보장 (wordpress_data, mariadb_data)
- Docker Compose: YAML로 서비스 간 의존성 및 네트워크 정의
- 자동화 스크립트: WordPress CLI로 초기 설정 자동화
- C: libft, printf, gnl, push_swap, philo, minishell, minitalk, so_long, miniRT
- C++: webserv, cpp modules
- Shell: born2beRoot, inception
- 버전 관리: Git
- 빌드: Makefile, CMake
- 컨테이너: Docker, Docker Compose
- 네트워크: TCP/IP, HTTP
- 데이터베이스: MariaDB
- 그래픽: MiniLibX, OpenGL
- 메모리 관리 및 포인터
- 알고리즘 및 자료구조
- 멀티스레딩 및 동기화
- 프로세스 및 시스템 프로그래밍
- 네트워크 프로그래밍
- 객체지향 프로그래밍
- DevOps 및 인프라
| 카테고리 | 프로젝트 수 | 주요 기술 |
|---|---|---|
| C 기초 | 4 | 메모리 관리, 파일 I/O, 시스템 관리 |
| 알고리즘 | 2 | 정렬, 최적화, 비트 연산 |
| 시스템 | 2 | 스레드, 프로세스, IPC |
| 그래픽 | 2 | MiniLibX, 레이트레이싱 |
| 네트워크 | 2 | TCP/IP, HTTP, 서브넷팅 |
| C++ | 1 | OOP, STL, 템플릿 |
| 웹/인프라 | 2 | 웹서버, Docker |
총 프로젝트: 16개 총 코드 라인: ~50,000+ 라인 학습 기간: 약 2.5년
- ✅ 메모리 누수 없음 - Valgrind 검증
- ✅ 42 Norm 준수 - 일관된 코딩 스타일
- ✅ 모듈화 - 체계적인 파일 구조
- ✅ 에러 처리 - 철저한 엣지 케이스 처리
- ✅ 저수준 프로그래밍 - C, 메모리, 포인터
- ✅ 시스템 프로그래밍 - 프로세스, 스레드, 시그널
- ✅ 네트워크 - 소켓, HTTP
- ✅ 알고리즘 - 정렬, 탐색, 최적화
- ✅ OOP - C++ 클래스 설계
- 팀 프로젝트: webserv
- 페어 프로그래밍: 다수 프로젝트에서 동료 학습
- 코드 리뷰: 평가 시스템을 통한 피어 리뷰
git clone https://github.com/username/42Seoul_projects.git
cd 42Seoul_projects# 예: libft
cd libft
make# Inception
cd inception
docker-compose up -d처음으로 C 언어를 깊이 학습하며 표준 라이브러리 함수들을 직접 구현했습니다. 메모리 관리의 중요성을 체감했습니다.
정렬 알고리즘 최적화와 그래픽 프로그래밍을 배웠습니다. push_swap에서 효율적인 알고리즘 설계의 중요성을 깨달았습니다.
멀티스레딩과 프로세스 관리를 학습했습니다. Philosophers에서 동시성 제어의 어려움을, minishell에서 시스템 프로그래밍의 복잡성을 경험했습니다.
레이트레이싱으로 3D 수학을, C++ 모듈로 객체지향을 마스터했습니다. 네트워크 기초도 탄탄히 다졌습니다.
웹서버 구현과 Docker를 통한 인프라 구축을 배웠습니다. 실무에 가까운 기술들을 익혔습니다.
void BitcoinExchange::read_csv(const std::string &file) {
std::ifstream ifs(file.c_str());
std::string line;
while (std::getline(ifs, line)) {
std::istringstream iss(line);
std::string value;
std::vector<std::string> record;
while (std::getline(iss, value, ',')) {
record.push_back(value);
}
data.push_back(record);
}
}bool intersect_sphere(t_ray ray, t_sphere sphere, t_hit *hit) {
vec3 oc = vec_sub(ray.origin, sphere.center);
double a = vec_dot(ray.dir, ray.dir);
double b = 2.0 * vec_dot(oc, ray.dir);
double c = vec_dot(oc, oc) - sphere.radius * sphere.radius;
double discriminant = b*b - 4*a*c;
if (discriminant < 0)
return false;
double t = (-b - sqrt(discriminant)) / (2.0*a);
hit->point = ray_at(ray, t);
hit->normal = vec_normalize(vec_sub(hit->point, sphere.center));
return true;
}void *philosopher(void *data) {
t_philo *philo = (t_philo *)data;
// 짝수 철학자는 지연 시작
if (philo->id % 2 == 0)
usleep(100);
while (!is_ended) {
pthread_mutex_lock(&fork_left);
pthread_mutex_lock(&fork_right);
eating(philo);
pthread_mutex_unlock(&fork_right);
pthread_mutex_unlock(&fork_left);
}
}이 저장소의 코드는 학습 목적으로 작성되었습니다. 42서울 학생들의 학습을 위해 참고용으로만 사용해주세요.
GitHub: minjcho 42 Intra: minjcho
42서울의 동료 학습자들과 평가자분들께 감사드립니다. Peer-to-peer 학습 시스템을 통해 많은 것을 배울 수 있었습니다.
"The only way to learn a new programming language is by writing programs in it." - Dennis Ritchie
Last Updated: 2025.10.09