자료형
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
자료형은 프로그래밍 언어에서 데이터의 종류를 나타내며, 효율적인 기계 표현 선택과 데이터 해석에 대한 제약 조건을 정의한다. 자료형은 언어에 따라 다양한 방식으로 구현되며, 프로그래머는 새로운 자료형을 정의하여 기존 유형을 결합할 수 있다. 자료형은 구문론적 정의, 표현, 표현과 동작, 값 공간, 값 공간과 동작 등 다양한 방식으로 정의되며, 원시, 복합, 기본, 생성, 원자, 사용자 정의 등으로 분류된다. 또한, 부울, 정수, 부동 소수점, 문자열, 배열, 레코드, 객체 등 다양한 종류의 자료형이 존재하며, 추상 자료형, 포인터, 함수, 메타 타입 등과 같은 특수한 자료형도 존재한다.
더 읽어볼만한 페이지
- 프로그래밍 언어 개념 - 참조
참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다. - 프로그래밍 언어 개념 - 다형성 (컴퓨터 과학)
다형성은 프로그래밍 언어에서 이름이 여러 자료형에 사용되거나 객체가 여러 타입으로 취급되는 능력으로, 코드 재사용성과 유연성을 높이며 임시 다형성, 매개변수 다형성, 서브타이핑 등으로 분류되고 객체 지향 프로그래밍의 중요한 특징이며 정적, 동적 다형성으로 구현된다. - 프로그래밍 구성체 - 형 변환
형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다. - 프로그래밍 구성체 - 연산자 오버로딩
연산자 오버로딩은 프로그래밍 언어에서 기존 연산자를 사용자 정의 자료형에 대해 재정의하여 내장 자료형처럼 다루도록 하는 기능으로, 코드 가독성과 표현력을 높이지만 남용 시 코드 의미를 모호하게 만들 수 있다. - 자료형 - 참조
참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다. - 자료형 - 익명 함수
익명 함수는 이름이 없는 함수로, 람다 추상, 람다 함수, 람다 표현식, 화살표 함수 등으로 불리며, 함수형 프로그래밍 언어에서 람다식 형태로 많이 사용되고 고차 함수의 인수, 클로저, 커링 등에 활용되지만, 재귀 호출의 어려움이나 기능 제한과 같은 단점도 존재한다.
자료형 |
---|
2. 개념
자료형(data type)은 컴퓨터 기억 장치에 저장된 값이나 객체의 표현, 해석, 구조를 설명하며, 타입 시스템 안에서 데이터의 해석 방식을 정의한다. 타입 시스템은 다양한 수준의 타입 안전성을 보장하고, 자료형 정보를 활용하여 프로그램이 데이터에 접근하고 이를 사용하는 방식의 유효성을 검증한다. 자료형은 "프로그램을 실행하지 않고도 결정할 수 있는 프로그램의 특성"으로 정의될 수 있다.[21]
자료형은 컴퓨터와 프로그래머에게 다루고 있는 데이터가 어떤 종류인지 알려주는 속성이다. 이는 해당 데이터가 가질 수 있는 값의 범위나 적용할 수 있는 연산을 제한한다. 예를 들어, 자바에서 'int' 자료형은 -2,147,483,648부터 2,147,483,647까지의 32비트 정수 값을 나타내며, 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 정수 연산을 수행할 수 있도록 정의한다.
거의 모든 프로그래밍 언어는 명시적으로 자료형 개념을 포함하며, 일반적으로 다음과 같은 기본 자료형들을 제공한다.
- 정수 (integer)
- 불린 (boolean)
- 문자 한 개 (character)
- 부동소수점 (floating-point number), 종종 실수라고도 불림
- 숫자나 문자로 이루어진 문자열 (string)
자료형은 데이터의 유사성, 사용 편의성, 또는 특정 부분에 대한 주의 집중을 위해 지정될 수 있다. 이는 복잡한 정의를 이해하는 데 도움을 주는 중요한 조직화 도구이기도 하다. 명시적인 자료형 선언은 컴파일러가 효율적인 기계어 표현을 선택하도록 돕지만, 자료형이 제공하는 개념적 구조 역시 중요하다.[3]
언어에 따라 서로 다른 자료형을 사용하거나, 유사한 이름의 자료형이라도 다른 의미를 가질 수 있다. 예를 들어, 파이썬에서 'int'는 임의 정밀도 정수를 나타내며 일반적인 숫자 연산을 지원한다. 반면, 자바에서 'int'는 -2,147,483,648에서 2,147,483,647 범위의 32비트 정수를 의미하며, 오버플로가 발생하면 값이 순환(wrap around)된다. 러스트에서는 이 32비트 정수 유형을 'i32'로 표기하며, 디버그 모드에서 오버플로 발생 시 프로그램 실행을 중단(panic)시킨다.[4]
대부분의 프로그래밍 언어는 프로그래머가 기존 자료형의 여러 요소를 결합하고 새로운 자료형의 유효한 연산을 정의하여 추가적인 자료형을 정의할 수 있도록 허용한다. 예를 들어, 프로그래머는 "사람이 탄생일과 이름을 포함하고 있다"라고 해석되는 데이터를 지정한 새로운 자료형 "사람"을 만들거나, 실수부와 허수부를 포함하는 "복소수" 자료형, 또는 빨강, 녹색 및 파랑 각각의 양을 나타내는 세 개의 바이트와 색상의 이름을 나타내는 문자열로 표현되는 "색상" 자료형을 만들 수 있다.
자료형은 이를 정의, 구현 및 사용하는 다양한 방법을 제공하는 타입 시스템 내에서 사용된다. 타입 시스템에서 자료형은 컴퓨터 메모리에 저장된 값 또는 객체의 표현, 해석 및 구조를 설명하면서 데이터 해석에 가해지는 제약 조건을 나타낸다. 타입 시스템은 자료형 정보를 사용하여 데이터에 액세스하거나 조작하는 컴퓨터 프로그램의 정확성을 확인한다. 컴파일러는 값의 정적 타입을 사용하여 필요한 저장 공간과 해당 값에 대한 연산을 위한 알고리즘 선택을 최적화할 수 있다. 많은 C 컴파일러에서 'float' 자료형은 예를 들어 단정밀도 부동 소수점 숫자에 대한 IEEE 사양에 따라 32 비트로 표현된다. 따라서 해당 값에 대해 부동 소수점 특정 마이크로프로세서 연산 (부동 소수점 덧셈, 곱셈 등)을 사용한다.
대부분의 통계적 자료형은 프로그래밍에서 유사한 유형을 가지며, 그 반대도 마찬가지이다. 다음 표에서 볼 수 있다.
통계 | 프로그래밍 |
---|---|
실수 값 (구간 척도) | 부동소수점 |
실수 값 (비율 척도) | |
계수 데이터 (보통 음수가 아님) | 정수 |
이진 데이터 | 부울 |
범주형 데이터 | 열거형 |
랜덤 벡터 | 리스트 또는 배열 |
랜덤 행렬 | 2차원 배열 |
랜덤 트리 | 트리 |
컴퓨터 과학자 데이비드 파르나스는 자료형의 다섯 가지 유형을 정의했다[17]:
- '''구문(syntactic)''': 단순한 표기이며 의미론이 없다. 단지 기호의 정합성을 중시한다.
- '''표현(representation)''': 의미론을 부여한다. 구성/구조/역할의 정합성을 중시한다. 숫자와 포인터 값의 차이도 이에 해당한다.
- '''표현 + 동작(representation and behaviour)''': 데이터 표현에 함수/연산자를 붙인 것.
- '''값 공간(value space)''': 데이터 표현의 논리곱이나 논리합 등를 이용한 공간 표현.
- '''값 공간 + 동작(value space and behaviour)''': 공간 표현에 함수/연산자를 붙인 것.
3. 자료형의 정의
컴퓨터 과학자 데이비드 파르나스는 문헌에서 사용된 "자료형"에 대한 다섯 가지 정의를 제시했다.[17]
; 구문론적 정의 (Syntactic)
: 자료형은 변수가 선언될 때 해당 변수와 관련된 순수한 구문적 표시(label)이다. 이 정의에서는 자료형이 특별한 의미를 가지지 않고, 기호의 문법적 정확성만을 중시한다. 이러한 접근은 부분 구조 자료형과 같은 고급 자료형 시스템에서 유용하지만, 자료형의 직관적인 의미를 파악하기는 어렵다.
; 표현 (Representation)
: 자료형은 더 기본적인 자료형(종종 기계 자료형)을 조합하여 구성하는 방식으로 정의된다. 이 정의는 자료형에 의미를 부여하며, 데이터의 구성, 구조, 역할의 정확성을 중시한다. 예를 들어, 숫자와 포인터 값의 차이를 구분하는 것이 여기에 해당한다.
; 표현 및 동작 (Representation and behaviour)
: 자료형은 데이터의 표현 방식과 해당 데이터를 다루는 연산자 또는 함수의 집합으로 정의된다.
; 값 공간 (Value space)
: 자료형은 변수가 가질 수 있는 값들의 집합으로 정의된다. 이 정의를 통해 자료형들의 분리된 합집합이나 데카르트 곱 (논리곱, 논리합 등 포함)을 이용하여 값의 공간을 표현할 수 있다.
; 값 공간 및 동작 (Value space and behaviour)
: 자료형은 변수가 가질 수 있는 값의 집합과, 이 값들에 적용될 수 있는 함수 또는 연산자의 집합으로 정의된다.
표현을 중시하는 정의는 ALGOL이나 파스칼 같은 명령형 언어에서 주로 사용되었다. 반면, 값 공간과 동작을 함께 정의하는 방식은 시뮬라나 CLU 같은 고급 언어나 객체 지향 모델과 더 잘 맞는다. 구조적 프로그래밍 모델은 동작(코드)을 자료 구조와 분리하는 경향이 있는데, 이러한 자료 구조를 일반 구식 데이터 구조(Plain Old Data Structure)라고 부르기도 한다.
4. 자료형의 분류
자료형은 여러 요인에 따라 분류될 수 있다.
- '''원시 자료형''' 또는 '''내장 자료형'''은 언어 구현에 내장된 자료형이다. 반면 '''사용자 정의 자료형'''은 프로그래머가 직접 정의하는 비원시 자료형이다. 예를 들어, 자바의 숫자형은 원시형이지만 클래스는 사용자 정의형이다.
- '''원자형''' 값은 더 이상 작은 구성 요소로 나눌 수 없는 단일 데이터 항목이다. 반면 '''복합 자료형''' 또는 '''집계형'''의 값은 개별적으로 접근할 수 있는 여러 데이터 항목의 모음이다.[5] 예를 들어 정수는 비트열로 구성되지만 보통 원자형으로 간주하며, 정수 배열은 명백히 복합형이다.
- '''기본 자료형''' 또는 '''근본 자료형'''은 기본적인 개념에서 정의되거나 요소들을 나열하여 정의된다. 반면 '''생성된 자료형''' 또는 '''파생 자료형'''은 다른 자료형을 기준으로 지정되고 부분적으로 정의된다. 모든 기본 자료형은 원자형이다.[6] 예를 들어, 정수는 수학적으로 정의된 기본 자료형이지만, 정수 배열은 배열 생성 규칙을 정수형에 적용하여 만들어진 파생 자료형이다.
문헌에 따라 원시, 내장, 기본, 원자, 근본 등의 용어가 서로 바꿔 사용되기도 한다.[7]
자료형의 종류는 각 프로그래밍 언어의 형 시스템에 따라 정의된다. 예를 들어, 숫자를 나타내는 형으로 C 언어는 `int`와 `float` 등을 가지지만, 자바스크립트는 `Number` 하나만 가진다. 각 언어마다 고유한 형 분류 체계가 있으며, 프로그래밍 언어 전반에 걸쳐 통용되는 관례적인 분류도 존재한다. 여러 관점에서 형을 분류할 수 있다.
- '''단순형/복합형''': 최소 단위의 형인가, 아니면 여러 형의 조합으로 이루어진 형인가를 기준으로 분류한다. (대수적 자료형 참고)
- '''언어 정의형/사용자 정의형''': 언어 자체에서 기본적으로 제공하는 형인가, 아니면 사용자가 직접 정의한 형인가를 기준으로 분류한다.
- '''first-class/non-first-class''': 함수에 인수로 전달하거나 함수의 반환값으로 사용할 수 있는 형인지 여부로 분류한다. (제1급 객체 참고)
또한, 처리계 구현 관점에서 레지스터와 같은 메모리 워드에 값이 직접 저장되는 형과, 워드에는 포인터가 저장되고 포인터가 가리키는 곳에 실제 값이 있는 형으로 분류하기도 한다. 전자를 즉치값(immediate)이라고 표현하기도 한다.[18] 포인터 자체에 형 정보를 포함시키는 경우도 있다(태그된 포인터).
자바의 경우, 클래스의 인스턴스인 모든 객체의 형을 "참조형"으로 분류하고, `int`와 같은 기본 숫자형 등은 "원시형"으로 분류한다. 자바에서 사용자는 클래스를 정의할 수 있으며, 이는 새로운 참조형을 만드는 것에 가깝다.
아래는 대표적인 자료형의 예시이다.
; 문자형/문자열형
:; 문자형: C/C++ 등에서는 수치형의 일종으로 취급하며, 문자를 별도의 단순형으로 다루지 않는 경우도 있다.
:; 문자열형: 별도의 문자열형 없이 문자형의 배열로 문자열을 나타내는 언어(예: C/C++)도 있고, 반대로 문자형 없이 문자열형만 있는 언어(예: 비주얼 베이직 버전 6까지)도 있다.
; 수치형: 정밀도, 크기, 처리 속도 간의 균형 때문에 크기와 정밀도가 다른 여러 형을 제공하는 언어가 많다.
:; 정수형: 정수를 다룬다.
::; 부호 있는 정수형: 음의 정수도 다룰 수 있다. 일반적으로 정수형은 부호가 있지만, 부호 있는 정수형과 부호 없는 정수형을 별도로 제공하는 언어도 있다.
::; 부호 없는 정수형: 0 또는 양의 정수만 다룰 수 있다.
:; 소수(소수점을 포함하는 수)를 표현하는 형
::; 부동소수점 수
::; 고정소수점 수
::; 십진형: 통화형, 금액형이라고도 불린다. 금액 계산 등에 적합하다고 여겨지지만, 실제로는 단순히 10진수 기반의 고정 소수점 또는 부동 소수점 표현인 경우가 많고, 통화나 금액 처리를 위한 특별한 기능이 없는 경우도 많다.
; 부울형: 논리형이라고도 한다. 대부분의 언어에서는 참(true)과 거짓(false) 두 값만 다루지만, 3치 논리를 지원하는 언어도 있다. 정수형의 1과 0 등에 참/거짓 의미를 부여하는 경우와 별도의 부울형을 가지는 경우가 있다.
; 날짜형: 날짜나 시각을 다룬다. 날짜와 시각을 별도의 형으로 구분하는 경우도 있다.
; 이진형: 이진 데이터를 다룬다. 별도의 이진형 없이 수치형 배열(예: C에서는 1바이트 정수형 배열)로 표현하는 언어도 있다. 고정 길이 이진형과 가변 길이 이진형으로 나뉘는 경우도 있다.
; 함수형: 제1급 함수를 지원하는 언어에서는 함수 자체를 값으로 취급할 수 있다.
; 포인터형: 참조형, 핸들형, 객체형 등으로도 불린다. 포인터형이라고 부를 때는 포인터 연산(주소 계산 등)이 가능한 경우가 많다. 내부적으로는 메모리 주소를 나타내는 정수형인 경우가 많다.
; void형: 함수의 반환값이나 인수가 없음을 나타내기 위한 형이다.
; 유닛형: 함수 반환값이나 인수가 의미 있는 값을 가지지 않음을 나타낸다. void형과 달리 유닛형은 실제로 값을 가지지만, 그 값은 정보가 없는 하나의 상태만을 나타낸다.
배열형, 함수형, 포인터형 등은 다른 형을 기반으로 만들어지는 경우가 많다. 예를 들어 "정수형의 배열", "문자열을 인수로 받아 정수를 반환하는 함수", "객체에 대한 포인터"와 같은 식이다. 일부 언어는 총칭형 등을 통해 이런 파생형을 일반화하여 다루는 구조를 제공한다.
; 배열형: 벡터형이라고도 한다. 같은 종류의 데이터를 순서대로 저장하는 구조이다.
; 리스트형: 배열형과 비슷하지만, 인덱스 번호 대신 데이터 간의 연결 관계(포인터)로 관리되는 경우가 많다.
; 튜플형: 페어형이라고도 한다. 고정된 개수의, 서로 다른 형의 값들을 묶어서 다루는 형이다.
; 수치형 (추가)
:; 복소수형: 복소수를 다룬다. 실수형이 있다면 이를 조합하여 구현할 수 있지만, 언어에 따라 기본형으로 제공되기도 한다.
:; 순허수형: 순허수만을 다룬다. 실수부가 필요 없어 메모리나 계산 비용을 절약할 수 있다.
:; 사원수형: 쿼터니언이라고도 한다. 3차원 컴퓨터 그래픽스 등에서 회전 표현에 유용하여 일부 언어에서 제공된다. 대부분 라이브러리를 통해 복합형으로 구현된다.
:; 유리수형: 유리수를 분모와 분자의 쌍으로 표현한다.
:; 임의 정밀도 정수형: 메모리가 허용하는 한, 매우 큰 정수를 정확하게 표현한다. 이를 기반으로 임의 정밀도 실수나 유리수를 구현하기도 한다.
:; 구간형: 어떤 값의 범위를 나타내는 형이다.
; 행렬형: 배열형과 비슷하지만, 행렬 곱셈과 같은 행렬 연산을 지원한다. 스칼라형·벡터형·행렬형을 구분하는 언어와, 스칼라나 벡터도 열수나 행수가 1인 행렬로 나타내는 언어가 있다.
5. 자료형의 종류
자료형의 종류는 각 프로그래밍 언어의 형 시스템에 따라 다르게 정의된다. 예를 들어, 숫자를 나타내는 형으로 C 언어의 형 시스템은 `int`와 `float` 등을 가지는 반면, JavaScript의 형 시스템은 `Number` 하나만 가진다. 각 언어의 형 시스템이 규정하는 분류 방식이 있으며, 프로그래밍 언어에 관계없이 통용되는 관례적인 분류도 존재한다. 자료형은 여러 관점에서 분류할 수 있다.
- '''단순형/복합형''': 자료형이 최소 단위의 형인지, 아니면 여러 형의 조합으로 이루어진 형인지에 따른 분류이다. (cf. 대수적 자료형)
- '''언어 정의형/사용자 정의형''': 언어 자체에서 기본적으로 제공하는 형인지, 아니면 사용자가 직접 정의한 형인지에 따른 분류이다.
- '''제1급/비제1급''' (First-class/Non-first-class): 해당 자료형의 값이 함수의 실제 인자나 반환값으로 사용될 수 있는지 여부에 따른 분류이다. (cf. 제1급 객체)
또한, 프로그래밍 언어 처리계의 구현 관점에서는 다음과 같이 분류하기도 한다.
- 값이 레지스터와 같은 워드(word)에 직접 저장되는 형
- 워드에는 포인터가 저장되고, 실제 값은 포인터가 가리키는 메모리 위치에 저장되는 형
언어 처리계 구현 관련 논문 등에서는 전자를 immediate|즉치값eng이라고 표현하기도 한다.[18] 포인터 자체에 형 정보를 포함시키는 경우도 있다(태그된 포인터, Tagged pointereng).
참고로 Java에서는 클래스의 인스턴스인 모든 객체의 형을 "참조형"으로 분류하고, `int`와 같이 그 외의 기본 형들을 "원시형"으로 분류한다. Java에서 사용자는 새로운 형을 직접 정의한다기보다는, 클래스를 정의한다고 보는 것이 더 정확하다.
5. 1. 기본 자료형
거의 모든 프로그래밍 언어는 기본적인 자료형의 개념을 포함하고 있으며, 이를 통해 컴퓨터와 프로그래머는 다루는 데이터의 종류를 알 수 있다. 자료형은 데이터가 가질 수 있는 값의 범위와 해당 데이터에 적용할 수 있는 연산을 제한한다.[21] 일반적으로 프로그래밍 언어에서 제공하는 기본적인 자료형은 다음과 같다.- 정수 (integer): 정수 값을 나타낸다. 대부분의 언어는 특정 범위로 제한된 정수형(예: C/C++의 `short`, `long`)을 제공하며, 파이썬의 `int`처럼 임의 정밀도 정수를 지원하는 경우도 있다. 반면 자바의 `int`는 32비트 범위(−2,147,483,648 ~ 2,147,483,647)로 고정되며, 오버플로 시 값이 순환(wrap)된다.[4] 정수형 데이터에는 덧셈, 뺄셈, 곱셈, 나눗셈 등의 산술 연산을 적용할 수 있다.
- 불린 (boolean): 참(True)과 거짓(False) 두 가지 값을 나타낸다. 논리 연산에 사용되며, 때로는 정수 값을 이용하여 0을 거짓으로, 0이 아닌 다른 값을 참으로 해석하기도 한다.
- 문자 (character): 단일 문자를 나타낸다. ASCII나 유니코드와 같은 문자 인코딩 표준에 따라 표현된다.
- 부동소수점 (floating-point number): 실수와 같이 소수점을 포함하는 수를 표현한다. 내부적으로는 보통 a × 2b 형태로 저장되며, 표현 가능한 값의 범위와 정밀도에 한계가 있다.
- 문자열 (string): 문자의 연속된 시퀀스를 나타낸다. 단어나 문장과 같은 텍스트 데이터를 저장하는 데 사용된다. 문자열은 길이가 고정되거나 가변적일 수 있다. `"1234"`와 같은 숫자 형태의 문자열은 숫자 값 `1234`와는 구별되지만, 일부 언어에서는 필요에 따라 자동으로 변환해주기도 한다.
이러한 기본 자료형은 통계학에서 사용되는 자료형과 유사한 개념을 공유하기도 한다.
통계 | 프로그래밍 |
---|---|
실수 값 (구간 척도) | 부동소수점 |
실수 값 (비율 척도) | |
계수 데이터 (보통 음수가 아님) | 정수 |
이진 데이터 | 부울 |
범주형 데이터 | 열거형 |
랜덤 벡터 | 리스트 또는 배열 |
랜덤 행렬 | 2차원 배열 |
랜덤 트리 | 트리 |
자료형은 여러 기준으로 분류될 수 있는데, 기본 자료형은 종종 언어 구현에 내장된 원시 자료형(primitive data type) 또는 내장 자료형(built-in data type)으로 불리기도 한다. 이는 사용자가 직접 정의하는 클래스나 구조체와 같은 사용자 정의 자료형(user-defined data type)과 구분된다.[7]
5. 2. 복합 자료형
''복합 자료형''(Composite data type) 또는 ''집계형''(Aggregate type)은 여러 개의 데이터 항목을 하나로 묶어 다루는 자료형이다.[5] 이는 구성 요소로 더 이상 나눌 수 없는 단일 데이터 항목인 ''원자형''(Atomic type)과 대비된다. 복합 자료형의 값은 개별적으로 접근할 수 있는 데이터 항목들의 모음으로 구성된다. 예를 들어, 정수는 내부적으로 비트의 연속이지만 보통 하나의 단위(원자형)로 취급되는 반면, 여러 개의 정수를 모아 놓은 배열은 대표적인 복합 자료형이다.[5]많은 프로그래밍 언어에서는 프로그래머가 기존의 여러 자료형 요소를 조합하여 새로운 복합 자료형을 직접 정의할 수 있게 한다. 가령, 사람의 이름(문자열)과 생년월일(날짜형) 정보를 함께 묶어 '사람'이라는 새로운 자료형을 만드는 것이 가능하다.
복합 자료형은 데이터를 구조화하고 저장하며 검색하는 데 매우 유용하며, 이러한 목적으로 자주 사용되는 복합 자료형들을 특별히 자료 구조라고 부르기도 한다. 주요 복합 자료형 및 자료 구조는 다음과 같다.
- '''배열''' (Array): 여러 개의 데이터를 연속된 메모리 공간에 저장하고, 각 데이터에 번호(인덱스)를 붙여 빠르게 접근할 수 있게 하는 구조이다. 벡터, 리스트, 시퀀스 등으로 불리기도 한다. 배열에 저장되는 데이터는 일반적으로 같은 종류여야 하며, 배열의 크기는 고정되거나 필요에 따라 늘어날 수 있다. 인덱스는 보통 특정 범위의 정수이지만, 그렇지 않은 경우 연관 배열로 구분될 수 있다. 모든 인덱스에 요소가 할당되지 않은 경우 희소 배열일 수 있다.
- '''레코드''' (Record): 서로 다른 종류의 데이터 항목들을 정해진 개수와 순서대로 묶어놓은 구조이다. 각 항목은 보통 이름(필드 또는 멤버)으로 구분하여 접근한다. 튜플이나 구조체라고도 불린다.
- '''객체''' (Object): 데이터 항목(필드)들과 그 데이터를 처리하는 함수(메서드)들을 하나로 묶은 것이다. 레코드와 유사하지만 데이터를 조작하는 기능까지 포함한다는 점에서 차이가 있다.
- '''리스트''' (List): 데이터를 순서대로 저장하는 구조이지만, 배열과 달리 각 데이터가 다음 데이터의 위치를 가리키는 방식으로 연결되어 있다. 단일 연결 리스트, 이중 연결 리스트 등이 있으며, 데이터의 추가나 삭제가 배열보다 용이할 수 있다. 인덱스가 아닌 포인터(전후 관계)로 관리되는 특징이 있다. 큐 등을 구현하는 데 사용될 수 있다.
- '''튜플''' (Tuple): 레코드와 유사하게 고정된 개수의 요소들을 순서대로 묶은 자료형이다. 페어(pair)는 두 개의 요소를 가진 튜플을 의미한다.
- '''합집합 자료형''' (Union Type): 여러 가능한 하위 자료형 중 하나의 값만을 저장할 수 있도록 정의된 자료형이다. 예를 들어, '정수 또는 실수'라는 합집합 자료형은 정수 값이나 실수 값 중 하나만 가질 수 있다. 어떤 하위 자료형의 값이 저장되어 있는지 표시하는 추가 정보(태그)를 포함하는 태그된 합집합(Tagged Union) 또는 변형(Variant) 타입도 있다.
- '''대수적 자료형''' (Algebraic Data Type, ADT): 합집합 자료형과 곱집합 자료형(레코드나 튜플처럼 여러 값을 함께 묶는 것)을 조합하여, 재귀적으로 정의될 수 있는 복합 자료형이다. 값은 어떤 종류인지 나타내는 '생성자'와 그에 따른 데이터 필드들로 구성된다. 패턴 매칭을 통해 값을 분석하고 필드를 추출할 수 있다. 옵션 타입이나 리스트, 이진 트리와 같은 트리 구조 등을 ADT로 정의할 수 있다.[10][11]
- '''행렬''' (Matrix): 숫자 데이터를 2차원의 행과 열 형태로 배열한 구조이다. 배열형과 비슷하지만, 행렬 곱셈과 같은 행렬 연산을 할 수 있다. 일부 언어에서는 스칼라나 벡터도 행 또는 열의 수가 1인 행렬로 취급하기도 한다.
5. 3. 추상 자료형
추상 자료형은 데이터의 구체적인 표현을 명시하지 않는 자료형이다. 대신, 자료형의 연산을 기반으로 한 형식적인 ''명세''를 사용하여 이를 설명한다. 명세의 모든 ''구현''은 주어진 규칙을 따라야 한다. 예를 들어, 스택은 후입선출(Last-In-First-Out) 규칙을 따르는 푸시/팝 연산을 가지며, 목록이나 배열을 사용하여 구체적으로 구현할 수 있다. 추상 자료형은 형식적인 의미론 및 프로그램 검증에 사용되며, 덜 엄격하게는 설계에도 사용된다.5. 4. 기타 자료형
주요 비합성 파생 자료형 중 하나는 포인터이다. 포인터는 다른 값의 메모리 주소를 사용하여 컴퓨터 메모리 어딘가에 저장된 다른 값을 직접 참조(또는 "가리키는")하는 자료형이다. 이는 기본적인 형태의 참조라고 할 수 있다. 예를 들어, 책의 페이지 번호는 다른 데이터를 참조하는 데이터의 일부로 볼 수 있다. 포인터는 종종 정수와 비슷한 형식으로 저장되지만, 유효하지 않은 메모리 주소를 가진 포인터를 사용하려고 하면 프로그램이 충돌할 수 있다. 이러한 위험 때문에 포인터 타입은 내부 표현이 같더라도 정수 타입과 구별된다.함수형 프로그래밍 언어는 함수를 별개의 데이터 유형으로 취급하여, 이 유형의 값을 변수에 저장하거나 다른 함수에 인자로 전달할 수 있게 한다. 자바스크립트와 같은 일부 다중 패러다임 언어도 함수를 데이터처럼 다루는 기능을 제공한다.[12] 현대적인 타입 시스템은 단순한 '함수 객체' 타입을 넘어, 인자와 반환 타입에 따라 함수 타입을 구별한다. 예를 들어, 정수를 받아 불리언 값을 반환하는 함수는 'Int -> Bool'과 같은 타입으로 표현될 수 있다. C에서는 함수가 일급 데이터 타입은 아니지만, 함수 포인터를 통해 프로그램에서 함수를 다룰 수 있다. 자바와 C++는 원래 함수 값을 직접 다루지 못했지만, C++11과 Java 8부터 이를 지원하기 시작했다.
자료형 생성자는 기존 자료형을 사용하여 새로운 자료형을 구성하는 방법으로, 0개 이상의 자료형을 인수로 받아 새로운 자료형을 만드는 연산자처럼 생각할 수 있다. 곱 자료형, 함수 자료형, 멱 자료형, 리스트 자료형 등이 자료형 생성자의 예가 될 수 있다.
양자화된 자료형은 술어 논리에 기반한다.
- 보편 양자화 타입 ('∀x.f(x)' 또는 'forall x. f x'): 모든 타입 'x'에 대해 본문 'f x'의 교집합이다. 즉, 이 타입의 값은 모든 'x'에 대해 'f x' 타입을 만족해야 한다.
- 존재 양자화 타입 ('∃x.f(x)' 또는 'exists x. f x'): 모든 타입 'x'에 대해 본문 'f x'의 합집합이다. 즉, 이 타입의 값은 어떤 특정 'x'에 대해 'f x' 타입을 만족하면 된다.
하스켈에서는 보편 양자화가 흔히 사용되지만, 존재 타입은 다른 방식으로 변환하여 표현해야 하는 경우가 있다.
세분화 타입은 특정 조건을 만족하는 값들만 포함하는 타입이다. 이 조건은 술어(predicate)로 표현되며, 해당 타입의 모든 요소는 이 술어를 참으로 만족해야 한다. 예를 들어, 5보다 큰 자연수의 타입은 '{n ∈ N | n > 5}' (여기서 N은 자연수 집합)와 같이 나타낼 수 있다.
종속 타입은 그 정의가 값 자체에 의존하는 타입이다.
- 종속 함수: 반환하는 값의 타입이 함수에 전달된 인자의 값(타입뿐만 아니라 실제 값)에 따라 달라질 수 있다.
- 종속 쌍: 쌍을 이루는 두 값 중, 두 번째 값의 타입이 첫 번째 값에 따라 결정될 수 있다.
교차 타입은 주어진 두 개 이상의 타입을 동시에 만족하는 값들을 포함하는 타입이다. 예를 들어, 자바에서 'Boolean' 클래스는 'Serializable' 인터페이스와 'Comparable' 인터페이스를 모두 구현하므로, 'Boolean' 타입의 객체는 'Serializable & Comparable'이라는 교차 타입의 멤버가 된다. 타입을 값의 집합으로 생각하면, 교차 타입 'σ ∩ τ'는 타입 σ와 τ의 집합론적 교집합에 해당한다. 특정 값 'x'에 따라 타입이 달라지는 종속 교차 타입 '(x : σ) ∩ τ'도 정의될 수 있다.[13]
메타 타입은 타입 정보를 데이터 자체로 표현하여 타입 검사나 반사(reflection)와 같은 기능을 가능하게 하는 타입이다. 이는 고차 타입 시스템에서 타입을 다른 타입으로부터 구성하고 함수에 값으로 전달하는 것과는 다른 접근 방식이다.
고급 프로그래밍 언어나 데이터베이스에서는 편의를 위해 날짜, 시간, 통화(화폐 가치)와 같이 실생활에서 자주 사용되는 데이터 형식을 미리 정의하여 제공하기도 한다.[14][15] 이러한 형식들은 언어 자체에 내장되어 있거나, 라이브러리를 통해 복합적인 형태로 구현될 수 있다.[16]
그 외에도 다음과 같은 특수한 목적의 자료형들이 존재한다.
- void형: 함수의 반환값이나 인자 등에서 해당 값이 '없음'을 나타내기 위한 타입이다. void형 자체의 값(객체)은 존재하지 않는다.
- 유닛형: void형과 유사하게 값이 '없음'을 나타내지만, 유닛형은 그 자체로 하나의 값을 가진다는 차이점이 있다.
참조
[1]
FOLDOC
[2]
서적
Data Structures & Algorithm Analysis in C++
Dover
[3]
간행물
Data Types as Lattices
1976-09
[4]
웹사이트
Rust RFCs - Integer Overflow
https://github.com/r[...]
The Rust Programming Language
2022-08-12
[5]
서적
Programming in C++
https://books.google[...]
Jones & Bartlett Learning
1998
[6]
간행물
ISO/IEC 11404
[7]
서적
TEXTBOOK OF COMPUTER SCIENCE FOR CLASS XI
https://books.google[...]
PHI Learning Pvt. Ltd.
2008-08-19
[8]
웹사이트
SC22/WG14 N2176
http://www.open-std.[...]
Wayback Machine
[9]
웹사이트
Integer benchmarks — mp++ 0.27 documentation
https://bluescarni.g[...]
[10]
웹사이트
6 Predefined Types and Classes
https://www.haskell.[...]
2022-06-15
[11]
웹사이트
Programming in Haskell: Lecture 22
https://www.cmi.ac.i[...]
Chennai Mathematical Institute
2022-08-10
[12]
서적
JavaScript: the definitive guide
O'Reilly & Associates
1997
[13]
conference
Dependent intersection: A new way of defining records in type theory
IEEE Computer Society
[14]
웹사이트
How SQL Server stores data types: money
https://bornsql.ca/b[...]
2020-05-27
[15]
웹사이트
Introduction to data types and field properties
https://support.micr[...]
2022-01-28
[16]
서적
R for data science: import, tidy, transform, visualize, and model data
2022-01-28
[17]
간행물
Abstract types defined as classes of variables
https://doi.org/10.1[...]
ACM Press
1976-03-01
[18]
문서
機械語における、命令の直後に引き続いたデータという意味のimmediate(即値)と、似ているが異なるものなので注意が必要。
[19]
웹인용
보관된 사본
http://foldoc.org/da[...]
2013-04-04
[20]
문서
"Shaffer, C.A. ''Data Structures and Algorthms'', 1.2"
[21]
문서
"''Programming Languages: Application and Interpretation'', Shriram Krishnamurthi, Brown University"
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com