맨위로가기

자료형 체계

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

자료형 체계는 프로그래밍 언어에서 데이터의 종류를 분류하고, 연산의 가능 여부와 방식을 결정하는 시스템이다. 자료형 검사를 통해 프로그램이 자료형의 제약 조건을 지키는지 검증하며, 이는 컴파일 타임(정적 검사) 또는 런타임(동적 검사)에 수행될 수 있다. 정적 자료형 검사는 컴파일 시간에 오류를 발견하여 프로그램의 신뢰성을 높이지만, 유연성이 떨어질 수 있으며, 동적 자료형 검사는 런타임 오류 발생 가능성이 있지만 유연성이 높다. 자료형 체계는 강한/약한 자료형, 명시적/암시적 자료형, 이름/구조 기반 자료형 등으로 분류되며, 다형성, 덕 타이핑과 같은 개념을 포함한다. 프로그래밍 언어는 정적 및 동적 타이핑의 장단점을 고려하여 설계되며, 특수한 목적을 위한 종속 자료형, 선형 자료형, 교집합 자료형 등 다양한 자료형 체계를 제공한다. 자료형은 프로그램의 안전성, 효율성, 가독성, 유지보수성에 영향을 미치며, 프로젝트의 특성에 맞는 언어 선택이 중요하다.

더 읽어볼만한 페이지

  • 자료형 체계 - 상속 (객체 지향 프로그래밍)
    상속은 객체 지향 프로그래밍에서 클래스 간 관계를 설정하고 코드 재사용성을 높이는 핵심 메커니즘으로, 슈퍼클래스의 속성과 기능을 서브클래스가 이어받아 확장하며 차분 프로그래밍과 서브타이핑을 목적으로 사용되고, 메서드 오버라이딩을 통해 상속받은 기능을 변경하거나 확장할 수 있다.
  • 자료형 체계 - 명목적 자료형 체계
    명목적 자료형 체계는 변수의 자료형 이름이 같아야 호환되는 자료형 체계로, 이름이 다르면 구조가 같아도 다른 자료형으로 취급하여 자료형 안전성을 높이지만, 유연성이 떨어지는 단점이 있어 C++, C#, Java 등 다양한 언어에서 명목적 서브타이핑과 함께 사용된다.
  • 프로그램 분석 - 데이터 흐름 분석
    데이터 흐름 분석은 프로그램의 제어 흐름 그래프를 바탕으로 변수의 정의, 사용, 생존 여부를 분석하며, 전이 함수와 결합 연산을 통해 데이터 흐름 정보를 계산하고 반복적으로 갱신하여 해를 구한다.
  • 프로그램 분석 - 정적 프로그램 분석
    정적 프로그램 분석은 소프트웨어 개발 시 코드를 실행 없이 분석하여 오류, 보안 취약점, 코딩 표준 위반 등을 탐지하는 기술로, 개발 비용 절감, 품질 향상, 시스템 신뢰성 확보에 기여하며 다양한 레벨로 분석 가능하다.
  • 유형 이론 - 형 변환
    형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다.
  • 유형 이론 - 대수적 자료형
    대수적 자료형은 합 타입과 곱 타입을 조합하여 새로운 자료형을 정의하는 방법으로, 단일 연결 리스트나 이진 트리와 같은 자료 구조를 표현하고 패턴 매칭을 통해 자료형의 구조를 분해 및 처리하는 데 유용하며, 함수형 프로그래밍 언어에서 널리 사용된다.
자료형 체계
기본 정보
정보 시스템의 조직 구조로서의 개략도
정보 시스템의 조직 구조로서의 개략도
유형추상적 개념
분야전산학, 소프트웨어 공학, 프로그래밍 언어
관련 개념자료형, 프로그래밍 패러다임, 형 이론
google_map전산학
형 시스템 종류
주요 분류정적 형 지정 vs 동적 형 지정
강한 형 지정 vs 약한 형 지정
명시적 형 지정 vs 형 추론
이름 기반 형 시스템 vs 구조 기반 형 시스템
덕 타이핑
하위 분류부분형
재귀 자료형
부분 구조 형 시스템
종속형
점진적 형 지정
흐름 민감 형 지정
잠재적 형 지정
형 이론 개념
기본곱형 - 합형
교차형 - 합집합형
단위형 - 선택형
귀납형 - 정제형
최상위형 - 최하위형
함수형 - 몫형
전칭형 - 존재형
유일형 - 선형형

2. 자료형 검사

프로그램이 자료형의 제약 조건을 지키는지 검증하는 것을 자료형 검사라고 한다. 자료형 검사는 컴파일 시점(정적 검사) 또는 실행 시간(동적 검사)에 실행될 수 있다.
정적 자료형 검사는 컴파일 시점에 자료형 오류를 검출하여 프로그램의 안정성을 높인다. C, C++, 자바, C#, 하스켈 등이 대표적인 정적 자료형 언어이다. 컴파일 시점에 자료형 오류를 검출하므로, 개발 초기 단계에서 오류를 발견하여 수정할 수 있다. 프로그램 실행 시 자료형 검사를 생략할 수 있어 실행 속도가 빠르고 메모리 사용량이 적다. 다만, 실행 시간에는 자료형 오류가 발생하지 않을 일부 프로그램도 정적 검사에서 오류로 판정될 수 있다는 단점이 있다.
동적 자료형 검사는 실행 시간에 자료형 오류를 검출한다. 파이썬, 자바스크립트, 루비, PHP 등이 대표적인 동적 자료형 언어이다. 유연성이 높지만, 런타임 오류 발생 가능성이 있다. 런타임에 자료형 정보를 활용하여 함수 오버로드, 동적 디스패치 등 다양한 기능을 지원할 수 있다. 프로그램 실행 시마다 자료형 검사를 수행하므로 정적 자료형 검사에 비해 실행 속도가 느리고 메모리 사용량이 많을 수 있다.
정적 및 동적 자료형 검사의 조합: 일부 언어는 정적 자료형 검사와 동적 자료형 검사를 함께 사용하여 유연성과 안정성을 모두 확보한다. 자바, C# 등이 이러한 방식을 사용한다. 예를 들어 Java에서는 하위 형변환 등 일부 연산은 런타임에 자료형을 검사한다.

어떤 방식을 선택할지는 개발하는 프로그램의 특성, 개발 환경, 개발자의 선호도 등을 고려하여 결정해야 한다.

2. 1. 실제로 정적 및 동적 자료형 검사하기

프로그램이 자료형의 제약 조건을 지키는지 확인하는 것을 자료형 검사라고 한다. 자료형 검사는 컴파일 타임(정적 검사) 또는 런타임(동적 검사)에 실행될 수 있다.[38]

자료형 검사가 실행 시간이 아닌 컴파일 타임 동안 수행될 경우, 이를 정적 정형이라고 한다. 정적으로 정형된 언어로는 액션스크립트 3, 에이다, C, C++, C#, D, Eiffel, F#, 포트란, Go, 하스켈, JADE, 자바, ML, 오브젝티브-C, OCaml, 파스칼, (스칼라, 배열, 해시 및 서브루틴의 구별에 대하여) 그리고 스칼라 등이 있다.

정적 정형은 프로그램 검증의 제한된 형태이다(형 안전 참조). 따라서 많은 자료형 오류가 개발주기의 초기에 잡힐 수 있다. 정적 형 검사기는 오직 컴파일 타임에 결정될 수 있는 자료형 정보만을 평가하지만, 프로그램의 가능한 모든 입력에 대해 검사 조건을 확인할 수 있고 프로그램이 실행될 때마다 매번 자료형 검사를 반복할 필요가 없다. 또한 정적 형 검사가 이루어질 경우 실행 자료형 검사를 생략하고 다른 최적화를 수행할 수 있어, 프로그램 실행도 보다 효율적(즉, 빠르게 또는 감소된 메모리를 사용)으로 만들 수 있다.

어떤 자료형 정보는 오직 실행 시간에만 정해지기 때문에 정적 형 검사기는 보수적이다. 실행 시간에는 자료형 오류가 일어나지 않는 일부 프로그램이 정적 형 검사기에서는 거부될 수 있다. 예를 들어 표현식 `<complex test>`가 항상 실행 시간에서 `true`를 평가한다고 할 경우,

`if <complex test> then 42 else <type error>`

는 자료형 오류를 일으키며 거부될 것이다. 왜냐하면 정적 분석은 `else` 분기가 실행되지 않는다는 사실을 확인할 수 없기 때문이다.[38] 반면 정적 형 검사기의 보수적인 동작은 가끔씩 `<complex test>`를 `false`로 평가할 때 유익하다. 정적 자료형 검사기는 드물게 사용되는 코드 경로에서 자료형 오류를 감지할 수 있다. 정적 형 검사를 하지 않을 경우 코드 범위 테스트는 100% 범위에서도 이러한 자료형 오류를 발견하지 못할 수 있다.

자료형 검사의 대부분이 컴파일 타임이 아닌 실행 시간에 수행될 경우 ''동적 정형''이라고 한다. 동적 정형에서, 값은 자료형을 가지고 있지만 변수는 그렇지 않다. 즉, 변수는 모든 자료형의 값을 가질 수 있다. 동적으로 정형된 언어로는 APL, 얼랭, 그루비, 자바스크립트, 리스프, 루아, MATLAB/GNU 옥타브, (사용자 정의를 위한 자료형이지만 기본이 아닌 자료형), PHP, 프롤로그, 파이썬, 자이썬, 루비, 스몰토크, 클로저 그리고 Tcl 등이 있다.

동적으로 정형된 언어는 일반적으로 모든 런타임 개체가 자료형 정보를 함께 갖고 있다. 이런 런타임 자료형 정보는 함수 오버로드, 동적 디스패치, 게으른 바인딩, 다운캐스팅 등에도 사용될 수 있다.

더 넓게, 동적 정형은 동적 프로그래밍 언어 기능에 대한 지원을 향상시킬 수 있고, 런타임 데이터를 기반으로 한 기능과 자료형을 창출하는 것 등이 있다. 그럼에도 불구하고, 동적으로 정형된 언어는 일부 또는 전부 같은 기능을 지원하지 않아도, 일부 ''동적 프로그래밍 언어''는 정적으로 정형되어 있다. 한편, 동적 정형은 적은 ''선천적'' 보장을 제공한다. 동적으로 정형된 언어는 정적 자료형 검사기에 의해 무효로 지배될 일부 프로그램을 실행하려고 허용 및 시도하는데, 프로그램의 오류 때문이거나 정적 자료형 검사가 너무 보수적으로 되기 때문이다. 동적 정형은 런타임 자료형 오류가 발생할 수 있다. 즉, 런타임에서, 값은 예상치 못한 유형이 있을 수 있고, 그 자료형에 대한 무의미한 작업이 적용된다. 이런 오류가 프로그래밍 실수 구문에서 오랜 시간 후에 발생할 수 있다. 즉, 데이터의 잘못된 자료형의 장소로 전달되는 구문은 작성하지 않아야 한다. 이것은 버그를 찾기 어려울 수도 있다.

동적 정형 언어 체계들의 런타임 검사는 잠재적으로 정적으로 정형된 언어의 경우보다 더 정교할 수 있고, 그들은 동적인 정보뿐만 아니라 소스 코드로부터 정보를 사용할 수 있다. 한편, 런타임 검사는 오직 프로그램의 특정 실행에서 조건을 잡는 것을 주장하고, 검사는 매번 프로그램을 실행하는 동안 반복된다.

동적으로 정형된 언어의 개발은 자주 단위 테스트와 같은 프로그래밍 정책에 의해 지원된다. 테스트는 전문 소프트웨어 개발에서 핵심 방법이고, 동적으로 정형된 언어의 경우에 특히 중요하다. 실제로, 올바른 프로그램이 작동을 보장하기 위해 했던 테스트는 정적 자료형 검사보다 훨씬 넓은 오류 범위를 감지할 수 있지만, 반대로 정적 자료형 검사가 감지할 수 있는 오류를 종합적으로 검색할 수 없다.

프로그래밍 언어의 정적 정형의 존재가 반드시 모든 동적 정형 구조가 없는 상태를 의미하는 것은 아니다. 예를 들어, 자바와 다른 표면에서 정적으로 정형된 언어의 경우, 하위 형변환 및 런타임 자료형 검사에 따라 다른 종류의 작업을, 동적 정형의 형태로 지원한다. 더 일반적으로, 대부분의 프로그래밍 언어는 데이터를 서로 다른 '종류'를 통해, 서로소 합집합과, 변형 자료형 및 다형성 개체와 같은 파견에 대한 방식을 포함한다. 자료형 주석 또는 자료형 검사와 상호 작용조차 하지 않을 때 이러한 방식은 동적 정형 구현에서 실질적으로 유사하다. 정적 및 동적 정형 사이의 상호 작용에 대한 자세한 내용은 프로그래밍 언어를 참조한다.

특정 언어, 예를 들어 클로슈어는, 기본적으로는 동적으로 정하지만, 이 동작을 허용하는 것은 정적 정형에서의 결과로 명시적인 자료형의 사용 힌트를 통해 무시한다. 이러한 힌트를 사용하는 이유 중 하나는 코드의 성능에 민감한 부분에서 정적 정형의 성능 이점을 달성하는 것이다.

4.0의 출시로, 닷넷 프레임워크 '동적' 자료형의 '정적' 개체는 개체 참조를 해결하기 위해 동적 설비를 심문하는 닷넷 런타임에 대한 자리표시자에 의하여 [http://msdn.microsoft.com/ko-kr/library/dd233052(VS.100).aspx System.Dynamic 이름공간]을 통해 동적 정형의 정의 변종을 지원한다.

정적 및 동적 정형 사이의 선택은 트레이드오프를 필요로 한다.

정적 정형은 컴파일 타임에 안정적으로 자료형 오류를 찾을 수 있다. 이것은 제공되는 프로그램의 신뢰성이 증가할 것이다. 그러나, 프로그래머는 일반적으로 자료형 오류가 발생하는 방법을 통해 반대하고, 따라서 적절하게 코드에서 설계된 자료형을 대표해서 잡은 것으로 코딩한 이 버그의 비율을 통해 반대한다. 정적 정형 지지자들은 자료형 검사가 잘 되어있을 때 프로그램이 더 신뢰할 수 있다고 믿고, 동적 정형 지지자들은 안정적이고 작은 데이터베이스 버그가 증명된 배포 코드를 가리킨다. 자료형 체계의 강도가 증가된 다음에 정적 정형의 값은 아마도 증가할 것이다. 만약 프로그램에 사용되는 자료형이 프로그래머에 의해 제대로 선언되거나 정확하게 컴파일러에 유추되는 경우, 이러한 종속 ML과 에피그램으로 의존적으로 정형된 언어의 지지자들은 거의 모든 버그가 자료형 오류로 간주될 수 있는 제안을 한다.[39]

정적 정형은 보통 더 빠르게 실행하는 컴파일된 코드에서 발생한다. 컴파일러가 사용하는 정확한 자료형을 알고 있을 때, 그것은 최적화된 기계 코드를 생성할 수 있다. 더 나아가, 정적으로 정형된 언어를 위한 컴파일러는 어셈블러보다 쉽게 단축키를 찾을 수 있다. 일부 동적으로 정형된 언어와 같은 커먼 리스프는 매우 합리적인 최적화를 위한 옵션 정형을 허용한다. 정적 정형은 이것을 보급한다. 최적화를 참조한다.

반대로, 동적 정형은 컴파일러가 더 빠르게 실행할 것과 인터프리터가 동적으로 새로운 코드를 불러오는 것을 허용할 수 있고, 동적으로 정형된 언어에서의 소스 코드에 대한 변경 사항 때문에 수행하기 위해 덜 검사한 것과 코드를 되짚는 것에서 발생할 수 있다. 이것도 편집 - 컴파일 - 테스트 - 디버그 주기를 줄일 수 있다.

정적으로 정형된 언어의 경우 부족한 자료형 추론 (예: C와 Java 등)은 프로그래머들이 메서드나 함수를 사용하고자 하는 자료형을 선언할 것을 요구한다. 이것은 어느 컴파일러가 프로그래머가 동기화 중에 표류할 것을 무시하거나 허용하도록 허가하지 않을 것을 프로그램을 위한 추가 문서로 검색할 수 있다. 그러나, 언어는 정적으로 자료형 선언 없이 정형될 수 있다 (예시는 하스켈, 스칼라 그리고 낮은 정도의 C#를 포함한다). 그래서 명시적인 자료형 선언은 모든 언어에서 정적 정형을 위한 요구 사항을 필요로 하지 않는다.

동적 정형은 몇몇 정적 자료형 검사가 불법으로 거부할 것이라는 구조를 허용한다. 예를 들어, 코드로 임의의 데이터를 실행하는 ''eval'' 함수가 가능하게 된다. ''eval'' 함수는 정적 자료형으로 가능하지만, 고급 대수적 데이터 자료형의 사용이 필요하다. 또한, 동적 정형이 자리 표시자 데이터 구조 본격적인 자료 구조 (보통 실험 및 시험의 목적) 대신에 투명하게 사용된 (모의 객체)를 허용하는 등의 방법들이 전환 코드와 프로토 타입을 수용하는 것보다 낫다.

3. 자료형 체계

자료형 체계는 언어에 따라 다양한 방식으로 분류될 수 있다.
강한 자료형 vs. 약한 자료형프로그래밍 언어는 종종 "강한 자료형" 또는 "약한 자료형"으로 불린다. 실제로 이러한 용어의 의미에 대한 보편적으로 받아들여지는 정의는 없다. 일반적으로, "강한" 또는 "약한"이라고 부르는 자료형 체계 간의 차이를 나타내는 더 정확한 용어가 있다.

강한 타입 지정이란 프로그래밍 언어 사양 내에서 데이터 값의 타입을 해석하는 일반적인 방법에 따르는 것을 의미한다. 암묵적 타입 변환, 타입 강제, 타입 재주장은 언어 사양 내에 있으므로 여기에 속한다. 기본 타입을 파생 타입으로 변경하는 등 일정 타입 제약 하의 런타임 타입 검사가 있는 타입 캐스트도 여기에 속한다.

약한 타입 지정이란 언어 사양 외에 있는 명시적 타입 변환과 타입 캐스트의 사용에 의해, 데이터 값의 타입을 다양하게 해석할 수 있는 변칙적인 방법을 허용한 것이다. 타입 안전성은 보장되지 않는다. 예를 들어, 명시적 타입 변환에 의해 실수형을 정수형으로 반올림하거나, 포인터를 사용하여 모든 타입을 나타내거나, 태그 없는 공용체를 사용하여 모든 타입을 나타내는 등이 있다.
명시적 자료형 vs. 암시적 자료형정적으로 형식 지정된 언어의 형식 검사기는 모든 표현식의 형식이 해당 표현식이 나타나는 문맥에서 예상되는 형식과 일치하는지 확인해야 한다. 예를 들어, `x := e` 형식의 할당문에서 표현식 `e`의 추론된 형식은 변수 `x`의 선언되거나 추론된 형식과 일치해야 한다. 이러한 일관성 개념을 ''호환성''이라고 하며, 각 프로그래밍 언어에 따라 다릅니다.

`e`의 형식과 `x`의 형식이 동일하고, 해당 형식에 대해 할당이 허용되는 경우 유효한 표현식이다. 가장 단순한 형식 시스템에서 두 형식이 호환되는지 여부는 해당 형식이 동일한지 여부로 축소된다. 그러나 서로 다른 언어는 두 형식 표현식이 동일한 형식을 나타내는 것으로 이해되는 시점에 대한 서로 다른 기준을 가지고 있다.

서브타이핑이 있는 언어에서 호환성 관계는 더 복잡하다. `B`가 `A`의 서브타입인 경우, `B` 형식의 값은 반대의 경우와 관계없이 `A` 형식이 예상되는 컨텍스트에서 사용할 수 있다.
이름 기반 자료형 vs. 구조 기반 자료형이름 기반(nominal)과 구조 기반(structural)은 정적/동적 타입 시스템에서 프로그램 요소의 타입을 식별하는 방식의 특징이다.[33]

이름 기반 타입 시스템은 시스템이 보유하고 있는 프로그램 요소의 참조 정보상의 타입 이름을 보고 데이터 값의 타입을 식별하는 방식이다.

구조적 타입 시스템은 참조 정보상의 타입 이름을 보지 않고, 데이터 값 자체의 분석을 통해 데이터 값의 타입을 식별하는 방식이다. 예를 들어 구조체의 경우, 필드 구조(각 필드의 타입 종류와 순서)가 일치하면 필드명이 달라도 같은 타입으로 판정된다. 구조적 타입 시스템은 서브타입의 판정에도 많이 사용된다.

4. 다형성 및 자료형

'''다형성'''(多形)은 코드(특히, 함수 또는 클래스)가 여러 유형의 값에 대해 작동할 수 있는 능력, 또는 동일한 자료 구조의 서로 다른 인스턴스가 서로 다른 유형의 요소를 포함할 수 있는 능력을 의미한다. 다형성을 허용하는 유형 체계는 일반적으로 코드 재사용성을 높이는 데 기여한다. 다형성이 있는 언어에서 프로그래머는 목록 또는 연관 배열과 같은 자료 구조를 각 요소 유형마다 한 번씩 구현하는 대신 한 번만 구현하면 된다. 이러한 이유로 컴퓨터 과학자들은 특정 형태의 다형성 사용을 때때로 제네릭 프로그래밍이라고 부른다. 다형성의 유형 이론적 기초는 추상화, 모듈성 및 (일부 경우) 서브타이핑의 기초와 밀접하게 관련되어 있다.[34]

4. 1. 오리 자료형

덕 타이핑은 구조적 타이핑과 유사한 타이핑 스타일이며, 객체가 대상이 되는 경우가 많다. 예를 들어 객체가 특정 프로퍼티, 필드, 변수를 가지고 있거나, 특정 메서드, 함수, 절차를 가지고 있다면 등가 판정된다. 이 역시 부분형(서브타입) 시점이다. 이 등가 판정은 오류 발생 없는 프로퍼티 참조 또는 메서드 실행으로 이어진다. 덕 타이핑의 명칭은 귀납법의 일종인 덕 테스트에서 유래했다.[34]

:『만약 오리 (a duck) 처럼 걷고, 오리처럼 운다면, 그것은 아마 오리일 것이다』

더욱이 동적 타이핑에 기반한 동적 덕 타이핑과, 정적 타이핑에 기반한 정적 덕 타이핑이 있다. 특히 C++의 템플릿은 정적 덕 타이핑 기능의 전형이며, 예를 들어 함수 호출 연산자를 오버로드한 함수 객체를 정의함으로써, 함수 포인터와 구분하지 않고 통일적으로 알고리즘의 술어 객체로 취급할 수도 있다. 적절한 연산자 오버로딩을 정의함으로써, 내장된 수치형이나 포인터형과 같은 표기법으로 취급할 수 있는 형을 사용자 정의할 수도 있다.

분류에는 여러 설이 있으며, "덕 타이핑은 실행 시의 동적인 타이핑이며, 구조적 타이핑은 컴파일 시의 정적인 타이핑이다"라고 간주하는 사람도 있는가 하면[34], "구조적 타이핑은 컴파일 시의 정적인 덕 타이핑이다"라고 간주하는 사람도 있다.[35][36]

5. 명시적 또는 암시적 선언 및 추론

C 언어와 같은 언어를 예로 들면, 함수는 다른 함수에 의해 호출될 수 있다. 이때 호출하는 함수는 호출되는 함수의 이름과 전달할 값을 담은 변수의 이름을 명시해야 한다.[18] 만약 함수 내부의 명령어가 정수 값을 받도록 작성되었는데, 호출하는 코드가 부동 소수점 값을 전달하면 잘못된 결과가 계산될 수 있다.

C 컴파일러는 함수가 호출될 때 정의에 선언된 매개변수의 자료형과 전달된 인수의 자료형을 검사한다. 자료형이 일치하지 않으면 컴파일 시간 오류나 경고를 발생시킨다.[18] 또한 컴파일러는 값의 정적 자료형을 사용하여 저장 공간과 연산에 사용할 알고리즘 선택을 최적화한다.

프로그래밍 언어는 자료형 다형성의 경우, 각 자료형에 대해 다양한 해결책과 연산을 연결할 수 있다. 자료형 이론은 이러한 자료형 체계를 연구하는 학문이다.

프로그래밍 언어는 컴파일 타임 또는 런타임에 수동으로 주석을 달거나 자동으로 추론할 때 타입 시스템을 사용하여 타입 검사를 할 수 있어야 한다. 타입 시스템은 프로그램이 의미를 갖도록 보장하지만, 의미 있는 프로그램이 의미를 부여받지 못할 수도 있다.

''타이핑''은 메모리의 값이나 객체에 의미를 부여한다. 범용 컴퓨터의 컴퓨터 하드웨어메모리 주소와 명령어 코드, 문자, 정수, 부동 소수점 숫자를 구별할 수 없다. 이는 비트 시퀀스가 가질 수 있는 모든 가능한 값 사이에 본질적인 구별을 하지 않기 때문이다. 타입을 비트 시퀀스와 연결하면 의미가 하드웨어에 전달되어 기호 시스템을 형성한다.

프로그램은 각 값을 최소한 하나의 특정 타입과 연결하지만, 하나의 값이 많은 서브타입과 연결될 수도 있다. 객체, 모듈, 통신 채널, 종속성과 같은 다른 엔터티도 타입과 연결될 수 있다.

더 정교한 타입 시스템은 기본적인 타입 검사보다 더 세밀한 규칙 집합을 제공하지만, 타입 추론이 결정 불가능한 문제가 되고 프로그래머가 코드에 주석을 달거나 컴퓨터 관련 작업 및 기능에 더 많은 주의를 기울여야 할 때 이러한 단점이 따른다.

컴파일러는 타입 검사기가 더 많은 프로그램 사양을 확인할 수 있게 해주는 종속 타입 또는 효과 시스템을 구현할 수도 있다. 타입 및 효과 시스템은 타입 검사만으로는 불가능한 더 많은 안전 검사를 제공한다.

컴파일러가 자동화하든 프로그래머가 지정하든, 타입 시스템은 타입 시스템 규칙을 벗어나는 경우 프로그램 동작을 불법으로 만든다. 프로그래머가 지정한 타입 시스템이 제공하는 이점은 추상화(모듈성)와 문서화이다. 컴파일러가 지정한 타입 시스템이 제공하는 이점은 최적화와 안전성이다.

자료형의 제약 조건을 확인하고 강제하는 과정인 타입 검사는 컴파일 시간 (정적 검사) 또는 런타임 (동적 검사)에 발생할 수 있다.

언어 명세가 타입 규칙을 강력하게 요구하여 정보 손실이 없는 자동 자료형 변환만 허용하는 경우, 이 과정을 ''강력한 타입 언어''라고 부르며, 그렇지 않은 경우 ''약한 타입 언어''라고 부른다.

길라드 브라차는 자료형 체계를 선택해야 한다는 주장을 제기했다. 즉, 자료형 체계는 필요에 따라 언어에 '플러그'할 수 있는 모듈이어야 한다는 것이다. 그는 이를 통해 이점이 있다고 믿는데, 그가 "필수적 자료형 체계"라고 부르는 것이 언어의 표현력을 저하시키고 코드를 더 취약하게 만들기 때문이다.[18]

선택적 타이핑은 점진적 타이핑과 관련이 있지만, 구별된다. 두 타이핑 방식 모두 코드의 정적 분석(정적 타이핑)에 사용될 수 있지만, 선택적 자료형 체계는 런타임 시 타입 안전성을 강제하지 않는다.[18][19]

C 언어나 자바와 같은 많은 정적 타입 시스템은 타입 선언을 요구한다. 프로그래머는 각 변수를 특정 타입과 명시적으로 연결해야 한다. 반면, 하스켈과 같이 타입 추론을 수행하는 언어도 있는데, 컴파일러가 프로그래머가 변수를 사용하는 방식에 따라 변수의 타입을 추론한다. 예를 들어, x와 y를 더하는 함수 f(x, y)가 주어지면 컴파일러는 x와 y가 숫자여야 한다고 추론할 수 있다. 왜냐하면 덧셈은 숫자에서만 정의되기 때문이다. 따라서 프로그램의 다른 곳에서 문자열이나 리스트와 같이 숫자 외의 타입을 인수로 지정하여 f를 호출하면 오류가 발생한다.

코드의 숫자 및 문자열 상수와 표현식은 특정 컨텍스트에서 타입을 암시할 수 있으며, 종종 그렇다. 예를 들어, 표현식 3.14는 부동 소수점 타입을 암시할 수 있으며, [1, 2, 3]은 일반적으로 배열인 정수의 목록을 암시할 수 있다.

타입 추론은 일반적으로 해당 타입 시스템에서 계산 가능하다면 가능하다. 또한, 주어진 타입 시스템에 대해 추론이 일반적으로 계산 가능하지 않더라도 실제 프로그램의 큰 부분 집합에 대해 추론이 가능한 경우가 많다. 하스켈의 타입 시스템은 Hindley–Milner의 한 버전으로, 타입 추론이 계산 가능한, 이른바 랭크 1 다형성 타입으로 제한된 System Fω이다. 대부분의 하스켈 컴파일러는 확장으로 임의 랭크 다형성을 허용하지만, 이렇게 하면 타입 추론이 계산 불가능해진다.

6. 자료형들의 유형들

프로그래밍 언어는 다양한 종류의 자료형을 제공한다. 자료형은 크게 기본 자료형, 복합 자료형, 추상 자료형으로 나눌 수 있다.


  • 기본 자료형: 정수, 부동소수점 수, 문자, 불리언 등 가장 기본적인 자료형이다.
  • 복합 자료형: 배열, 레코드, 공용체, 열거형 등 기본 자료형을 조합하여 만든 자료형이다.
  • 추상 자료형: 스택, , 리스트, 트리, 그래프 등 자료의 구조와 연산을 추상적으로 정의한 자료형이다.


C 언어는 간단한 자료형 체계의 예시로 볼 수 있다. C 프로그램은 서브루틴(함수) 정의로 구성되며, 함수는 다른 함수를 호출한다. 함수의 인터페이스는 함수 이름과 함수의 코드에 전달되는 매개변수 목록을 명시한다. 호출하는 함수의 코드는 호출되는 함수의 이름과 함께, 호출되는 함수에 전달할 값을 담고 있는 변수의 이름을 명시한다.[1]

컴퓨터 프로그램 실행 중에 값들은 임시 저장소에 저장된 다음, 실행은 호출된 함수의 코드로 이동한다. 호출된 함수의 코드는 값에 접근하여 이를 사용한다. 만약 함수 내부의 명령어가 정수 값을 받도록 작성되었지만, 호출하는 코드가 부동 소수점 값을 전달한 경우, 호출된 함수는 잘못된 결과를 계산하게 된다.

C 컴파일러는 함수가 호출될 때 함수 정의에 선언된 매개변수의 자료형에 따라 전달된 인수의 자료형을 검사한다. 자료형이 일치하지 않으면 컴파일러는 컴파일 시간 오류 또는 경고를 발생시킨다.

컴파일러는 또한 값에 필요한 저장 공간과 값에 대한 연산에 사용할 알고리즘 선택을 최적화하기 위해 값의 정적 자료형을 사용할 수 있다. 예를 들어 많은 C 언어 컴파일러에서 ''float'' 자료형은 IEEE 단정밀도 부동 소수점 숫자 사양에 따라 32 비트로 표현된다. 따라서 해당 값에 부동 소수점 관련 마이크로프로세서 연산(부동 소수점 덧셈, 곱셈 등)을 사용한다.

자료형 제약의 깊이와 평가 방식은 언어의 ''타이핑''에 영향을 미친다. 프로그래밍 언어는 자료형 다형성의 경우, 각 자료형에 대해 다양한 해결책과 연산을 연결할 수 있다. 자료형 이론은 자료형 체계를 연구하는 학문이다. 정수 및 문자열과 같은 일부 프로그래밍 언어의 구체적인 자료형은 컴퓨터 아키텍처, 컴파일러 구현 및 언어 설계의 실제적인 문제에 따라 달라진다.

7. 특수 자료형 체계

많은 자료형 체계가 특정 환경, 특정 유형의 데이터, 또는 대역외 정적 프로그램 분석을 위해 특수하게 만들어졌다. 이러한 자료형 체계는 종종 형식적인 자료형 이론의 아이디어를 기반으로 하며 프로토타입 연구 시스템의 일부로만 사용할 수 있다.

특수 자료형 체계는 다음과 같다.


  • 종속 자료형: 다른 값에 의존하는 자료형이다. 예를 들어, 크기가 3x3인 행렬을 나타내는 자료형은 행과 열의 크기를 나타내는 값에 종속된다.
  • 선형 자료형: 한 번만 사용될 수 있는 자료형이다. 이는 파일, 문자열 등과 같은 큰 불변 값을 다루는 데 유용하며, 참조 투명성을 유지하면서 효율적인 연산을 가능하게 한다.
  • 교집합 자료형: 두 자료형의 공통 부분을 나타내는 자료형이다. 예를 들어, signed char와 unsigned char의 교집합 자료형은 0에서 127 사이의 값을 나타낸다.
  • 합집합 자료형: 두 자료형 중 하나에 속하는 값을 나타내는 자료형이다. 예를 들어, signed char와 unsigned char의 합집합 자료형은 -128에서 255 사이의 값을 나타낼 수 있다.
  • 존재 자료형: 인터페이스와 구현을 분리하는 데 사용되는 자료형이다. 이는 모듈 및 추상 자료형을 나타내는 데 유용하며, 구현의 유연성을 제공하면서 클라이언트 코드를 변경으로부터 보호한다.
  • 점진적 자료형: 정적 자료형과 동적 자료형을 혼합하여 사용할 수 있는 자료형이다. 이를 통해 개발자는 필요에 따라 자료형 검사의 엄격성을 조절할 수 있다.


자료형 개념표기법의미
함수\sigma \to \tau만약 M:\sigma \to \tau이고 N:\sigma이면 M(N):\tau이다.
\sigma \times \tau만약 M:\sigma \times \tau이면 M = (N, O)N:\sigma이고 O:\tau인 쌍이다.
\sigma + \tau만약 M:\sigma + \tau이면 M = \iota_1(N)N:\sigma인 첫 번째 주입이거나, M = \iota_2(N)N:\tau인 두 번째 주입이다.
교집합\sigma \cap \tau만약 M:\sigma \cap \tau이면 M:\sigma이고 M:\tau이다.
합집합\sigma \cup \tau만약 M:\sigma \cup \tau이면 M:\sigma이거나 M:\tau이다.
레코드\langle x : \tau\rangle만약 M:\langle x : \tau\rangle이면 멤버 x:\tau를 가진다.
다형\forall{}\alpha. \tau만약 M:\forall{}\alpha. \tau이면 임의의 자료형에 대해 M:\tau[\alpha := \sigma]이다.
존재\exists{}\alpha. \tau만약 M:\exists{}\alpha. \tau이면 어떤 자료형에 대해 M:\tau[\alpha := \sigma]이다.
재귀\mu \alpha. \tau만약 M:\mu \alpha. \tau이면 M:\tau[\alpha := \mu \alpha. \tau]이다.
종속 함수(x : \sigma) \to \tau만약 M:(x : \sigma) \to \tau이고 N:\sigma이면 M(N):\tau[x:=N]이다.
종속 쌍(x : \sigma) \times \tau만약 M:(x : \sigma) \times \tau이면 M = (N, O)N:\sigma이고 O:\tau[x:=N]인 쌍이다.
종속 교집합[20](x : \sigma) \cap \tau만약 M:(x : \sigma) \cap \tau이면 M:\sigma이고 M:\tau[x:=M]이다.
패밀리 교집합[20]\bigcap_{x : \sigma} \tau만약 M:\bigcap_{x : \sigma} \tau이면 임의의 항 N:\sigma에 대해 M:\tau[x:=N]이다.
패밀리 합집합[20]\bigcup_{x : \sigma} \tau만약 M:\bigcup_{x : \sigma} \tau이면 어떤 항 N:\sigma에 대해 M:\tau[x:=N]이다.



종속 타입은 스칼라나 값을 사용하여 다른 값의 타입을 보다 정확하게 설명한다. 예를 들어, \mathrm{matrix}(3, 3)3 \times 3 행렬의 타입일 수 있다.

선형 타입은 선형 논리 이론을 기반으로 하며, 모든 시점에서 단 하나의 참조만 갖는 속성을 가진 값에 할당되는 타입이다. Clean (프로그래밍 언어)는 안전성을 유지하면서 속도를 높이기 위해 이 타입 시스템을 사용한다.

교차 형식은 두 개의 다른 주어진 형식의 ''두'' 값에 속하는 값을 설명하는 형식으로, 값 집합이 겹친다. Forsythe 언어는 교차 형식의 일반적인 구현을 포함한다.

공용체 자료형은 두 자료형 중 ''어느'' 하나에 속하는 값을 설명하는 자료형이다. C 언어의 "union" 개념은 공용체 자료형과 유사하지만, 자료형 안전성이 보장되지 않는다.

존재적 타입은 모듈추상 자료형을 나타내는 데 자주 사용되며, 구현과 인터페이스를 분리하는 능력이 있기 때문이다. 1988년 존 C. 미첼(John C. Mitchell)과 고든 플롯킨(Gordon Plotkin)은 "추상 [데이터] 타입은 존재적 타입을 갖는다"라는 슬로건 아래 공식적인 이론을 정립했다.[21]

점진적 타이핑을 사용하는 타입 시스템에서 변수는 컴파일 시간에 타입이 할당될 수도 있고(정적 타이핑), 실행 시간에 타입이 할당될 수도 있다.[22] 점진적 타이핑은 정적으로 알 수 없는 타입을 나타내기 위해 ''동적''이라는 특별한 타입을 사용한다.

8. 한국 프로그래밍 언어 생태계와 자료형

한국 프로그래밍 언어 생태계는 다양한 자료형 체계를 가진 언어들이 공존하며 발전해 왔다.
정적 자료형 언어Java, C++, C# 등 정적 자료형 언어는 컴파일 시점에 자료형을 검사하여 안정성과 신뢰성이 높다. 이러한 특징 덕분에 대기업 및 금융권에서 널리 사용된다.[38] 특히, 정부 및 공공기관에서는 전자정부 표준 프레임워크(eGovFrame)의 영향으로 Java가 널리 사용되고 있다. 게임 개발 분야에서는 높은 성능을 제공하는 C++가 주로 사용되며, 최근에는 C#의 사용도 증가하고 있다.
동적 자료형 언어파이썬, 자바스크립트, Ruby 등 동적 자료형 언어는 실행 시간에 자료형을 검사하여 유연성과 빠른 개발 속도를 제공한다. 이러한 특징 덕분에 스타트업 및 웹 개발 분야에서 많이 사용된다. 특히, 인공지능 및 데이터 과학 분야에서는 Python이 압도적인 점유율을 차지하고 있다.
기타 언어임베디드 시스템 개발에는 C, C++가 주로 사용되며, 학계에서는 연구 목적에 따라 다양한 언어가 사용된다. 최근에는 하스켈, 스칼라 등 함수형 언어에 대한 관심도 높아지고 있다.

한국 프로그래밍 언어 생태계와 자료형
분야주요 언어특징자료형 체계
대기업 및 금융권Java, C#안정성, 신뢰성정적
스타트업 및 웹 개발Python, JavaScript, Ruby빠른 개발 속도, 유연성동적
게임 개발C++, C#높은 성능정적
인공지능 및 데이터 과학Python압도적인 점유율동적
임베디드 시스템C, C++-정적
학계Haskell, Scala 등연구 목적, 함수형 언어 관심 증가정적/동적
정부 및 공공기관Java전자정부 표준 프레임워크(eGovFrame)정적


9. 결론

자료형은 프로그램의 안전성, 효율성, 가독성, 유지보수성에 큰 영향을 미치는 중요한 요소이다. 자료형 체계는 언어마다 다양하며, 각 체계의 장단점을 이해하고 프로젝트의 특성에 맞는 언어를 선택하는 것이 중요하다.

자료형과 관련된 안전성을 형식 안전성(type safety)이라고 하는데, 일반적으로 형식 안전성이란 데이터(객체)의 본래 형에 따라 프로그램을 올바르게 실행할 수 있는 성질을 가리킨다[31]. 형식 안전성이 구체적으로 무엇을 의미하는지는 프로그래밍 언어나 문맥에 따라 달라진다.

프로그래밍 언어들은 정적 타입 또는 동적 타입을 사용하며, 각각 장단점을 가지고 있다. 정적 타입 언어는 컴파일 시점에 타입 오류를 발견하여 프로그램의 신뢰성을 높일 수 있지만, 동적 타입 언어는 유연성과 개발 속도 면에서 유리하다.

어떤 자료형 체계를 선택할지는 여러 요소를 고려해야 한다. 예를 들어, 개발하는 소프트웨어의 종류, 팀 구성원의 능력, 다른 시스템과의 상호 작용 정도, 개발 팀의 규모 등이 영향을 미칠 수 있다. 소규모 프로젝트에는 동적 타입 언어가, 대규모 프로젝트에는 정적 타입 언어가 더 적합할 수 있다는 의견도 있다.

한국의 프로그래밍 언어 생태계는 다양한 자료형 체계를 가진 언어들이 공존하고 있으며, 각 분야별로 선호되는 언어가 다르다. 예를 들어, 웹 개발 분야에서는 자바스크립트와 TypeScript가 널리 사용되며, 시스템 프로그래밍 분야에서는 C와 C++가 많이 사용된다.

참조

[1] 서적 Programming languages: Concepts and constructs Addison-Wesley
[2] 서적 Algebraic and Logical Structures Oxford University Press 2001
[3] 웹사이트 Some History of Functional Programming Languages https://www.cs.kent.[...] 2012-06-12
[4] 웹사이트 Type systems for programming languages http://gallium.inria[...] 2013-05-26
[5] 서적 C# in Depth Manning
[6] 웹사이트 Dynamic Method Dispatch or Runtime Polymorphism in Java https://www.geeksfor[...] 2021-03-28
[7] PhD Practical Soft Typing https://dl.acm.org/d[...] Rice University 1995
[8] 웹사이트 dynamic (C# Reference) http://msdn.microsof[...] Microsoft 2014-01-14
[9] 웹사이트 std::any — Rust https://doc.rust-lan[...] 2021-07-07
[10] 웹사이트 Static Typing Where Possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages http://research.micr[...] "[[Microsoft]] Corporation"
[11] 웹사이트 Types vs Tests http://www.infoq.com[...] InfoQ 2012
[12] PhD Dependent Types in Practical Programming Department of Mathematical Sciences, Carnegie Mellon University
[13] 문서 Visual Basic is an example of a language that is both type-safe and memory-safe.
[14] 서적 ECMAScript® 2020 Language Specification http://www.ecma-inte[...] ECMA 2020-06
[15] 웹사이트 Strict mode – JavaScript https://developer.mo[...] Developer.mozilla.org 2013-07-17
[16] 웹사이트 Strict Mode (JavaScript) http://msdn.microsof[...] Microsoft 2013-07-17
[17] 웹사이트 Strict typing http://php.net/manua[...] ""
[18] 웹사이트 Pluggable Types http://bracha.org/pl[...]
[19] 웹사이트 Sure. It's called "gradual typing", and I would qualify it as trendy. ... https://stackoverflo[...] stackoverflow 2012
[20] 학술회의 Dependent intersection: A new way of defining records in type theory IEEE Computer Society
[21] 학술지 Abstract Types Have Existential Type http://theory.stanfo[...] 1988-07
[22] 웹사이트 What is gradual typing? http://homes.soic.in[...] 2014-03-24
[23] 학술회의 Gradual Typing for Functional Languages http://scheme2006.cs[...] "[[University of Chicago]]" 2006-09
[24] 서적 Lambda Calculus with Types https://books.google[...] Cambridge University Press 2013-06-20
[25] 서적 C# Language Specification http://www.ecma-inte[...] ECMA 2017-12
[26] 웹사이트 Native Types https://docs.perl6.o[...]
[27] 웹사이트 Numerics, § Auto-boxing https://docs.perl6.o[...]
[28] 문서 The [[Burroughs B6x00-7x00 instruction set|Burroughs ALGOL computer]] line determined a memory location's contents by its flag bits. Flag bits specify the contents of a memory location. Instruction, data type, and functions are specified by a 3 bit code in addition to its 48 bit contents. Only the MCP (Master Control Program) could write to the flag code bits.
[29] 문서 『{{harvnb|型システム入門}}』 p. 1
[30] 문서 6-1. バッファオーバーラン その1「こうして起こる」 https://www.ipa.go.j[...]
[31] 문서 非Java言語のサポート | Oracle Help Center | Java SE 11 | Java仮想マシン・ガイド https://docs.oracle.[...]
[32] 문서 http://web.cecs.pdx.[...]
[33] 서적 型システム入門 −プログラミング言語と型の理論− オーム社 2013-03-26
[34] 문서 Duck Typing vs Structural Typing vs Nominal Typing | by Saurabh Nayar | Higher-Order Functions | Medium https://medium.com/h[...]
[35] 문서 Structural Typing: Compile Time Duck Typing https://blog.carbonf[...]
[36] 문서 typing --- 型ヒントのサポート — Python 3.9.4 ドキュメント https://docs.python.[...]
[37] 문서 C# Coding Conventions | Microsoft Docs https://docs.microso[...]
[38] 서적 Types and Programming Languages MIT Press
[39] 저널 Dependent Types in Practical Programming http://citeseerx.ist[...] ACM Press



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com