재귀 자료형
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
재귀 자료형은 타입 이론에서 타입 변수가 타입 내에 나타나는 일반적인 형태를 가지며, 자기 자신을 참조하는 자료형을 정의한다. 이러한 자료형은 동형 재귀형과 동치 재귀형으로 나뉘며, 동형 재귀형은 롤과 언롤 연산을 통해 타입 간의 동형사상을 형성한다. 재귀 자료형은 하스켈, 타입스크립트 등 다양한 프로그래밍 언어에서 사용되며, 리스트, 트리와 같은 자료 구조를 표현하는 데 활용된다.
더 읽어볼만한 페이지
- 유형 이론 - 형 변환
형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다. - 유형 이론 - 대수적 자료형
대수적 자료형은 합 타입과 곱 타입을 조합하여 새로운 자료형을 정의하는 방법으로, 단일 연결 리스트나 이진 트리와 같은 자료 구조를 표현하고 패턴 매칭을 통해 자료형의 구조를 분해 및 처리하는 데 유용하며, 함수형 프로그래밍 언어에서 널리 사용된다. - 자료형 - 참조
참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다. - 자료형 - 익명 함수
익명 함수는 이름이 없는 함수로, 람다 추상, 람다 함수, 람다 표현식, 화살표 함수 등으로 불리며, 함수형 프로그래밍 언어에서 람다식 형태로 많이 사용되고 고차 함수의 인수, 클로저, 커링 등에 활용되지만, 재귀 호출의 어려움이나 기능 제한과 같은 단점도 존재한다.
재귀 자료형 | |
---|---|
개요 | |
정의 | 자기 자신을 참조하는 자료형 |
특징 | 함수형 프로그래밍에서 대수적 자료형과 밀접한 관련 타입 이론에서 귀납적 타입과 관련 자기 참조적 정의를 통해 무한한 구조를 표현 가능 |
예시 | |
연결 리스트 | 노드가 다음 노드를 가리키는 포인터를 포함하는 자료 구조 각 노드는 자기 참조적 속성을 가짐 |
트리 | 노드가 자식 노드를 가리키는 포인터를 포함하는 자료 구조 각 노드는 자기 참조적 속성을 가짐 |
프로그래밍 언어 지원 | |
지원 언어 | 하스켈 ML 스칼라 파이썬 (일부) |
활용 | |
용도 | 복잡한 자료 구조 표현 및 처리 |
2. 이론
타입 이론에서 재귀 자료형은 일반적인 형태 μα.T를 가지며, 여기서 타입 변수 α는 타입 T 내에 나타날 수 있으며 전체 타입 자체를 나타낸다.
예를 들어, 자연수 (페아노 산술 참조)는 다음과 같은 Haskell 자료형으로 정의될 수 있다.
```haskell
data Nat = Zero | Succ Nat
```
타입 이론에서는 와 같이 표현할 수 있다. 여기서 합 타입의 두 가지 경우는 Zero와 Succ 데이터 생성자를 나타낸다. Zero는 인수를 받지 않으며(단위 타입으로 표현됨), Succ는 다른 Nat을 받는다(의 또 다른 요소).
구조적 형 시스템에서 재귀형은 동형 재귀형(iso-recursive type)과 동치 재귀형(equi-recursive type)의 두 가지 형식으로 나뉜다.
- 동형 재귀 타입(Iso-recursive type): 재귀 타입 와 그 확장(또는 "언롤링") (여기서 는 X에서 모든 Z를 Y로 대체함을 나타냄)은 "롤"과 "언롤"이라는 특별한 항 구조체를 사용하여 서로 다른 타입으로 취급하며, 이들은 동형사상을 형성한다. 즉, 및 이며, 이 둘은 역함수이다. 동형 재귀 타입은 명목 객체 지향 프로그래밍 언어에서 볼 수 있는 자기 참조 타입 정의 형태를 포착하며, 함수형 프로그래밍 언어에서도 흔히 사용된다.[2]
- 동치 재귀 타입(Equi-recursive type): 재귀 타입 와 그 펼쳐진 형태 는 동일한 타입을 나타내는 것으로 간주된다. 대부분의 동치 재귀 타입 이론은 무한 확장을 가진 두 타입 표현식이 동일하다고 명시한다. 이러한 규칙 때문에 동치 재귀 타입은 동형 재귀 타입보다 타입 시스템에 더 많은 복잡성을 추가하며, 타입 검사 및 타입 추론과 같은 알고리즘 문제도 더 어렵다.[1]
타입스크립트에서는 타입 별칭에서 재귀가 허용되지만,[3] Miranda 프로그래밍 언어, OCaml에서는 타입 동의어에서 재귀가 허용되지 않는다(
-rectypes
플래그가 사용되거나 레코드 또는 변형이 아닌 경우).2. 1. 부분 형식화 (Amber 규칙)
부분 형식화에서 자주 사용되는 방법으로 Amber 규칙이 있다. μX.S <: μY.T인지 판별할 때, X <: Y라는 가정을 둔 다음, S <: T이면, μX.S <: μY.T로 판정한다.[6] 예를 들어 다음과 같은 Java 코드가 있다.```java
class ListA {
Integer value;
ListA next;
}
class ListB {
Object value;
ListB next;
}
```
ListA <: ListB인지 판별할 때, X는 ListA 내부에서 재귀적으로 사용되는 ListA를 가리키고, Y는 ListB 내부에서 재귀적으로 사용되는 ListB를 가리킨다. 따라서 X <: Y라는 가정을 두고, 나머지 value 부분이 Integer <: Object이므로, ListA <: ListB라고 판정한다. 재귀형끼리만 비교하고, 재귀형을 내부에서 이용하는 경우에는 전개하지 않으므로, 부분 형식화 판정이 유한 시간 내에 끝난다. Amber 규칙은 주로 명목적 형식 시스템에 가깝다.[6]
3. 예시
하스켈에서 리스트 자료형은 다음과 같이 정의된다.[5]
```haskell
data List a = Nil | Cons a (List a)
```
이는 'a'의 리스트가 비어있는 리스트이거나 'a'(리스트의 "머리")와 다른 리스트("꼬리")를 포함하는 '''cons cell''' 중 하나임을 나타낸다.
스탠다드 ML에서 트리와 숲 자료형은 빈 트리를 허용하며 다음과 같이 상호 재귀적으로 정의될 수 있다.
```sml
datatype 'a tree = Empty | Node of 'a * 'a forest
and 'a forest = Nil | Cons of 'a tree * 'a forest
```
하스켈에서도 트리와 숲 자료형은 다음과 유사하게 정의될 수 있다.
```haskell
data Tree a = Empty
| Node (a, Forest a)
data Forest a = Nil
| Cons (Tree a) (Forest a)
3. 1. 자바에서의 예시
javaclass List
E value;
List
}
```
이는 E형의 비어 있지 않은 리스트가 E형의 데이터 멤버와 나머지 리스트에 대한 다른 List 객체에 대한 참조(또는 리스트의 끝임을 나타내는 null 참조)를 포함함을 나타낸다.[5]
3. 2. 타입스크립트에서의 예시
타입스크립트에서는 형 에일리어스 안에서도 재귀를 사용할 수 있다.[4] 아래는 타입스크립트의 예시로, 형 에일리어스만으로 트리 구조의 형을 표현할 수 있다.```typescript
type Tree = number | Tree[];
let tree: Tree = [1, [2, 3]];
```[3]
4. 자료형의 종류
자료형은 크게 기본 자료형과 복합 자료형으로 나눌 수 있다. 기본 자료형은 더 이상 분해할 수 없는 기본적인 자료형이고, 복합 자료형은 여러 개의 기본 자료형이나 다른 복합 자료형을 묶어서 만든 자료형이다.
4. 1. 기본 자료형
기본 자료형은 더 이상 분해할 수 없는 가장 기본적인 데이터 단위를 나타낸다.4. 1. 1. 숫자형
4. 1. 2. 문자형
4. 1. 3. 논리형
불리언 자료형은 참(True) 또는 거짓(False) 값을 표현한다.[1]4. 1. 4. 기타 기본 자료형
4. 2. 복합 자료형
복합 자료형은 여러 개의 원시 자료형이나 다른 복합 자료형을 묶어서 만든 자료형이다.composite type|컴포지트 타입영어복합 자료형에는 배열, 구조체, 레코드 등이 있다.
4. 2. 1. 배열
배열은 동일한 자료형의 여러 값을 순서대로 저장하는 복합 자료형이다. 가변 길이 배열[1]묶음 | 내용 |
---|---|
복합 자료형 | 배열 |
4. 2. 2. 구조체와 레코드
구조체는 여러 자료형의 값을 묶어서 하나의 단위로 취급하는 자료형이다. 레코드는 구조체와 유사하지만, 각 필드에 이름을 붙여 접근할 수 있다는 차이점이 있다.[1]4. 2. 3. 기타 복합 자료형
다음은 기타 복합 자료형에 대한 내용이다.5. 관련 항목
참조
[1]
간행물
Numbering Matters: First-Order Canonical Forms for Second-Order Recursive Types
[2]
Proceedings
Revisiting iso-recursive subtyping
https://dl.acm.org/d[...]
[3]
TypeScript
"(More) Recursive Type Aliases - Announcing TypeScript 3.7 - TypeScript"
https://devblogs.mic[...]
[4]
TypeScript
"(More) Recursive Type Aliases - Announcing TypeScript 3.7 - TypeScript"
https://devblogs.mic[...]
[5]
서적
型システム入門 −プログラミング言語と型の理論−
オーム社
2013-03-26
[6]
서적
型システム入門 −プログラミング言語と型の理論−
オーム社
2013-03-26
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com