자료형

[섬네일|[파이썬 3의 표준 유형 계층 구조]]
**자료형**(資料型) 또는 **데이터 타입**()은 데이터 값의 컬렉션 또는 그룹으로, 일반적으로 가능한 값의 집합, 이러한 값에 허용되는 연산의 집합 및 이러한 값의 기계 유형으로서의 표현으로 지정된다. 프로그램의 자료형 사양은 변수나 함수 호출과 같은 식이 취할 수 있는 가능한 값을 제한한다. 리터럴 데이터의 경우 컴파일러 또는 인터프리터에게 프로그래머가 데이터를 어떻게 사용하려고 하는지 알려준다. 대부분의 프로그래밍 언어는 다양한 크기의 정수형, 부동소수점 숫자(실수를 근사하는), 문자 및 불리언의 기본 자료형을 지원한다.

## 개념

자료형은 유사성, 편의성 또는 주의 집중을 위해 여러 이유로 지정될 수 있다. 이는 복잡한 정의를 이해하는 데 도움이 되는 좋은 조직화의 문제인 경우가 많다. 거의 모든 프로그래밍 언어는 자료형의 개념을 명시적으로 포함하지만, 가능한 자료형은 종종 단순성, 계산 가능성 또는 규칙성의 고려 사항에 의해 제한된다. 명시적인 자료형 선언은 일반적으로 컴파일러가 효율적인 기계 표현을 선택하도록 허용하지만, 자료형이 제공하는 개념적 조직을 간과해서는 안 된다.

서로 다른 언어는 서로 다른 자료형 또는 서로 다른 의미를 가진 유사한 유형을 사용할 수 있다. 예를 들어, 파이썬 프로그래밍 언어에서 `int`는 덧셈, 뺄셈, 곱셈과 같은 전통적인 숫자 연산을 가진 임의 정밀도 정수를 나타낸다. 그러나 자바 프로그래밍 언어에서 `int` 유형은 −2,147,483,648부터 2,147,483,647까지의 값을 갖는 32비트 정수형 집합을 나타내며, 오버플로 시 랩어라운드되는 산술 연산을 갖는다. 러스트에서 이 32비트 정수 유형은 `i32`로 표시되며 디버그 모드에서 오버플로 시 패닉이 발생한다.

대부분의 프로그래밍 언어는 또한 프로그래머가 추가 자료형을 정의할 수 있도록 허용하는데, 일반적으로 다른 유형의 여러 요소를 결합하고 새 자료형의 유효한 연산을 정의하는 방식이다. 예를 들어, 프로그래머는 실제 및 가상 부분을 포함하는 "복소수"라는 새 자료형을 만들거나, 각 빨강, 녹색, 파랑의 양을 나타내는 세 바이트와 색상의 이름을 나타내는 문자열로 표현되는 색상 자료형을 만들 수 있다.

자료형은 유형 시스템 내에서 사용되며, 유형 시스템은 자료형을 정의, 구현 및 사용하는 다양한 방법을 제공한다. 유형 시스템에서 자료형은 데이터 해석에 부과되는 제약 조건을 나타내며, 컴퓨터 메모리에 저장된 값 또는 객체의 표현, 해석 및 구조를 설명한다. 유형 시스템은 자료형 정보를 사용하여 데이터를 액세스하거나 조작하는 컴퓨터 프로그램의 정확성을 확인한다. 컴파일러는 값의 정적 유형을 사용하여 필요한 저장 공간과 값에 대한 연산 알고리즘 선택을 최적화할 수 있다. 많은 C 컴파일러에서  자료형은 예를 들어 단정밀도 부동소수점 숫자 IEEE 사양에 따라 32 비트로 표현된다. 따라서 이러한 값에 대해 부동소수점 전용 마이크로프로세서 연산(부동소수점 덧셈, 곱셈 등)을 사용한다.

## 정의

는 문헌에서 (때로는 암묵적으로) 사용된 "유형"의 다섯 가지 정의를 식별했다.
; 구문론적: 유형은 선언될 때 변수와 연결되는 순전히 구문론적 레이블이다. 부분구조적 유형 시스템과 같은 고급 유형 시스템에 유용하지만, 이러한 정의는 유형의 직관적인 의미를 제공하지 않는다.
; 표현: 유형은 더 기본적인 유형(종종 기계 유형)의 구성으로 정의된다.
; 표현 및 동작: 유형은 해당 표현과 이러한 표현을 조작하는 연산자 집합으로 정의된다.
; 값 공간: 유형은 변수가 가질 수 있는 가능한 값의 집합이다. 이러한 정의를 통해 유형의 (분리된) 합집합 또는 카테시안 곱에 대해 이야기할 수 있다.
; 값 공간 및 동작: 유형은 변수가 가질 수 있는 값의 집합과 이러한 값에 적용할 수 있는 함수의 집합이다.

표현에 기반한 정의는 알골 및 파스칼과 같은 명령형 언어에서 자주 사용되었고, 값 공간 및 동작에 기반한 정의는 시뮬라 및 CLU와 같은 고급 언어에서 사용되었다. 동작을 포함하는 유형은 객체 지향 프로그래밍 모델과 더 밀접하게 일치하는 반면, 구조적 프로그래밍 모델은 코드를 포함하지 않는 경향이 있으며 평범한 옛날 데이터 구조라고 불린다.

## 분류

자료형은 여러 요인에 따라 분류될 수 있다.

* 원시 자료형 또는 내장 자료형은 언어 구현에 내장된 유형이다. 사용자 정의 자료형은 비원시 유형이다. 예를 들어, 자바의 숫자 유형은 원시적이지만 클래스는 사용자 정의이다.
* 원자형 유형의 값은 구성 부분으로 분해할 수 없는 단일 데이터 항목이다. 복합 자료형 또는 집합체 유형의 값은 개별적으로 액세스할 수 있는 데이터 항목의 컬렉션이다. 예를 들어, 정수는 일반적으로 비트 시퀀스로 구성되지만 원자로 간주되는 반면, 정수 배열은 확실히 복합적이다.
* 기본 자료형 또는 근본 자료형은 근본적인 개념으로부터 공리적으로 정의되거나 요소들의 열거에 의해 정의된다. 생성된 자료형 또는 파생 자료형은 다른 자료형을 기반으로 지정되고 부분적으로 정의된다. 모든 기본 유형은 원자적이다. 예를 들어, 정수는 수학적으로 정의된 기본 유형인 반면, 정수 배열은 정수 유형에 배열 유형 생성기를 적용한 결과이다.

용어는 다양하며, 문헌에서는 원시, 내장, 기본, 원자적, 근본적이라는 용어가 상호 교환적으로 사용될 수 있다.

## 예시

### 기계 자료형

디지털 전자 장치 기반 컴퓨터의 모든 데이터는 가장 낮은 수준에서 비트(대안 0과 1)로 표현된다. 가장 작은 주소 지정 가능 데이터 단위는 일반적으로 바이트(일반적으로 옥텟, 8비트)라고 불리는 비트 그룹이다. 기계어 명령어로 처리되는 단위는 워드(, 일반적으로 64비트)라고 불린다.

기계 자료형은 하드웨어에 대한 세밀한 제어를 노출하거나 제공하지만, 이는 또한 코드를 덜 이식 가능하게 만드는 구현 세부 사항을 노출할 수 있다. 따라서 기계 유형은 주로 시스템 프로그래밍 또는 저급 프로그래밍 언어에서 사용된다. 고급 언어에서 대부분의 자료형은 언어 정의 기계 표현을 가지지 않는다는 점에서 추상화된다. 예를 들어 C 프로그래밍 언어는 불리언, 정수, 부동소수점 숫자 등과 같은 유형을 제공하지만, 이러한 유형의 정확한 비트 표현은 구현 정의이다. 정확한 기계 표현을 가진 유일한 C 유형은 바이트를 나타내는 `char` 유형이다.

### 불리언 유형
불리언 자료형은 참과 거짓 값을 나타낸다. 두 가지 값만 가능하지만, 단일 비트를 저장하고 검색하는 데 더 많은 기계 명령이 필요하기 때문에 단일 비트보다는 바이트나 워드로 표현되는 경우가 더 많다. 많은 프로그래밍 언어에는 명시적인 불리언 유형이 없으며, 대신 정수 유형을 사용하고 (예를 들어) 0을 거짓으로, 다른 값을 참으로 해석한다.
불리언 데이터는 언어가 기계 언어로 해석되는 논리적 구조를 의미한다. 이 경우 불리언 0은 논리적 거짓을 의미한다. 참은 항상 0이 아닌 값, 특히 불리언 1로 알려진 1이다.

### 숫자 유형

거의 모든 프로그래밍 언어는 하나 이상의 정수형 자료형을 제공한다. C/C++에서 `short` 및 `long`과 해당 `unsigned` 변형과 같이 특정 범위로 제한된 소수의 미리 정의된 서브타입을 제공하거나, 1..12와 같은 서브범위(예: 파스칼/에이다)를 사용자가 자유롭게 정의하도록 허용할 수 있다. 대상 플랫폼에 해당하는 네이티브 유형이 존재하지 않으면 컴파일러는 기존 유형을 사용하여 코드로 분해한다. 예를 들어, 16비트 플랫폼에서 32비트 정수가 요청되면 컴파일러는 이를 두 개의 16비트 정수 배열로 암묵적으로 처리한다.

부동소수점 자료형은 특정 분수 값(유리수, 수학적으로)을 나타낸다. 최대값과 정밀도 모두에 미리 정의된 한계가 있지만, 때로는 실수 (수학적 실수)를 연상시키는 "실수"라고 오해될 수 있다. 일반적으로 내부적으로  (여기서 와 는 정수) 형태로 저장되지만, 익숙한 십진법 형태로 표시된다.

고정소수점 자료형은 금전적 가치를 나타내는 데 편리하다. 내부적으로는 종종 정수로 구현되어 미리 정의된 한계로 이어진다.

아키텍처 세부 사항에 독립하기 위해 빅넘 또는 임의 정밀도 `numeric` 유형이 제공될 수 있다. 이는 시스템의 사용 가능한 메모리 및 컴퓨팅 리소스에 의해서만 정밀도가 제한되는 정수 또는 유리수를 나타낸다. 기계 크기 값에 대한 산술 연산의 빅넘 구현은 해당 기계 연산보다 현저히 느리다.

### 열거형
열거형은 구별되는 값을 가지며, 이를 비교하고 할당할 수 있지만, 컴퓨터 메모리에서 어떤 특정 구체적인 표현을 반드시 가질 필요는 없다. 컴파일러와 인터프리터는 이를 임의로 표현할 수 있다. 예를 들어, 카드 한 벌의 네 가지 슈트는 CLUB, DIAMOND, HEART, SPADE라는 네 개의 열거자로 불릴 수 있으며, 이들은 suit라는 열거형에 속한다. 변수 V가 suit를 자료형으로 선언되면, 이 네 가지 값 중 하나를 할당할 수 있다. 일부 구현에서는 프로그래머가 열거 값에 정수 값을 할당하거나, 심지어 정수와 유형 동등하게 취급하도록 허용한다.

### 문자열 및 텍스트 유형

문자열은 단어나 플레인 텍스트를 저장하는 데 사용되는 문자 시퀀스로, 대부분 서식 있는 텍스트를 나타내는 텍스트 마크업 언어이다. 문자는 일부 알파벳의 글자, 숫자, 공백, 문장 부호 등이 될 수 있다. 문자는 ASCII 또는 유니코드와 같은 문자 집합에서 가져온다. 문자 및 문자열 유형은 문자 인코딩에 따라 다른 서브타입을 가질 수 있다. 원래 7비트 너비의 ASCII는 제한적이라고 밝혀졌고, 8, 16, 32비트 집합으로 대체되었으며, 이는 다양한 비라틴 알파벳(히브리어 및 중국어) 및 기타 기호를 인코딩할 수 있다. 문자열은 가변 길이 또는 고정 길이일 수 있으며, 일부 프로그래밍 언어에는 두 가지 유형이 모두 있다. 최대 크기에 따라 서브타입화될 수도 있다.

대부분의 문자 집합에는 숫자가 포함되어 있으므로 `"1234"`와 같은 숫자 문자열을 가질 수 있다. 이러한 숫자 문자열은 `1234`와 같은 숫자 값과 구별되는 것으로 간주되지만, 일부 언어는 이들 사이를 자동으로 변환한다.

### 공용체 유형

공용체 유형 정의는 인스턴스에 저장될 수 있는 허용된 서브유형(예: "float 또는 long integer")을 지정한다. 플로트와 정수를 포함하도록 정의될 수 있는 레코드와 대조적으로, 공용체는 한 번에 하나의 서브유형만 포함할 수 있다.

태그가 지정된 공용체(변형, 변형 레코드, 식별된 공용체 또는 분리합집합이라고도 함)는 향상된 유형 안전성을 위해 현재 유형을 나타내는 추가 필드를 포함한다.

### 대수적 자료형

대수적 자료형 (ADT)은 곱형의 재귀적인 합형일 수 있다. ADT의 값은 생성자 태그와 0개 이상의 필드 값으로 구성되며, 필드 값의 개수와 유형은 생성자에 의해 고정된다. ADT의 가능한 모든 값의 집합은 그 변형(필드들의 곱)의 가능한 모든 값의 집합의 집합론적 분리합집합(합)이다. 대수적 유형의 값은 패턴 매칭을 통해 분석되며, 이는 값의 생성자를 식별하고 포함된 필드를 추출한다.

생성자가 하나만 있으면 ADT는 튜플 또는 레코드와 유사한 곱형에 해당한다. 필드가 없는 생성자는 빈 곱(단위 유형)에 해당한다. 모든 생성자에 필드가 없으면 ADT는 열거형에 해당한다.

일반적인 ADT 중 하나는 하스켈에서 로 정의된 옵션 유형이다.

### 자료 구조

일부 유형은 데이터를 저장하고 검색하는 데 매우 유용하며 자료 구조라고 불린다. 일반적인 자료 구조는 다음과 같다.

* 배열(벡터, 리스트 또는 시퀀스라고도 함)은 여러 요소를 저장하고 개별 요소에 임의 접근을 제공한다. 배열의 요소는 일반적으로 (모든 상황에서 그런 것은 아니지만) 동일한 유형이어야 한다. 배열은 고정 길이 또는 확장 가능할 수 있다. 배열의 인덱스는 일반적으로 정수여야 하며(그렇지 않은 경우 연관 배열에 대해 이야기하여 이러한 완화를 강조할 수 있음), 특정 범위 내에 있어야 한다(해당 범위의 모든 인덱스가 요소에 해당하지 않는 경우 희소 배열일 수 있음).
* 레코드(튜플 또는 구조체라고도 함) 레코드는 가장 간단한 자료 구조 중 하나이다. 레코드는 다른 값을 포함하는 값으로, 일반적으로 고정된 수와 순서로, 일반적으로 이름으로 인덱싱된다. 레코드의 요소는 일반적으로 필드 또는 멤버라고 불린다.
* 객체는 레코드와 같이 여러 데이터 필드를 포함하며, 메서드라고 불리는 해당 필드에 액세스하거나 수정하는 여러 서브루틴도 제공한다.
* 단일 연결 리스트, 큐를 구현하는 데 사용될 수 있으며 하스켈에서 ADT 로 정의된다.
* 이진 트리, 빠른 검색을 허용하며 하스켈에서 ADT 로 정의될 수 있다.

### 추상 자료형

추상 자료형은 데이터의 구체적인 표현을 지정하지 않는 자료형이다. 대신, 자료형의 연산을 기반으로 한 형식 사양이 이를 설명하는 데 사용된다. 사양의 모든 구현은 주어진 규칙을 충족해야 한다. 예를 들어, 스택은 후입선출 규칙을 따르는 푸시/팝 연산을 가지며, 리스트 또는 배열을 사용하여 구체적으로 구현할 수 있다. 추상 자료형은 형식 의미론 및 프로그램 검증에서, 그리고 덜 엄격하게는 디자인에서 사용된다.

### 포인터 및 참조

주요 비복합 파생 유형은 포인터이며, 그 값은 주소를 사용하여 컴퓨터 메모리의 다른 곳에 저장된 다른 값을 직접 참조(또는 "가리킨다")하는 자료형이다. 이것은 원시적인 종류의 참조이다. (일상 용어로, 책의 페이지 번호는 다른 페이지를 참조하는 데이터 조각으로 간주될 수 있다). 포인터는 종종 정수와 유사한 형식으로 저장된다. 그러나 값이 유효한 메모리 주소가 아니었던 포인터를 역참조하거나 "찾아보면" 프로그램이 충돌할 수 있다. 이 잠재적인 문제를 해결하기 위해, 포인터 유형은 기본 표현이 동일하더라도 해당 정수 유형과 구별되는 것으로 간주된다.

### 함수 유형

함수형 프로그래밍 언어는 함수를 별개의 자료형으로 취급하며 이 유형의 값을 변수에 저장하고 함수에 전달할 수 있도록 한다. 자바스크립트와 같은 일부 다중 패러다임 언어는 함수를 데이터로 취급하는 메커니즘도 가지고 있다. 대부분의 현대 유형 시스템은 자바스크립트의 단순한 유형 "함수 객체"를 넘어, 정수를 취하고 불리언을 반환하는 함수를 나타내는 `Int -> Bool` 유형과 같이 인자 및 반환 유형에 따라 구별되는 함수 유형 패밀리를 가진다. C에서 함수는 일등 자료형이 아니지만 함수 포인터는 프로그램에 의해 조작될 수 있다. 자바와 C++는 원래 함수 값을 가지고 있지 않았지만 C++11과 자바 8에서 이를 추가했다.

### 유형 생성자

유형 생성자는 기존 유형에서 새로운 유형을 만들며, 0개 이상의 유형을 인수로 취하여 유형을 생성하는 연산자로 생각할 수 있다. 곱형, 함수형, 멱집합형 및 리스트형은 유형 생성자로 만들 수 있다.

### 한정자 유형

보편적으로 정량화된 유형과 존재적으로 정량화된 유형은 술어 논리에 기반한다. 보편적 정량화는 \forall x.f(x) 또는 `forall x. f x`로 쓰여지며, 모든 유형 `x`에 대한 본문 `f x`의 교차점, 즉 해당 값은 모든 `x`에 대해 `f x` 유형이다. 존재적 정량화는 \exists x.f(x) 또는 `exists x. f x`로 쓰여지며, 모든 유형 `x`에 대한 본문 `f x`의 합집합, 즉 해당 값은 일부 `x`에 대해 `f x` 유형이다.

하스켈에서는 보편적 정량화가 일반적으로 사용되지만, 존재적 유형은 `exists a. f a`를 `forall r. (forall a. f a -> r) -> r` 또는 유사한 유형으로 변환하여 인코딩해야 한다.

### 리파인먼트 유형

리파인먼트 유형은 정제된 유형의 모든 요소에 대해 참이라고 가정되는 술어를 갖춘 유형이다. 예를 들어, 5보다 큰 자연수 유형은 \{n\in \mathbb {N} \,|\,n>5\}로 쓸 수 있다.

### 의존형

의존형은 정의가 값에 의존하는 유형이다. 의존형의 두 가지 일반적인 예는 의존 함수와 의존 쌍이다. 의존 함수의 반환 유형은 인자 중 하나의 값(유형뿐만 아니라)에 의존할 수 있다. 의존 쌍은 첫 번째 값에 유형이 의존하는 두 번째 값을 가질 수 있다.

### 교차 유형

교차 유형은 두 가지 지정된 유형의 구성원인 값을 포함하는 유형이다. 예를 들어, 자바에서 클래스 은  및  인터페이스를 모두 구현한다. 따라서 유형 의 객체는 유형 의 구성원이다. 유형을 값 집합으로 간주하면 교차 유형 \sigma \cap \tau는 \sigma와 \tau의 집합론적 교집합이다. 유형 \tau가 항 변수 x에 의존할 수 있는 의존 교차 유형 (x : \sigma) \cap \tau를 정의하는 것도 가능하다.

### 메타 유형

일부 프로그래밍 언어는 유형 정보를 데이터로 표현하여 유형 성찰 및 반영 프로그래밍(리플렉션)을 가능하게 한다. 대조적으로, 고차 유형 시스템은 유형이 다른 유형에서 구성되고 함수에 값으로 전달될 수 있도록 허용하면서도 일반적으로 이를 기반으로 하는 계산적 결정은 피한다.

### 편의 유형
편의를 위해 고급 언어 및 데이터베이스는 시간, 날짜 및 금전적 가치(통화)와 같은 기성 "실세계" 자료형을 제공할 수 있다. 이러한 유형은 언어에 내장되어 있거나 라이브러리에서 복합 유형으로 구현될 수 있다.

## 참조


## 관련 문헌
* 
* 
* 

## 같이 보기

* 유형 이론
* 자료형 체계


분류:프로그래밍 언어 개념