Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

42서울 프로젝트 포트폴리오

42서울 교육과정에서 완수한 16개의 프로젝트 모음입니다.

👨‍💻 소개

교육 기간: 2022.11 - 2025.04 교육 기관: 42 Seoul 커리큘럼: Circle 0 ~ Circle 6

📚 프로젝트 목록

🎓 Circle 0-1: C 프로그래밍 기초

  • C 표준 라이브러리 함수 구현
  • 42개의 함수 직접 구현 (문자열, 메모리, 리스트 등)
  • 주요 학습: C 언어 기초, 메모리 관리, Makefile
  • 핵심 구현:
    • ft_split: 구분자로 문자열 분할 + 메모리 누수 방지 free_all()
    • ft_calloc: 안전한 동적 메모리 할당 및 0 초기화
    • 모든 함수에서 NULL 포인터 및 엣지 케이스 철저히 처리
  • printf 함수 재구현
  • variadic 함수, 포맷 지정자 처리
  • 주요 학습: va_list, 포맷 파싱, 진법 변환
  • 파일에서 한 줄씩 읽어오는 함수
  • 정적 변수를 활용한 버퍼 관리
  • 주요 학습: 파일 I/O, 정적 변수, 버퍼 관리
  • 핵심 구현:
    • 정적 버퍼: static char buf[BUFFER_SIZE + 1]로 읽기 상태 유지
    • ft_strjoin_free: 메모리 결합 후 기존 메모리 자동 해제
    • 다양한 BUFFER_SIZE (1 ~ 수백만)에서도 정확한 동작 보장
  • 가상 머신 시스템 관리
  • SSH, UFW, sudo 정책 설정
  • 주요 학습: 리눅스 시스템 관리, 보안, 모니터링

🧮 Circle 2: 알고리즘 & 그래픽

  • 두 개의 스택으로 정수 정렬
  • 최소 연산으로 정렬 알고리즘 설계
  • 주요 학습: 알고리즘 최적화, 복잡도 분석
  • 핵심 구현:
    • 5개 이하 최적화: 특수 케이스 처리로 최소 연산 달성
    • 청크 분할: 대량 데이터를 구간별로 나누어 처리
    • 회전 방향 최적화: 스택 중간 기준 ra/rra 선택
  • 유닉스 시그널을 이용한 프로세스 간 통신
  • 비트 단위 데이터 전송
  • 주요 학습: 시그널, 비트 연산, IPC
  • 2D 게임 개발 (MiniLibX)
  • 맵 파싱, 그래픽 렌더링
  • 주요 학습: 그래픽 프로그래밍, 게임 로직, 이벤트 처리

🔧 Circle 3: 시스템 프로그래밍

  • 식사하는 철학자 문제 (멀티스레딩)
  • 데드락 방지, 동기화 처리
  • 주요 학습: 스레드, 뮤텍스, 동시성 제어
  • 핵심 구현:
    • 데드락 방지: 짝수/홀수 철학자 시작 시간 차등화
    • 레이스 컨디션 해결: 모든 공유 변수에 뮤텍스 적용
    • 정밀한 타이밍: usleep(100) 짧은 대기로 반응성 향상
    • 상태 관리: getter/setter로 스레드 안전한 접근
  • Bash 쉘 구현
  • 파이프, 리다이렉션, Built-in 명령어
  • 주요 학습: 프로세스 관리, 파싱, 시그널 처리
  • 핵심 구현:
    • 파이프라인: fork() + pipe() + execve()로 명령어 체이닝
    • 리다이렉션: dup2()로 파일 디스크립터 교체
    • Heredoc: 임시 파일 생성 및 delimiter까지 읽기
    • 환경변수 확장: $VAR, $? 파싱 및 치환
    • 35개 소스 파일로 체계적 모듈화

🌐 Circle 4: 고급 프로그래밍

  • 레이트레이싱 3D 렌더링 엔진
  • 광선-오브젝트 교차, 조명 계산
  • 주요 학습: 3D 수학, 레이트레이싱, 벡터 연산
  • 핵심 구현:
    • 광선-구 교차: 이차방정식 판별식으로 교차점 계산
    • Phong 조명 모델: Ambient + Diffuse + Specular 조합
    • 그림자 레이: 교차점에서 광원으로 shadow ray 발사
    • 벡터 연산: dot, cross, normalize 등 3D 수학 함수들
  • C++98 표준 학습 (10개 모듈)
  • OOP, 템플릿, STL, 예외 처리
  • 주요 학습: 객체지향, C++ 핵심 개념
  • 핵심 구현:
    • CSV 파싱 (Module 09): std::istringstreamstd::getline을 활용한 2단계 파싱
      // 줄 단위 읽기 → 쉼표로 분할
      while (std::getline(ifs, line)) {
          std::istringstream iss(line);
          while (std::getline(iss, value, ',')) {
              record.push_back(value);
          }
      }
    • Bitcoin Exchange: std::mapupper_bound()로 가장 가까운 이전 날짜 검색
    • Orthodox Canonical Form: 생성자, 복사 생성자, 대입 연산자, 소멸자 구현
    • Template 프로그래밍: 제네릭 swap, Array 클래스
  • 네트워크 기초 실습
  • IP 주소, 서브넷, 라우팅
  • 주요 학습: TCP/IP, 서브넷팅, 네트워크 설계

🐳 Circle 5: 웹 & 인프라

  • C++로 HTTP 웹서버 구현
  • CGI, 멀티플렉싱, Virtual Host
  • 주요 학습: 네트워크 프로그래밍, HTTP 프로토콜
  • 핵심 구현:
    • I/O 멀티플렉싱: select()/poll()로 non-blocking 소켓 처리
    • HTTP 파싱: Request Line, Headers, Body 파싱
    • CGI 실행: fork() + execve()로 외부 스크립트 실행
    • Location 매칭: 가장 긴 prefix 매칭 알고리즘
    • 팀 프로젝트: 4명이 협업하여 마이크로서비스 구조로 설계
  • 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

Docker 프로젝트 실행

# Inception
cd inception
docker-compose up -d

📖 학습 여정

Circle 0-1: 기초 다지기 (2-3개월)

처음으로 C 언어를 깊이 학습하며 표준 라이브러리 함수들을 직접 구현했습니다. 메모리 관리의 중요성을 체감했습니다.

Circle 2: 알고리즘 & 그래픽 (2-3개월)

정렬 알고리즘 최적화와 그래픽 프로그래밍을 배웠습니다. push_swap에서 효율적인 알고리즘 설계의 중요성을 깨달았습니다.

Circle 3: 시스템의 핵심 (3-4개월)

멀티스레딩과 프로세스 관리를 학습했습니다. Philosophers에서 동시성 제어의 어려움을, minishell에서 시스템 프로그래밍의 복잡성을 경험했습니다.

Circle 4: 고급 기술 (4-5개월)

레이트레이싱으로 3D 수학을, C++ 모듈로 객체지향을 마스터했습니다. 네트워크 기초도 탄탄히 다졌습니다.

Circle 5: 웹과 인프라 (3-4개월)

웹서버 구현과 Docker를 통한 인프라 구축을 배웠습니다. 실무에 가까운 기술들을 익혔습니다.


💻 주요 코드 하이라이트

CSV 파싱 (CPP Module 09)

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);
    }
}

레이트레이싱 교차 계산 (miniRT)

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;
}

데드락 방지 (Philosophers)

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서울 학생들의 학습을 위해 참고용으로만 사용해주세요.


👤 Contact

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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages