관리 메뉴

개발자비행일지

OCAML 자료형 본문

▶ 연구일지

OCAML 자료형

Cyber0946 2020. 3. 18. 20:32
연산식 

컴퓨터가 계산을 수행하기 위해선 먼저 계산의 대상체를 결정해야 한다. 이러한 계산의 대상체를 우리는 자료형(data type)라고 부른다. 기본적인 자료형으로 다음의 네 가지가 잇다.

  • 정수 integer
  • 부동소수  floating-point number, 이는 수학에서 다루는 실수(real number)를 근사적으로 표현한다. 
  • 문자열 character string은 연속된 문자들로 이루어진다. 
  • 불린형 값 boolean value은 참과 거짓 중의 하나를 나타낸다. 보통 true와 false를 나타낸다. 

각각의 자료형은 상수 constant를 표현하는 방식과 기초적인 형태의 계산을 수행하는 연산자를 제공한다. 

그리고 서로 다른 자료형을 구별하기 위해서 type이라는 catagorry를 통해서 구분한다.

정수

정수는 수학에서와 같은 표기법을 이용한다. 예를 들어 0, 1,2는 각각 정수 0,1,2,를 나타내는 상수연산식이다. 정수의 타입은 int로 표시된다. 

ocaml에 다음을 입력해서 확인할 수 있다. 

#1;; 

-: int =1

정수 자료형에서 사용하는 연산자는 덧셈+, 뺄셈-, 곱셈 *, 나눗셈/, 나머지 계산 mod가 있다. 이들 연산자는 피연산자

operand라고 불리는 두개의 정수를 받아서 새로운 정수를 넘기는 계산을 수행한다. 

사용방식은 수학에서와 같이 첫번째 피연산자를 적고 연산자를 적은 뒤 두번째 피연산자를 적는다. 

이렇게 피연산자와 연산자의 조합을 연산식 expression 이라 부른다. 

이러한 연산식 expression은 아래와 같은 입력과 출력을 통해 확인할 수 있다. 

#1+2;;

-: int = 3

피연산자를 두개 필요로 하는 연산자를 이진 연산자 binary operator라고 부르고 하나만 필요로 하는 연산자를 

일진연산자 unary operator라고 부른다. 

연산자의 우선순위

여러개의 연산자를 이용하는 연산식에서는 연산자들 간의 우선순위를 지정해 줄 필요가 있다. 만약 우선순위가 같은 연산자가 존재한다면, 연산자의 결합성을 고려해서 진행한다. 이진연산자는 왼쪽으로 결합한다. 

부동소수

부동소수는 소수점이 있는 자료형이다. 예를 들어 0.0, 1.0, 3.141592는 각각 부동소수 0.0, 1.0, 3.141592를 나타내는 상수연산식이다. 소수점 이하에 0만 있다면 생략할 수 있다. 예를 들면 1.0은 1.으로 적어도 된다. 부동소수의 타입은 float로 표시된다.

  부동소수는 정수와 엄격히 구분된다. 예를 들어 0이란 숫자는 수학에서는 정수로도 해석할 수 있고 실수로도 해석할 수 있지만 연산식에서 부동소수로 나타내고자 하면 소수점을 이용하여 부동 소수임을 반드시 명시하여야 한다. 

#0;;

- : int =0

# 0.0;;

- : float =0.

위의 예를 통해 볼 때, 0은 int 타입의 정수로 해석되지만, 0.0은 float 타입의 부동소수로 해석된다. 

부동소수를 위한 연산자로는 정수와 마찬가지로 부호를 바꾸는 일진연산자 -.와 이진연산자 덧셈 +., 뺄셈 -., 곱셈 *.,나눗셈/. 이 있다. 이들 연산자의 끝에는 .이 반드시 붙어야 하며 이는 정수를 위한 연산자와 구별하기 위함이다. 추가로 지수승을 계싼하는 이진연산자 **이 있다. 이들 연산자는 하나 또는 두개의 부동소수점을 받아서 새로운 부동소수점을 결과값으로 넘긴다.

정수를 위한 연산자에서처럼 일진연산자 -.이 우선순위가 가장 높고, ** 이 그 다음으로 우선순위가 높고, *.,/.이 그 다음이며,+.,-.이 우선순위가 가장 낮다. 

#모든 이진연산자는 왼쪽으로 결합하지만 지수승 연산자 **는 오른쪽으로 결합한다. 

문자열

문자열은 연속된 문자들로 우리어진 자료형이다. 상수연산식은 항 쌍의 따옴표 " " 사이에 문자들을 나열함으로써 만들어지며 문자열은 공백문자를 포함 할 수 있다. 문자열의 타입은string으로 표시된다. 

# "Hello World!";;

-: string = "Hello World!"

불린형 값 

불린형 값은 참 거짓을 나타내는 상수연산식인 true와 거짓을 타나내는 상수연산식 false을 이용한다. 불린형 값의 타입은 bool로 표시된다. 

불린형 값을 위한 연산자는 흔히 논리연산자 logical operator라고 불린다. 논리연산자에는 부정negation을 계산하는 not, 결합conjuction을 계산하는 이진연산자 &&, 이접disjunction을 계산하는 이진연산자 ||가 있다.

연산자 

  • =는 두 피연산자의 크기가 같은면 true, 다르면 false를 넘긴다. 
  • <>는 =의 반대로서 두 피연산자의 크기가 다른 경우에 true를 넘긴다. 
  • <,>,>=,>=는 수학에서와 같은 의미로 이용된다. 
계산의 오류 

컴퓨터를 이용한 계산은 매우 빠르지만 상황에 따라서는 부정확한 결과가 산출되거나 계산과정이 중단되는 사태가 발생할 수도 있다. 대표적인 예로 넘침현상, 정확도손실, 예외상황이 있다. 

넘침현상

컴퓨터의 정수계산의 대부분 정확하다. 그러나 컴퓨터의 기억장치는 정보저장 용량에 한계가 있고 이는 표현할 수 있는 정수의 개수에도 한계가 있음을 의미한다. 예를 들어 정수 하나를 저장하는데 32비트의 기억장치를 할당하는 컴퓨터를 생각해보자. 1비트는 켜짐 또는 꺼짐 중의 하나의 상태를 표현할 수 있는 용량이다. 따라서 32비트는 총 2의 32승 개의 상태를 표현할 수 있다. 32비트를 사용해서 정수를 표현하고자 할 때 보통 -2의 31승 부터 2의 31승 -1 까지의 정수를 표현할 수 있다. 

OCAML의 경우에는 정수표현에 31비트를 사용하며, -2의 30승 부터 2의 30승  -1 까지의 정수, 즉 -1073741824 부터

1073741823까지의 정수만을 표현할 수 있다. 

정확도 손실

정수의 경우와 마찬가지로 부동소수를 표현하는데 있어서도 제한된 용량의 기억장치를 이용하므로 표현할 수 있는 부동소수의 개수에는 한계가 있다. 이는 원하는 부동소수와는 약간 차이가 나는 계산 결과가 생성되는 현상으로 이어지는데 이를 정확도손실이라고 한다. 

#0.99999999999999;;

- : float = 0.999999999999999

# 0.9999999999999999;;

- : float = 0.999999999999999889

# 0.99999999999999999;;

- : float = 1.

#위의 예에서 첫번째 부동소수는 표현 범위내의 값이여서 입력한 데로 인식하지만, 두번째 부동소수는 가장 가까운 부동소수로 변환되어 인식이 되고 세번째 부동소수는 1.0으로 인식 되고 있다. 

부동소수 표현의 한계는 부동소수 계산이 진행될 때마다 정확도 손실이 발생할 수 있음을 의미한다. 

예외상황

넘침현상과 정확도손실은 계산의 결과에 오류가 발생하는 경우지만 계산 자체가 중단되지는 않는다. 하지만 예외상황은 더 이상 계산을 할 수 없는 상황을 가리킨다. 

대표적인 예로 정수 계산에서 0으로 나누기를 한 경우이다. 

#1/0;; 

Exception: Division_by_zero

자료형 요약