[Ocaml] Pattern matching
·
언어/Ocaml
대부분 Switch - case문은 특정 패턴에 대해 어떤 동작을 수행해야하는 지를 표현한다. Ocaml에서는 match-with 표현식을 통해 구현할 수 있다. Match-with match-with 표현식은 반환값이 존재한다. 왜냐면 Ocaml에서 대부분 표현식이며, match-with도 예외는 아니기 때문이다. match-with문은 다른 언어의 패턴 매칭과 정확히는 유사하다고 할 수 있는데, 이유는 더 강력하기 때문이다. 뭐 얼마나 강력하길래 이럴까? 함께 알아보자. match-with문은 한마디로.. 좀 깐깐하다. 내가 int형 변수에 대한 pattern matching을 하겠다고 match-with문을 사용하면 모든 정수에 대해 어떻게 처리해야하는 지를 명시해야한다. (* int -> unit..
[Ocaml] 함수의 타입에 대해
·
언어/Ocaml
함수의 타입은 화살표 형태로 표기한다. (* increase : int -> int *) let increase x = x + 1 화살표 앞의 타입은 매개변수(parameter)들의 타입이고, 맨 뒤의 타입은 함수의 반환값이 무슨 타입인지가 적힌다. 굳이 앞과 맨 뒤로 나눈 이유는 매개변수가 여러개 올 수 있기 때문이다. 예를들어 변수 3개를 받아 모두 더해서 넘기는 함수를 만든다고 하자. let sum x y z = x + y + z 이런 함수는 타입을 어떻게 적어야할까? 그냥, int,int,int -> int 이렇게 하면 되는걸까? 아쉽게도 Ocaml에서는 매개변수가 2개 이상인 경우 curried form으로 표시한다. Curring은 N개의 매개변수를 갖는 하나의 함수가 있을때, 1개의 매개변수..
[Ocaml] Ocaml의 컨셉에 대해
·
언어/Ocaml
Ocaml은 Caml이라는 언어에 객체지향을 섞은 ML family에 속하는 언어이다. 함수형 언어인 여러 언어들이 그렇듯 함수는 first-class value로 값으로 사용된다. 함수가 값으로 사용된다는게 무슨말이냐고 할 수 있는데, 그건 차차 느끼자. 처음부터 파고들면 머리아프다. Statement와 Expression에 대해 Statement(구문)와 Expression(표현식)에 대해서 잠시 소개할 예정이다. 구문의 정의란 이렇다. Statement : 실행시 프로그램의 상태전이를 수행하는 언어의 구성요소. ex) int x = 3; 한줄 전부가 구문이다. 메모리 상태를 변경하면 상태 전이가 일어났다고 한다. 메모리에 공간을 잡고 값을 할당하는 짓이 상태전이의 한 형태이다. 또는 이미 할당된 변..
[C언어] 배열 요소 접근과 포인터의 관계
·
언어/C
배열 요소에 접근하는 방법 1. 대괄호( [ ] ) 기본적인 배열의 요소의 접근은 배열의 이름 오른쪽에 대괄호를 치면 됩니다. int a[3] = {1, 2, 3}; printf("%d\n", a[0]); 하지만 이런 방법 외에도 포인터를 통해 배열 요소에 접근할 수 있습니다. 2. 포인터 변수의 역참조 연산자( * ) 기본적으로 배열의 이름은 그 자체로 해당 배열의 시작 주소와 같습니다. 다만 이 시작 주소로부터 특정 배열에 접근할 때는 고려할 사항이 있습니다. 우선 배열은 다차원 배열이 될 수 있고, 차원 수에 따라 역참조 연산자( * )를 몇번 붙여야 하는지 알 수 있습니다. 예를 들어 다음과 같이 1차원 배열이 있다고 해보겠습니다. int arr[5] = {1, 2, 3, 4, 5}; int *p..
[C언어] 주소에 대한 swap 구현
·
언어/C
값에 대한 swap C언어에서 함수로 값을 넘길때는 call by value기 때문에 모든 값이 복사되어 넘어갑니다. #include void swapValue(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int num, num2; num = 1; num2 = 2; swapValue(&num, &num2); printf("%d %d\n", num, num2); } 따라서 함수를 통해 두 변수의 값을 바꿔주기 위해서는 1. 주소를 복사해서 인자로 넘긴다. 2. 주소에 접근(* 연산자)해서 직접 값을 바꿔준다. 라는 두가지 단계를 통해 값에 대한 swap을 구현할 수 있었습니다. 주소에 대한 swap #include int main..
[C언어] 함수 포인터
·
언어/C
함수 포인터 함수는 전역 스코프에 선언하고, 다른 함수에서 호출해서 사용할 수 있습니다. 이때 함수는 메모리 영역중, code 영역에 함수 정의가 저장됩니다. 이때 함수의 이름은 함수 정의가 있는 메모리의 시작 위치, 즉 주소입니다. 따라서 함수명도 포인터 변수에 넣어서 사용할 수 있는데, 그것이 함수 포인터입니다. 함수 포인터 사용법 #include int sum(int x, int y) { return x + y; } int main() { int (*fp)(int, int); fp = sum; int res = fp(10, 20); printf("%d\n", res); } 함수 포인터의 선언은 좀 복잡하게 생겼습니다. 함수 포인터의 이름이 괄호 안에 들어가있는 형태입니다. 괄호를 제거하면, 주소를 ..
[C언어] Dangling Pointer와 Memory Leak
·
언어/C
Dangling Pointer Dangling Pointer는 직역하면 매달린 포인터입니다. 마치 전연인을 잊지 못하고 매달리는 누군가의 모습을 생각해보면 좋겠습니다. 이미 그 사람은 마음이 떴는데 말입니다. #include #include int main() { int *a = (int *)malloc(sizeof(int)); *a = 50; int *b = a; free(a); *b = 50; } 위 코드는 Dangling Pointer를 잘 보여주는 예시입니다. a의 주소를 b가 가지고 있지만 free 해버린 주소에 b로 접근하여 새로운 값을 할당하려 하면 오류가 발생합니다. 이렇게 이미 free 함수를 통해 해제한 메모리에 대한 주소를 가지고있는 포인터를 Dangling Pointer라고 합니다...