공통 타입 시스템
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
공통 타입 시스템(CTS)은 다양한 프로그래밍 언어 간의 상호 운용성, 형식 안전성, 그리고 고성능 코드 실행을 가능하게 하는 프레임워크이다. CTS는 객체 지향 모델을 제공하여 서로 다른 언어로 작성된 객체들이 상호 작용할 수 있도록 규칙을 정의하며, 값 형식과 참조 형식의 두 가지 주요 형식 범주를 지원한다. 값 형식은 데이터를 직접 포함하며, 참조 형식은 메모리 주소에 대한 참조를 저장한다. 또한, 박싱과 언박싱을 통해 값 형식과 참조 형식 간의 변환을 지원한다. CTS는 각 언어가 고유한 데이터 형식을 가지는 문제를 해결하여, .NET Framework 환경에서 다양한 언어 간의 상호 참조를 가능하게 한다.
더 읽어볼만한 페이지
- 닷넷 프레임워크 - 파워셸
파워셸은 마이크로소프트에서 개발한 작업 자동화 솔루션으로, 명령줄 셸과 스크립트 언어의 기능을 결합하여 윈도우 시스템 관리를 위해 설계되었으며, .NET 프레임워크 기반의 객체 지향적 특징을 갖고 다양한 플랫폼에서 자동화 스크립트 작성 및 실행, 시스템 구성 관리 등에 활용된다. - 닷넷 프레임워크 - 유니버설 윈도우 플랫폼
유니버설 윈도우 플랫폼(UWP)은 마이크로소프트에서 개발한 애플리케이션 모델로, Windows 10, 11 등 다양한 기기에서 실행되는 앱 개발을 위한 통합 플랫폼이며, Visual Studio를 통해 개발되고 XAML Islands를 통해 기존 WinAPI 기반 애플리케이션에서도 활용 가능하다.
| 공통 타입 시스템 | |
|---|---|
| 공통 타입 시스템 | |
| 약자 | CTS |
| 종류 | 타입 시스템 |
| 개발 | 마이크로소프트 |
| 플랫폼 | .NET Framework |
| 최초 출시 | 2002년 |
| 개요 | |
| 목적 | 다양한 프로그래밍 언어 간의 상호 운용성 확보 |
| 기능 | 타입 정의 및 관리 타입 안전성 보장 언어 간 타입 변환 지원 |
| 타입 종류 | |
| 값 타입 | 정수형 부동소수점형 구조체 열거형 |
| 참조 타입 | 클래스 인터페이스 배열 델리게이트 |
| 주요 특징 | |
| 타입 안전성 | 런타임 시 타입 오류 방지 |
| 상속 | 타입 간 계층 구조 지원 |
| 리플렉션 | 런타임 시 타입 정보 접근 |
| 박싱/언박싱 | 값 타입과 참조 타입 간 변환 지원 |
| 관련 기술 | |
| CLI | 공통 언어 기반 (Common Language Infrastructure) |
| CLR | 공통 언어 런타임 (Common Language Runtime) |
2. CTS의 기능
공통 타입 시스템(CTS)은 상호 언어 통합, 형식 안전성 및 고성능 코드 실행을 가능하게 하는 프레임워크를 제공한다.[1] CTS는 다양한 프로그래밍 언어의 완전한 구현을 지원하는 객체 지향 모델을 제공하며, 서로 다른 언어로 작성된 객체들이 상호 작용할 수 있도록 하는 규칙을 정의한다.[1]
공통 형식 시스템(CTS)은 크게 두 가지 일반적인 형식 범주를 지원하는데, 값 형식과 참조 형식이다.
CTS는 데이터 형식의 상호 호환성을 보장하고, 형식 멤버에 대한 가시성 및 접근 규칙을 지정한다. 또한 형식 상속, 가상 메서드 및 객체 수명에 대한 규칙도 정의한다.[1]
분수 값을 반올림할 때, 가까운 짝수로 반올림(Banker's rounding)을 기본으로 사용하며, "대칭 산술 반올림"(0에서 멀어지는 방향으로 반올림)도 옵션으로 제공한다.[1]
3. 형식 범주
; 값 형식
: 값 형식은 데이터를 직접 포함하며, 스택에 할당되거나 구조체 내부에 인라인으로 할당된다. 값 형식은 기본 제공(런타임에서 구현됨), 사용자 정의 또는 열거형일 수 있다. 정수, 부동 소수점 수와 같은 내장된 형식들이 이에 해당하며, 모두 CTS에서는 구조체의 일종으로 취급된다.
; 참조 형식
: 참조 형식은 값의 메모리 주소에 대한 참조를 저장하며, 힙에 할당된다. 참조 형식은 자체 설명 형식, 포인터 형식, 인터페이스 형식이 있다. 자체 설명 형식은 배열 및 클래스 형식으로 더 나뉜다. 클래스 형식에는 사용자 정의 클래스, 박싱된 값 형식, 대리자가 있다. 문자열 형식 `System.String`은 불변의 참조 형식으로 구현되어 있다.
다음은 Visual Basic .NET으로 작성된, 참조 형식과 값 형식의 차이점을 보여주는 예제이다.
Imports System
Class Class1
Public Value As Integer = 0
End Class 'Class1
Class Test
Shared Sub Main()
Dim val1 As Integer = 0
Dim val2 As Integer = val1
val2 = 123
Dim ref1 As New Class1()
Dim ref2 As Class1 = ref1
ref2.Value = 123
Console.WriteLine("Values: {0}, {1}", val1, val2)
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value)
End Sub 'Main
End Class 'Test
위 예제의 출력은 다음과 같다.
Values: 0, 123
Refs: 123, 123
3. 1. 값 형식 (Value Type)
값 형식은 데이터를 직접 포함하며, 스택에 할당되거나 구조체 내부에 인라인으로 할당된다. 값 형식은 기본 제공(런타임에서 구현됨), 사용자 정의 또는 열거형일 수 있다. 정수, 부동 소수점 수와 같은 내장된 형식들이 이에 해당하며, 모두 CTS에서는 구조체의 일종으로 취급된다.
다음은 값 형식과 참조 형식의 차이점을 보여주는 Visual Basic .NET 예제이다.
Imports System
Class Class1
Public Value As Integer = 0
End Class 'Class1
Class Test
Shared Sub Main()
Dim val1 As Integer = 0
Dim val2 As Integer = val1
val2 = 123
Dim ref1 As New Class1()
Dim ref2 As Class1 = ref1
ref2.Value = 123
Console.WriteLine("Values: {0}, {1}", val1, val2)
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value)
End Sub 'Main
End Class 'Test
위 예제의 출력은 다음과 같다.
```text
Values: 0, 123
Refs: 123, 123
3. 2. 참조 형식 (Reference Type)
참조 형식은 값의 메모리 주소에 대한 참조를 저장하며, 힙에 할당된다. 참조 형식은 자체 설명 형식, 포인터 형식, 인터페이스 형식이 있다. 자체 설명 형식은 배열 및 클래스 형식으로 더 나뉜다. 클래스 형식에는 사용자 정의 클래스, 박싱된 값 형식, 대리자가 있다. 문자열 형식 `System.String`은 불변의 참조 형식으로 구현되어 있다.
다음은 Visual Basic .NET으로 작성된 참조 형식과 값 형식의 차이점을 보여주는 예제이다.
Imports System
Class Class1
Public Value As Integer = 0
End Class 'Class1
Class Test
Shared Sub Main()
Dim val1 As Integer = 0
Dim val2 As Integer = val1
val2 = 123
Dim ref1 As New Class1()
Dim ref2 As Class1 = ref1
ref2.Value = 123
Console.WriteLine("Values: {0}, {1}", val1, val2)
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value)
End Sub 'Main
End Class 'Test
위 예제의 출력은 다음과 같다.
Values: 0, 123
Refs: 123, 123
3. 3. 박싱(Boxing)과 언박싱(Unboxing)
값 형식을 참조 형식으로 변환하는 것을 박싱이라고 하고, 참조 형식을 값 형식으로 변환하는 것을 언박싱이라고 한다.
Int32 x = 5;
object o1 = x; // 암시적 박싱
x = (int)o1; // 명시적 언박싱
위의 예시에서 처럼, 먼저 Int32가 object로 박싱된 다음 다시 언박싱된다. 언박싱은 명시적 캐스팅이 필요하다.
3. 3. 1. 박싱 (Boxing)
값 형식을 참조 형식으로 변환하는 것을 박싱이라고도 한다. 아래 예제에서 볼 수 있듯이, 컴파일러에게 Int32가 객체로 박싱된다는 것을 알려줄 필요는 없다. 컴파일러가 이 작업을 알아서 처리하기 때문이다.
```csharp
Int32 x = 10;
object o = x ; // 암시적 박싱
Console.WriteLine("The Object o = {0}",o); // "The Object o = 10" 출력
```
하지만 Int32는 다음과 같이 항상 명시적으로 박싱될 수 있다.
```csharp
Int32 x = 10;
object o = (object) x; // 명시적 박싱
Console.WriteLine("The object o = {0}",o); // "The object o = 10" 출력
3. 3. 2. 언박싱 (Unboxing)
참조 형식을 값 형식으로 변환하는 과정이다. 명시적 형 변환이 필요하다.
다음 예제는 참조 형식을 값 형식으로 언박싱하는 방법을 보여준다. 먼저 Int32가 object로 박싱된 다음 다시 언박싱된다. 언박싱은 명시적 캐스팅이 필요하다.
```csharp
Int32 x = 5;
object o1 = x; // 암시적 박싱
x = (int)o1; // 명시적 언박싱
4. 구체적인 예시 (언어 간 상호 운용성)
과거의 프로그래밍 언어에서는 플랫폼이나 언어에 따라 다룰 수 있는 타입의 종류와 길이가 달랐다. 예를 들어, Visual Basic 6.0의 내장 정수형인 `Integer`형과 `Long`형의 크기는 각각 16비트와 32비트였으며, 64비트 정수형은 지원되지 않았다. VB.NET에서는 `Short`를 System.Int16에 대한 내장 에일리어스 타입, `Integer`를 System.Int32에 대한 내장 에일리어스 타입, 그리고 `Long`을 System.Int64에 대한 내장 에일리어스 타입으로 구현하고 있다. 마찬가지로 C#에서는 `short`를 System.Int16에 대한 내장 에일리어스 타입, `int`를 System.Int32에 대한 내장 에일리어스 타입, 그리고 `long`을 System.Int64에 대한 내장 에일리어스 타입으로 구현하고 있다. 이로 인해 각 언어는 상호 참조가 가능해져, 예를 들어 C#으로 작성된 라이브러리를 VB.NET에서 참조하거나 그 반대도 가능하게 되었다.
5. CTS가 필요한 이유
각 프로그래밍 언어는 고유한 데이터 형식을 내장하는 경향이 있다. 예를 들어 문자열을 나타내는 형식으로, Visual Basic은 `String` 형식을 제공하지만 내부적으로 COM의 `BSTR` 구조체를 사용한다. C/C++(C++)에서는 `char` 형식의 배열 또는 `wchar_t` 형식의 배열을 문자열로 간주한다.[2] STL에서는 `std::string` 및 `std::wstring` 클래스를, ATL/MFC에서는 `ATL::CString` ( `ATL::CStringA`/`ATL::CStringW` ) 클래스를 제공한다. C/C++ (Visual C++)의 `int` 형식은 Win16 환경에서는 16비트, Win32/Win64 환경에서는 32비트이지만, Visual Basic의 `Integer` 형식은 16비트이다. 이러한 데이터 형식은 언어 간에 호환성이 없다.
.NET Framework는 응용 소프트웨어 개발의 용이성을 주요 목표 중 하나로 삼았다. .NET Framework 이전의 COM은 프로그래밍 언어 간 상호 운용성을 제공하여 소프트웨어 컴포넌트를 바이너리 레벨에서 공유하고 재사용할 수 있게 했지만, GUID, HRESULT, 초기 바인딩(early binding) 및 지연 바인딩(late binding), 참조 카운트 관리, 실행 환경의 스레딩 모델, 그리고 데이터 형식 호환성 등 여러 복잡한 문제로 인해 개발에 어려움이 있었다. Visual Basic 및 ATL과 같은 개발 환경 및 프레임워크는 이러한 복잡성을 어느 정도 해결했지만, Visual Basic의 COM 구현에는 여전히 개선점이 필요했다.
이러한 문제를 해결하기 위해 다양한 언어가 공통으로 사용하는 형식 시스템이 고안되었으며, 이것이 .NET Framework의 공통 타입 시스템(CTS)이다.
참조
[1]
웹사이트
MidpointRounding Enumeration
https://docs.microso[...]
[2]
문서
C11 (C言語)およびC++11ではさらにchar16_tとchar32_tが定義されるが、本記事では簡単のため言及しない。
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com