공용 언어 사양

업데이트: 2007년 11월

개체를 구현한 언어에 상관 없이 개체가 다른 개체와 완전하게 상호 작용할 수 있으려면, 개체는 함께 상호 운용되어야 할 모든 언어에 공통적인 기능만을 호출자에게 노출해야 합니다. 따라서 많은 응용 프로그램에 필요한 기본 언어 기능 집합인 CLS(공용 언어 사양)가 정의되어 있습니다. CLS 규칙은 공용 형식 시스템의 하위 집합을 정의합니다. 따라서 공용 형식 시스템에 적용되는 모든 규칙은 CLS에도 적용되며 둘 중에서 CLS 규칙이 더 엄격합니다. 여러 언어에서 모두 사용할 수 있는 기능이 정의된 CLS를 사용하면 언어 간 상호 운용성을 향상시킬 수 있습니다. CLS에는 또한 CLS 규격에 대한 요구 사항이 설정되어 있기 때문에, 사용자는 관리 코드가 CLS에 맞는지 여부 및 CLS 기능을 사용하는 관리 코드를 특정 도구에서 지원하는 수준을 확인할 수 있습니다.

현재 사용하는 구성 요소의 API(파생 클래스 등 다른 코드에 노출됨)에서 CLS 기능만 사용하는 경우, CLS를 지원하는 모든 프로그래밍 언어에서 이 구성 요소에 액세스할 수 있습니다. CLS 규칙을 따르고 CLS에 포함된 기능만 사용하는 구성 요소를 CLS 규격 구성 요소라고 합니다.

.NET Framework 클래스 라이브러리 개요의 형식에서 정의되는 대부분의 멤버는 CLS 규격입니다. 그러나 클래스 라이브러리의 일부 형식에는 CLS 규격이 아닌 멤버도 들어 있습니다. 이들 멤버는 CLS에서는 제공하지 않는 언어 기능을 지원합니다. CLS 규격이 아닌 형식 및 멤버는 참조 문서에 나와 있으며, 각각에 대해 CLS 규격에 맞는 대체 방법이 있습니다. .NET Framework 클래스 라이브러리의 형식에 대한 자세한 내용은 .NET Framework 클래스 라이브러리 참조를 참조하십시오.

CLS는 여러 개발자 간에 공통적으로 사용되는 언어 구문을 포함할 정도로 방대하지만 동시에 대부분의 언어에서 지원할 수 있을 만큼 작도록 설계되었습니다. 또한 안정형 코드만 CLS 규격 언어에서 생성할 수 있도록, 코드의 형식 안전성을 빠르게 확인할 수 없는 언어 구문은 CLS에서 모두 제외되었습니다. 형식 안전성 확인에 대한 자세한 내용은 MSIL을 네이티브 코드로 컴파일을 참조하십시오.

다음 표에서는 CLS에 포함된 기능에 대한 요약과 각 기능이 개발자와 컴파일러 모두에 적용되는지 또는 컴파일러에만 적용되는지 여부를 표시합니다. 여기에 있는 내용은 정보만을 제공하기 위한 것이므로 상세한 설명은 제공되지 않습니다. 자세한 내용은 Microsoft Developer Network 웹 사이트에서 제공되는 Common Language Infrastructure, Partition I의 사양을 참조하십시오.

기능

적용 대상

설명

일반

   

   

표시 여부

모두

CLS 규칙은 형식의 부분 중에서도 해당 어셈블리 외부에 노출되는 부분에만 적용됩니다.

전역 멤버

모두

전역 정적 필드 및 메서드는 CLS 규격입니다.

명명 방식

   

   

문자 및 대/소문자 구분

모두

CLS 규격 언어 컴파일러에서는 유니코드 표준 3.0의 기술 보고서에 있는 Annex 7의 규칙을 따라야 합니다. 이 규칙은 식별자를 시작하거나 식별자에 포함될 수 있는 문자 집합을 결정합니다. 이 표준은 Unicode Consortium 웹 사이트에 나와 있습니다.

식별자의 대/소문자 이외의 다른 차이점이 있어야 두 식별자가 서로 다른 것으로 간주됩니다.

키워드

컴파일러

CLS 규격 언어 컴파일러에서는 키워드와 일치하는 식별자를 참조하기 위한 메커니즘을 제공합니다. 또한 이들 언어 컴파일러에서는 언어에서 키워드로 사용되는 이름을 갖는 가상 메서드를 정의하고 재정의하는 메커니즘을 제공합니다.

고유성

모두

CLS 규격 범위 내의 모든 이름은 두 개의 서로 다른 멤버의 이름인 경우에도(오버로딩을 통해 이름이 동일하거나 확인된 경우는 제외) 고유해야 합니다. 예를 들어, CLS에서 단일한 형식은 메서드나 필드에 대해 동일한 이름을 사용할 수 없습니다.

서명

모두

멤버 또는 서명에 나타나는 모든 반환 및 매개 변수 형식은 CLS 규격이어야 합니다.

형식

   

   

기본 형식

모두

.NET Framework 클래스 라이브러리에는 컴파일러에서 사용하는 기본 데이터 형식에 해당하는 형식이 들어 있습니다. 이 형식 중에서 Byte, Int16, Int32, Int64, Single, Double, Boolean, Char, Decimal, IntPtrString은 CLS 규격입니다. 이러한 형식에 대한 자세한 내용은 .NET Framework 클래스 라이브러리 개요의 형식 표를 참조하십시오.

Boxed 형식

모두

Boxed 값 형식(개체로 변환된 값 형식)은 CLS에 포함되지 않습니다. 대신, 필요에 따라 System.Object, System.ValueType또는 System.Enum을 사용합니다.

표시 여부

모두

형식 및 멤버 선언에는, 선언되는 형식 또는 멤버보다 어렵게 표시되거나 액세스하기 어려운 형식이 포함되어서는 안 됩니다.

인터페이스 메서드

컴파일러

단일 형식에서 두 개의 인터페이스를 구현하고, 구현되는 각 인터페이스에 대해 동일한 이름 및 서명을 갖는 메서드가 정의되어야 하는 경우, CLS 규격 언어 컴파일러에는 해당 상황에 맞는 구문이 있어야 합니다. 이들 메서드는 각각 고유한 것으로 간주되어야 하며 따라서 동일하게 구현되지 않아도 됩니다.

클로저

모두

CLS 규격 인터페이스 및 추상 클래스의 각 멤버도 CLS 규격이어야 합니다.

생성자 호출

모두

생성자는 기본 클래스의 생성자를 호출한 후에만 상속된 인스턴스 데이터에 액세스할 수 있습니다.

형식화된 참조

모두

형식화된 참조는 CLS 규격이 아닙니다. 형식화된 참조란 개체에 대한 참조 및 형식에 대한 참조를 포함하는 특수 생성자로서, 공용 언어 런타임에서는 형식화된 참조를 사용하여 여러 가지 인수를 가질 수 있는 메서드에 대해 C++ 스타일을 지원합니다.

형식 멤버

   

   

오버로딩

모두

인덱싱된 속성, 메서드 및 생성자는 오버로드될 수 있지만 필드나 이벤트는 오버로드될 수 없습니다.

속성은 형식으로 오버로드되면 안 되지만(속성의 getter 메서드의 반환 형식을 사용), 서로 다른 인덱스 수 및 형식으로는 오버로드될 수 있습니다.

메서드는 매개 변수의 수 및 형식, 그리고 제네릭 메서드의 경우 제네릭 매개 변수의 수만을 기준으로 오버로드될 수 있습니다.

연산자 오버로딩은 CLS에 포함되지 않지만 CLS에서는 유용한 이름을 지정하거나(예: Add()) 메타데이터에 비트를 설정하는 것에 대한 지침을 제공합니다. 연산자 오버로딩을 지원하는 컴파일러에서는 이러한 지침을 필요에 따라 사용할 수 있습니다.

오버로드된 멤버의 고유성

모두

필드 및 중첩 형식은 식별자를 사용한 비교만으로 구분되어야 합니다. 식별자를 비교했을 때 동일한 이름을 갖는 메서드, 속성 및 이벤트는 반환 형식 이외의 차이점을 가져야 합니다.

변환 연산자

모두

op_Implicit 또는 op_Explicit의 반환 형식이 오버로드되면 변환을 수행할 다른 방법이 있어야 합니다.

메서드

   

   

오버로드된 메서드의 액세스 가능성

모두

FamilyOrAssembly 액세스 가능성을 갖는 다른 어셈블리에서 상속된 메서드를 재정의하는 경우를 제외하고는, 상속된 메서드를 재정의할 때 액세스 가능성이 변경되어서는 안 됩니다. 이 경우, 재정의는 Family 액세스 가능성을 가져야 합니다.

인수 목록

모두

CLS에서는 관리되는 표준 호출 규칙만을 지원하며 가변 길이 인수 목록은 사용할 수 없습니다. 가변 길이 인수를 사용하려면 Microsoft Visual Basic의 경우에는 ParamArray 키워드를 사용하고, C#의 경우에는 params 키워드를 사용합니다.

속성

   

   

접근자 메타데이터

컴파일러

속성의 메서드를 구현하는 getter 및 setter 메서드는 메타데이터에서 mdSpecialName 식별자로 표시됩니다.

한정자

모두

속성 및 해당 접근자는 모두 static이거나 모두 virtual이거나 또는 모두 instance여야 합니다.

접근자 이름

모두

속성에 대해서는 특정 이름 지정 패턴을 사용해야 합니다. Name 이라는 이름을 갖는 속성의 getter 메서드와 setter 메서드가 지정된 경우, 이름은 각각 get_Nameset_Name이 됩니다.

반환 형식 및 인수

모두

속성의 형식은 getter의 반환 형식이며 setter의 마지막 인수의 형식입니다. 속성의 매개 변수의 형식은 getter의 매개 변수 형식 및 setter의 마지막 매개 변수 형식을 제외한 모든 형식입니다. 이들 형식은 모두 CLS 규격이어야 하며 관리되는 포인터일 수 없습니다. 즉, 참조로 전달될 수 없습니다.

이벤트

   

   

이벤트 메서드

모두

이벤트를 추가하거나 제거하는 메서드는 모두 있거나 모두 없어야 합니다.

이벤트 메서드 메타데이터

컴파일러

이벤트를 구현하는 메서드는 메타데이터에서 mdSpecialName 식별자로 표시되어야 합니다.

접근자 액세스 가능성

모두

이벤트를 추가, 제거 또는 발생시키는 메서드의 액세스 가능성은 모두 동일해야 합니다.

한정자

모두

이벤트를 추가, 제거 또는 발생시키는 메서드는 모두 static이거나 모두 virtual이거나 모두 instance여야 합니다.

이벤트 메서드 이름

모두

이벤트에 대해서는 특정 이름 지정 패턴을 사용해야 합니다. MyEvent라는 이름을 갖는 이벤트의 add 메서드, remove 메서드 및 raise 메서드의 이름은 각각 add_MyEvent, remove_MyEventraise_MyEvent가 됩니다.

인수

모두

이벤트를 추가하거나 제거하는 메서드는 이벤트의 형식을 정의하는 형식을 갖는 매개 변수를 사용해야 하며, 해당 형식은 System.Delegate에서 파생된 것이어야 합니다.

포인터 형식

   

   

포인터

모두

포인터 형식 및 함수 포인터 형식은 CLS 규격이 아닙니다.

인터페이스

   

   

멤버 서명

모두

CLS 규격 인터페이스는 이 인터페이스를 구현하기 위해 CLS 규격이 아닌 메서드를 정의할 수 없습니다.

멤버 한정자

모두

CLS 규격 인터페이스에서는 정적 메서드나 필드를 정의할 수 없습니다. 하지만 속성, 이벤트 및 가상 메서드는 정의할 수 있습니다.

참조 형식

   

   

생성자 호출

모두

참조 형식의 경우, 개체 생성자는 개체 만들기 작업의 일부로 호출되며 개체는 한 번만 초기화됩니다.

클래스 형식

   

   

상속

모두

CLS 규격 클래스는 CLS 규격 클래스(System.Object는 CLS 규격임)에서 상속해야 합니다.

배열1

   

   

요소 형식

모두

배열 요소는 CLS 규격 형식이어야 합니다.

크기

모두

배열의 크기는 고정되어야 하며 0보다 커야 합니다.

범위

모두

배열의 크기의 하한은 0이어야 합니다.

열거형

   

   

내부 형식

모두

열거형의 내부 형식은 기본 제공되는 CLS 정수 형식(Byte, Int16, Int32 또는 Int64)이어야 합니다.

FlagsAttribute

컴파일러

열거형에 대한 정의에 System.FlagsAttribute 사용자 지정 특성이 있으면 해당 열거형은 비트 필드(플래그) 집합으로 처리해야 합니다. 이 특성이 없는 경우에는 형식을 열거형 상수의 집합으로 간주해야 합니다. 각 언어에서는 FlagsAttribute를 사용하거나 이들 두 가지 형식의 열거형을 구분할 수 있도록 언어별 구문을 사용하는 것이 좋습니다.

필드 멤버

모두

열거형의 리터럴 정적 필드의 형식은 해당 열거형의 형식과 동일해야 합니다.

예외

   

   

상속

모두

throw 되는 개체의 형식은 System.Exception이거나 System.Exception에서 상속해야 합니다.

사용자 지정 특성

   

   

값 인코딩

컴파일러

CLS 규격 컴파일러에서는 사용자 지정 특성 인코딩(메타데이터의 사용자 지정 특성)의 하위 집합만 사용합니다. 이들 인코딩에 표시될 수 있는 형식은 System.Type, System.String, System.Char, System.Boolean, System.Byte, System.Int16, System.Int32, System.Int64, System.Single, System.Double 및 CLS 규격 기본 정수 형식에 기반한 열거형뿐입니다.

메타데이터

   

   

CLS 규격

모두

특정 형식의 CLS 규격이 해당 형식이 정의된 어셈블리의 CLS 규격과 다른 경우, 이 형식은 System.CLSCompliantAttribute로 표시되어야 합니다. 마찬가지로, 멤버와 해당 멤버 형식의 CLS 규격이 다른 경우에도 형식을 표시해야 합니다. 멤버 또는 형식이 CLS 규격이 아닌 것으로 표시되어 있으면 CLS 규격인 다른 멤버 또는 형식이 제공되어야 합니다.

제네릭

형식 이름

컴파일러

제네릭 형식의 이름은 해당 형식에 선언된 형식 매개 변수의 개수를 인코딩해야 합니다. 중첩 제네릭 형식의 이름은 해당 형식에 새로 도입된 형식 매개 변수의 개수를 인코딩해야 합니다.

중첩 형식

컴파일러

중첩 형식에는 제네릭 매개 변수가 적어도 바깥쪽 형식과 같은 수는 있어야 합니다. 중첩 형식의 제네릭 매개 변수는 바깥쪽 형식의 제네릭 매개 변수와 위치가 같습니다.

제약 조건

모두

제네릭 형식에서는 제네릭 형식 제약 조건이 기본 형식이나 인터페이스에 대한 모든 제약 조건을 만족할 수 있도록 충분한 제약 조건을 선언해야 합니다.

제약 조건 형식

모두

제네릭 매개 변수에 대한 제약 조건으로 사용되는 형식 자체는 CLS 규격이어야 합니다.

멤버 서명

모두

인스턴스화된 제네릭 형식에서 중첩 형식을 포함한 멤버의 표시 여부와 액세스 가능성의 범위는 전체 제네릭 형식이 아닌 특정 인스턴스로 제한됩니다.

제네릭 메서드

모두

추상 또는 가상 제네릭 메서드 각각에 대해 기본 구체(비추상) 구현이 있어야 합니다.

1. 가변 배열(즉, 배열의 배열)은 CLS 규격입니다. .NET Framework 버전 1.0의 C# 컴파일러에서는 가변 배열이 CLS 규격이 아닌 것으로 잘못 보고됩니다.

참고 항목

개념

언어 간 상호 운용성 개요

기타 리소스

언어 간 상호 운용성