C#의 핵심 조직
C#의 핵심 조직 개념은 ‘프로그램’, ‘네임스페이스’, ‘형식’, ‘멤버’, ‘어셈블리’입니다. 프로그램은 멤버를 포함하고 네임스페이스로 구성될 수 있는 형식을 선언합니다. 클래스, 구조체 및 인터페이스는 형식의 하나 입니다. 필드, 메서드, 속성 및 이벤트는 멤버의 하나 입니다.
C# 프로그램을 컴파일하면 실제로 어셈블리로 패키지됩니다. 어셈블리는 일반적으로 애플리케이션을 구현하는지 또는 *라이브러리**를 구현하는지에 따라 각각 파일 확장명 .exe 또는 .dll을 갖습니다.
어셈블리 예제
간단한 예로, 다음 코드를 포함하는 어셈블리를 생각해 볼 수 있습니다.
using System; namespace Acme.Collections { public class Stack<T> { Entry _top; public void Push(T data) { _top = new Entry(_top, data); } public T Pop() { if (_top == null) { throw new InvalidOperationException(); } T result = _top.Data; _top = _top.Next; return result; } class Entry { public Entry Next { get; set; } public T Data { get; set; } public Entry(Entry next, T data) { Next = next; Data = data; } } } }
이 클래스의 정규화된 이름은 Acme.Collections.Stack입니다. 클래스에는 필드 top, 2개의 메서드 Push 및 Pop, 중첩된 클래스 Entry 등의 여러 멤버가 포함됩니다. Entry 클래스는 필드 next 및 필드 data, 생성자의 세 멤버가 포함됩니다. Stack은 제네릭 클래스입니다. 이는 사용 시 구체적인 형식으로 대체되는 T 형식 매개 변수 하나를 포함합니다.
어셈블리에는 IL(중간 언어) 명령 형식의 실행 코드와 메타데이터 형식의 기호 정보가 포함됩니다. 어셈블리가 실행되기 전에, .NET 공용 언어 런타임의 JIT(Just-In-Time) 컴파일러가 어셈블리 안의 IL 코드를 해당 프로세서에 맞는 코드로 변환합니다.
어셈블리는 코드와 메타데이터를 모두 포함하는 기능의 자체 설명 단위이므로 C#에서는 #include 지시문과 헤더 파일이 필요하지 않습니다. 특정 어셈블리에 포함된 공용 형식 및 멤버는 프로그램을 컴파일할 때 해당 어셈블리를 참조하는 것만으로 C# 프로그램에서 사용 가능해집니다. 예를 들어 이 프로그램에서는 acme.dll 어셈블리의 Acme.Collections.Stack 클래스를 사용합니다.
Acme.Collections.Stack를 사용하는 프로그램 예제
using System; using Acme.Collections; class Example { public static void Main() { var s = new Stack<int>(); s.Push(1); // stack contains 1 s.Push(10); // stack contains 1, 10 s.Push(100); // stack contains 1, 10, 100 Console.WriteLine(s.Pop()); // stack contains 1, 10 Console.WriteLine(s.Pop()); // stack contains 1 Console.WriteLine(s.Pop()); // stack is empty } }
이 프로그램을 컴파일하려면 위의 예제에 정의된 스택 클래스를 포함하는 어셈블리를 참조해야 합니다.
C# 프로그램은 여러 원본 파일에 저장될 수 있습니다. C# 프로그램을 컴파일하면 모든 원본 파일이 함께 처리되고 서로를 제약 없이 참조할 수 있습니다. 개념적으로 처리되기 전에 모든 원본 파일이 하나의 대량 파일에 연결된 것과 같습니다. 소수의 경우를 제외하고 선언 순서는 중요하지 않으므로 C#에서는 정방향 선언이 필요한 경우가 없습니다. C#은 소스 파일을 하나의 공용 형식만 선언하도록 제한하거나 소스 파일 이름이 소스 파일에 선언된 형식과 일치하도록 요구하지 않습니다.
이점은 객체지향 프로그램이 좋은점이기도 합니다.