개요
이 프로젝트는 OCaml 언어의 기초부터 고급 개념까지 체계적으로 학습할 수 있도록 구성된 실습 자료다. 각 모듈은 특정 주제에 집중하며, 실습 문제를 통해 개념을 이해하고 적용할 수 있다.
환경 설정
Vagrant를 사용한 개발 환경 설정
프로젝트에는 Vagrant를 사용한 개발 환경 설정이 포함되어 있다.
# VM 시작
vagrant up
# VM 접속
vagrant ssh
# VM 종료 및 삭제
vagrant destroy
Vagrantfile은 Ubuntu 22.04 LTS를 기반으로 하며, 다음을 자동으로 설치:
- OCaml 컴파일러
- OPAM (OCaml Package Manager)
- OCaml 4.14.0
수동 설치
Vagrant를 사용하지 않는 경우, 다음 명령어로 OCaml을 설치할 수 있다:
# Ubuntu/Debian
sudo apt-get install ocaml opam
# macOS (Homebrew)
brew install ocaml opam
# OPAM 초기화
opam init
eval $(opam env)
프로젝트 구조
ocaml-piscine/
├── module00/ # 기초 함수 및 제어 구조
├── module01/ # 재귀 및 고차 함수
├── module02/ # 리스트 및 시퀀스
├── module03/ # 타입 및 변형체
├── module04/ # 참조, 예외, 파일 I/O
├── module05/ # 스크립트 및 모듈
├── module06/ # 객체 지향 프로그래밍
├── module07/ # 복잡한 타입 시스템 (화학 분자 모델링)
├── module08/ # 고급 개념 (모듈, 모노이드, 모나드)
└── Vagrantfile # 개발 환경 설정
각 연습 문제는 다음 구조를 따릅니다:
exXX/
├── [function_name].ml # 구현 파일
├── main.ml # 테스트 파일
└── Makefile # 빌드 설정
모듈별 설명
Module 00: 기초 함수 및 제어 구조
기본적인 함수 작성과 제어 구조를 학습한다.
- ex00:
ft_test_sign- 숫자의 부호 판별 - ex01:
ft_countdown- 카운트다운 함수 - ex02:
ft_power- 거듭제곱 계산 - ex03:
ft_print_alphabet- 알파벳 출력 - ex04:
ft_print_comb- 조합 출력 - ex05:
ft_print_rev- 문자열 역순 출력 - ex06:
ft_string_all- 문자열 검증 - ex07:
ft_is_palindrome- 회문 판별 - ex08:
ft_rot_n- ROT-N 암호화 - ex09:
ft_print_comb2- 두 자리 조합 출력
Module 01: 재귀 및 고차 함수
재귀 함수와 고차 함수의 개념을 학습한다.
- ex00:
repeat_x- 문자열 반복 - ex01:
repeat_string- 문자열 반복 (고차 함수) - ex02:
ackermann- 아커만 함수 (비원시 재귀 함수) - ex03:
tak- Takeuchi 함수 - ex04:
fibonacci- 피보나치 수열 - ex05:
hofstadter_mf- 호프스태터 함수 - ex06:
iter- 반복 함수 - ex07:
converges- 수렴 함수 - ex08:
ft_sum- 합계 계산 - ex09:
leibniz_pi- 라이프니츠 파이 공식
Module 02: 리스트 및 시퀀스
리스트 조작과 시퀀스 처리에 대해 학습한다.
- ex00:
encode- 인코딩 함수 - ex01:
crossover- 교차 함수 - ex02:
gray- 그레이 코드 - ex03:
sequence- 시퀀스 생성 - ex04:
nucleotides- 뉴클레오티드 처리 - ex05:
helix- 나선 구조 - ex06:
rna- RNA 처리
Module 03: 타입 및 변형체
OCaml의 타입 시스템과 변형체(variant types)를 학습한다.
- ex00:
Color- 카드 색상 타입 (Spade, Heart, Diamond, Club) - ex01:
Value- 카드 값 타입 - ex02:
Card- 카드 타입 조합
Module 04: 참조, 예외, 파일 I/O
변경 가능한 상태, 예외 처리, 파일 입출력을 학습한다.
- ex00:
micronap- 마이크로 슬립 - ex01:
ft_ref- 참조 타입 사용 - ex02:
jokes- 예외 처리 - ex03:
jokes- 파일에서 읽기 - ex04:
sum- 파일 처리 - ex05:
eu_dist- 유클리드 거리 계산 - ex06:
example_of_file- CSV 파일 처리
Module 05: 스크립트 및 모듈
OCaml 스크립트 작성과 모듈 시스템을 학습한다.
- ex00:
StringSet- Set 모듈 사용 - ex01-ex04: 다양한 모듈 및 스크립트 예제
Module 06: 객체 지향 프로그래밍
OCaml의 객체 지향 프로그래밍 기능을 학습한다.
- ex00:
people- 기본 클래스 - ex01:
doctor- 클래스 상속 - ex02:
dalek- 다중 클래스 상속
Module 07: 복잡한 타입 시스템
화학 분자 모델링을 통한 복잡한 타입 시스템을 학습한다.
- ex00:
atom- 원자 클래스 (Hydrogen, Carbon, Oxygen 등) - ex01:
molecule- 분자 클래스 - ex02:
alkane- 알칸 분자 - ex03:
reaction- 화학 반응 - ex04:
alkane_combustion- 알칸 연소 반응 - ex05: 고급 반응 처리
Module 08: 고급 개념
모듈, 모노이드, 모나드 등 고급 함수형 프로그래밍 개념을 학습한다.
- ex00:
Watchtower- 모듈 (시계 모노이드) - ex01:
App- 애플리케이션 모듈 - ex02:
Monoid- 모노이드 구현 - ex03:
Monad- 모나드 구현 - ex04: 고급 모나드 패턴
빌드 및 실행
각 연습 문제는 독립적으로 빌드하고 실행할 수 있다.
빌드
cd moduleXX/exYY
make
실행
./run.out
정리
make clean # 빌드 산출물 삭제
make re # 정리 후 재빌드
예제
# Module 00의 첫 번째 연습 문제 실행
cd module00/ex00
make
./run.out
학습 순서
- Module 00: OCaml의 기본 문법과 함수 작성법을 익힌다.
- Module 01: 재귀와 고차 함수를 통해 함수형 프로그래밍의 핵심을 학습한다.
- Module 02: 리스트와 시퀀스를 다루는 방법을 학습한다.
- Module 03: OCaml의 강력한 타입 시스템을 이해한다.
- Module 04: 변경 가능한 상태와 예외 처리, 파일 I/O를 학습한다.
- Module 05: 모듈 시스템과 스크립트 작성법을 학습한다.
- Module 06: OCaml의 객체 지향 프로그래밍 기능을 학습한다.
- Module 07: 복잡한 타입 시스템을 실제 문제에 적용한다.
- Module 08: 함수형 프로그래밍의 고급 개념을 학습한다.