: Objective Caml을 의미합니다.
: Caml은 ML family에 속하는 프로그래밍 언어입니다.
특징은 아래와 같습니다.
위의 특징들을 하나하나 다뤄보겠습니다.
: 이는 함수가 first-class values(1급 객체)임을 의미합니다.
아래 3가지 조건을 충족하면 1급 객체라고 합니다.
변수나 데이터에 할당될 수 있어야 한다.
: C, Java, C++등의 언어는 void 타입의 함수를 변수에 할당하지 못합니다.
하지만 Ocaml은 변수에 함수를 묶을 수 있습니다.
객체의 반환 값으로 반환될 수 있어야 한다.
: C, Java, C++등의 언어는 함수의 반환 값으로 함수 타입을 반환하지 못합니다.
하지만 OCaml은 함수의 반환 값으로 함수 타입을 반환할 수 있습니다.
객체의 인자로 넘어갈 수 있어야 한다.
: C, Java, C++등의 언어는 함수의 인자로 함수 타입을 넘겨주지 못합니다.
하지만 OCaml은 함수의 인자로 함수 타입을 넘겨줄 수 있습니다.
OCaml은 세 가지 조건 모두를 만족할 수 있어 함수를 1급 객체라고 칭합니다.
: 이는 모든 변수 및 표현식의 타입이 "컴파일 시점"에 결정됨을 의미합니다.
반대의 예시로는 런타임에 타입이 결정되는 파이썬이 존재합니다.
: 이는 타입 시스템이 변수 및 표현식의 타입을 추론할 수 있음을 의미합니다.
OCaml에서는 변수의 선언에 타입을 붙이지 않습니다.
대신 타입 시스템이 타입을 추론해 변수에 타입을 붙여줍니다.
: 이는 데이터 구조 및 알고리즘을 일반적으로 구현할 수 있음을 의미합니다.
타입을 컴파일 시점에 추론을 해주기 때문에 자료 구조 및 알고리즘이 일반적으로 구현될 수 있습니다.
(e.g. Java에서 오버로딩을 이용해야 하는 경우, OCaml에서는 타입을 명시하지 않기 때문에 일반적인 구현이 가능합니다.)
: 이는 Case 분석을 지원함을 의미합니다.
OCaml의 match with 구문이 이에 해당합니다. match with 구문은 OCaml의 문법을 다룰 때 자세하게 소개하겠습니다.
: 이는 프로그램을 여러 모듈로 나누어서 구현할 수 있음을 의미합니다.
OCaml로 작성된 모든 소스파일은 모듈화가 되어 모듈로 사용이 가능합니다.
OCaml은 Caml에 객체지향개념을 추가해 확장한 버전입니다.
따라서 Caml과 다르게 객체지향에서 추가된 다음과 같은 특징들이 있습니다.
C
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6};
int even_arr[3];
int index = 0;
// Filtering
for (int i = 0; i < 10; ++i) {
if(arr[i] % 2 == 0) {
even arr[index++] = arr[i];
}
}
// Printing
for (int i = 0; i < 3; ++i) {
printf("%d ", even_arr[i]);
}
return 0;
}
OCaml
let _ =
let arr = [1;2;3;4;5;6] in
let res = List.filter
(fun x -> (x mod 2) = 0) arr
in
List.iter
(fun x -> Format.print "%d " x) res
C
int gcd (int a, int b) {
int r = a % b;
if (r == 0) return b;
else return gcd(b, r);
}
OCaml
let rec gcd a b =
let r = a mod b in
if r = 0 then b
else gcd b r