개요
데이터를 효과적으로 처리하기 위해 대부분의 프로그래밍 언어에서는 타입 개념을 지원한다. 타입은 데이터 집합과 연산 집합의 결합이고, 데이터 집합은 처리 대상이 되는데 연산집합은 해당 데이터에 적용 가능한 연산의 집합이다.
연산이나 서브프로그램을 적용할 때 적용 전후의 타입이 연산이나 서브 프로그램의 정의와 일치하는지를 따져서 타입의 안정성을 다루고 타입안전은 타입오류가 발생하지 않는다는것을 뜻한다.
프로그램 안정성 측면에서 구별한다면,
- 강타입 : 모든 오류를 검출해 내는 언어로 Haskell. ML등
- 약타입 : 타입 오류를 검출하긴 하지만 일부 오류를 허용하는 언어고, C가 대표적이다. 공용체나 타입 캐스팅을 통해 타입검사를 피할 수 있다.
- 무타입 : 타입 선언문이 없고 어떤 대상의 타입이 계속 바뀔 수 있는 언어로 파이썬을 비롯한 대부분의 스크립트 언어가 해당한다. 변수 선언문도 없고 대입문에 의해 타입이 수시로 바뀌기 때문이다.
타입의 분류
타입에는 데이터의 형태에 따라서 정수형, 문자형, 배열, 구조체등 다양한 종류가 있다.
이러한 타입은 특성에 따라 원시타입, 사용자정의 타입으로 분류된다.
- 원시타입 : 프로그램에서 기본적으로 제공하여 사용자의 개입할 여지가 없는 타입으로 정수형, 실수형, 문자형, 논리형 등을 제공한다. C와 C++에서는 int, float, char, bool 등이 있고 Java에서는 int, float, char, boolean이 있다.
- 사용자 정의타입 : 사용자가 직접 정의하는 것으로 배열과 구조체가 있다. C에는 enum, 배열, struct, union 등이 있고 C++, Java에서는 enum, 배열, class 등이 있다
다른 분류 방법으로 데이터 요소에 따라 단순 타입과 복합타입으로 분류할 수 있다.
- 단순타입 : 데이터 집합의 요소가 하나의 데이터로만 구성된 타입으로 int, float, char, boolm eunm 등이 있다.
- 복합타입 : 집합요소가 데이터들의 구조로 구성된 타입으로 구조타입이라고도 불리며, 배열, struct, union, class 등이 있다.
단순타입
정수형 타입
정수형은 -100, -5, 0, 1, 100등과 같은 정수 데이터를 다루는 타입이다. 최소 데이터 집합 범위는 최소 비트를 사용하는 경우의 범위를 나타낸다. int형 타입은 16비트일 경우 -215(=-32,768)~215-1(=32,767)개이고, 36비트의 경우 -231(=2,147,483,648)~ 231-1(2,147,483,647)의 범위를 같는다. C와 C++에서는 insigned를 붙이면 무부호 정수형이 존재하는데 비트는 동일하지만 음수 부분이 없어진 대신 양수 범위가 확장된다. 16비트 unsigned int라면 0~216-1이 범위가 된다.
정수형의 연산집합은 기본적으로 덧셈, 뺼셈, 곱셈, 나눗셈의 사칙연산을 포함한다. 정수형에 대한 사칙연산의 결과 값도 동일한 정수형이 되므로 7/3 = 2.333.. 이아니라 2가 된다. 또한 32767 + 1의 경우 표현 범위를 넘어섰기떄문에 -32768로 표현된다.
실수형 타입
실수형은 소수점을 말하는 데이터 타입으로 실수데이터는 사용비트를 가수부-지수부-부호의 세 부분으로 나누어 표기하는 부동소수점 수로 표현하는 것이 일반적이다.
실수형을 나타내는 두 가지 타입은 표현방법이 다른데
float의 사용비트는
부호(1비트) - 지수부(8비트) - 가수부(23비트)
double의 경우
부호(1비트) - 지수부(11비트) - 가수부(52비트)
그리고 집합연산의 경우도 1.5 + 1.5를 더한다면 3이 아니라 3.0이 된다.
문자형 타입
문자형은 A, a,!,+등과같이 하나의 문자데이터를 다루며 아스키코드와 유니코드로 나타낸다. 문자형으로 char타입이 존재하고 8비트를 사용하고 자바에서는 16비트 집합에 유니코드를 포함한다.
'A' < 'B'는 문자형인 char타입을 8비트로 사용하는 정수형으로 간주하여 사칙연산을 한 것이다. 이것의 값은 참이다. 또한 'A' + 32의 연산결과는 'a'가 연산결과가 된다
논리형 타입
논리형은 참과 거짓의 논리데이터를 다룬다. 참과 거짓 두 데이터만 포함하며 C는 논리형으로 _Bool타입이 있고 1과 0으로 표현된다. C++는 bool Java는 boolean이 모두 true.false로 표현된다.
열거형 타입
열거형은 순서가 관계있는 이름들을 데이터로 다루는 타입으로 사용자정의 타입이다. C와 C++는 열거형으로 enum타입이 있다. enum {Jan, Feb, Mar, Apr,..., Dec}; 하면 Jan을 0으로 해서 순서대로 대응된다.
열거형 연산집합은 관계 연산을 ㅗ함하여 연산의 결괏값은 논리형이다. 예를 들어 Jan < Feb이다는 참이다.
'척척학사 > 프로그래밍 언어론' 카테고리의 다른 글
프로그래밍언어론 수식 (0) | 2023.11.06 |
---|---|
복합타입 (0) | 2023.11.04 |
프로그래밍 언어론 변수의 영역 (1) | 2023.10.24 |
변수와 바인딩 (0) | 2023.10.12 |
프로그래밍 언어의 구현 (1) | 2023.10.04 |