C#은 강력한 형식의 언어로 모든 변수 및 상수에는 값으로 계산되는 모든 식을 실행하는 형식이 있습니다. 모든 매서드 선언은 각 입력 매개 변수와 반환 값의 이름, 형식, 종류(값,참조 또는 출력)을 지정합니다. .NET 클래스 라이브러리는 기본 제공 숫자 형식과 다양한 구문을 나타내는 복합 형식을 정의합니다.
형식에 저장된 정보에는 다음 항목이 포함될 수 있습니다.
- 형식 변수에 필요한 스토리지 공간
- 형식이 나타낼 수 있는 최대값 및 최솟값
- 형식이 상속되는 기본 형식
- 구현하는 인터페이스
- 허용되는 작업 유형
컴파일러는 형식 정보를 사용하여 코드에서 수행되는 모든 작업의 형식이 안전한지 확인합니다. 예를 들어 int 형식의 변수를 선언하는 경우 컴파일러를 통해 더하기 및 빼기 작업에서 변수를 사용할 수 있습니다. bool 형식의 변수에 대해 같은 작업을 수행하려 하면 컴파일러는 다음 예제와 같은 오류를 생성합니다.
int a = 5;
int b = a + 2; // OK
bool test = true;
// Error
int c = a + test;
컴파일러는 형식 정보를 실행 파일에 메타데이터로 포함됩니다. CLR(공용 언어 런타임)은 런타임에 이 메타데이터를 사용하여 메모리를 할당 및 회수할 때 형식 안정성을 추가로 보장합니다.
1. 변수 선언에서 형식 지정
프로그램에서 변수나 상수를 선언할 때 컴파일러가 형식을 유추하기 위해 형식을 지정하거나 var 키워드를 사용해야 합니다. 다음 예제에는 기본 제공 숫자 형식 및 복잡한 사용자 정의 형식을 둘 다 사용하는 일부 변수 선언을 보여줍니다.
float temperature;
string name;
MyClass myClass;
char firstLetter = 'c';
var limit = 3;
int[] source = [0, 1, 2, 3, 4, 5];
var query = from item in source
where item <= limit
select item;
매서드 매개 변수 및 반환 값의 형식은 메서드 선언에서 지정됩니다. 다음 시그니처는 입력 인수로 int가 필요하고 문자열을 반환하는 메서드를 보여줍니다.
public string GetName(int ID);
{
if (ID < name.Length)
return name[ID];
else
return String.Empty;
}
private string[] names = ["Spencer", "Sally", "Doug"];
변수를 선언한 후에는 새 형식으로 다시 선얼할 수 있고 선언된 형식과 호환되지 않는 값을 할당할 수 있습니다. 예를 들어 int를 선언한 다음 여기에 true bool 값을 할당할 수 없습니다. 그러나 값은 새 변수에 할당되거나 메서드 인수로 전달될 경우 다른 형식으로 변환할 수 있습니다.
데이터 손실을 일으키지 않는 형식 변환은 컴파일러에서 자동적으로 수행되며 데이터 손실을 일으킬 수 있는 변환의 경우 소스 코드에 캐스트가 있어야 합니다.
2. 기본 제공 형식
C#은 기본 제공 형식의 표준 집합을 제공합니다. 이러한 표준 집합은 정수, 부동 소수점 값, 부울 식, 텍스트 문자, 10진수 값, 기타 데이터 형식을 나타냅니다. 이 밖에도 기본 제공 string 및 object 형식이 있습니다. 이러한 형식을 모든 C# 프로그램에서 사용할 수 있습니다.
3. 사용자 지정 형식
string, class, interface, enum, record 구문을 사용하여 자체 사용자 지정 형식을 만듭니다. .NET 클래스 라이브러리 자체는 자체 애플리케이션에서 사용할 수 있는 사용자 지정 형식의 컬렉션입니다. 기본적으로 클래스 라이브러리의 가장 자주 사용되는 형식을 모든 C# 프로그램에서 사용할 수 있습니다.
기타 형식은 해당 형식을 정의하는 어셈블리에 프로젝트 참조를 명시적으로 추가하는 경우에만 사용할 수 있습니다. 컴파일러에 어셈블리에 대한 참조가 포함된 후에는 소스 코드에서 해당 어셈블리에 선언된 형식의 변수(및 상수)를 선언할 수 있습니다.
.NET 클래스 라이브러리 개요 - .NET
.NET 클래스 라이브러리에 대해 자세히 알아봅니다. .NET API에는 시스템 기능에 액세스할 수 있는 클래스, 인터페이스, 대리자, 값 형식이 포함됩니다.
learn.microsoft.com
4. CTS (공용 형식 시스템)
.NET 의 형식 시스템에 대한 다음과 같은 두 가지 기초 사항을 이해해야 합니다.
- 형식 시스템은 상속 원칙을 지원합니다. 형식은 기본형식이라는 다른 형식에서 파생될 수 있고, 파생 형식은 기본 형식의 메서드, 속성 및 기타 맴버를 상속합니다(몇 가지 제한 사항 존재), 기본 형식이 다른 형식에서 파생될 수 있습니다. 이 경우 파생 형식은 상속 계층 구조에 있는 두 기본 형식의 맴버를 상속합니다. System.Int32(C# 키워드: Int)과 같은 기본 제공 숫자 형식을 포함한 모든 형식은 궁극적으로 단일 기본 형식 System.Object(C# 키워드: object)에서 파생됩니다. 이 통합 형식 계층 구조를 CTS(공용 형식 시스템)이라고 합니다.
- CTS의 각 형식은 값 형식 또는 참조 형식으로 정의됩니다. 이러한 형식 에는 .NET 클래스 라이브러리의 모든 사용자 지정 형식과 자체 사용자 정의 형식도 포함됩니다. struct를 사용하여 정의한 형식은 값 형식이고, 모든 기본 제공 숫자 형식은 structs입니다. class 또는 record 키워드를 사용해 정의한 형식은 참조 형식입니다. 참조 형식과 값 형식의 컴파일 시간 규치 및 런타임 동작은 서로 다릅니다.
클래스 및 구조체는 .NET CTS(공용 형식 스스템)의 기본 구문 중 두 가지입니다. 각각은 기본적으로 하나의 논리 단위에 속하는 데이터 및 동작 집합을 캡슐화하는 데이터 구조입니다. 데이터와 동작은 클래스, 구조체 또는 레코드 "맴버"입니다클래스, 구조체 또는 레코드 선언은 런타임에 인스턴스 또는 개체를 만드는데 사용되는 청사진과도 같습니다.
Person이라는 클래스, 구조체 또는 레코드를 정의하는 경우 Person이 형식의 이름입니다. 형식 Person의 변수 p를 선언하고 초기화 한다면 p는 Person의 개체 또는 인스턴스로 지정됩니다. 같은 Person 형식의 여러 인스턴스를 만들 수 있으며 각 인스턴스는 속성 및 필드에 서로 다른 값을 가질 수 있습니다.
클래스는 참조형식으. 이 형식의 개체가 만들어지면 개체가 할당되는 변수는 해당 메모리에 대한 참조만 보유합니다. 개체참조가 새 변수에 할당되면 새 변수는 원래 개체를 나타냅니다. 모두 동일한 데이터를 참조하므로 한 변수의 변경 내용이 다른 변수에도 반영됩니다. 구조체는 값 형식입니다.
구조체가 만들어지면 해당 구조체가 할당되는 변수에 구조체의 실제 데이터가 포함됩니다. 따라서 새 변수와 원래 변수에 동일한 데이터의 두 가지 별도 복사본이 포함됩니다. 한 복사본의 변경 내용은 다른 복사본에 영향을 주지 않습니다. 레코드 형식은 참조 형식(record class) 또는 값 형식(record struct) 일 수있습니다. 레코드 형식에는 값 같음을 지원하는 메서드가 포함되어 있습니다.
일반적으로 클래스는 더 복잡한 동작을 모델링하는 데 사용됩니다. 클래스는 일반적으로 클래스 개체가 만들어진 후 수정할 데이터를 저장하고 구조체는 작은 데이터 구조에 가장 적합합니다. 구조체는 일반적으로 구조체가 만들어진 후 수정하지 않을 데이터를 저장합니다. 레코드 형식은 추가 컴파일러 합성 맴버가 있는 데이터 구조입니다. 레코드는 일반적으로 개체가 만들어진 후 수정하지 않을 데이터를 저장합니다.
5.값 형식
값 형식은 Stystem.Object 에서 파생되는 System.ValueType에서 파생됩니다. System.ValueType에서 파생되는 형식에는 CLR의 특수 동작이 있습니다 값 형식 변수에는 해당 값이 직접 포함되있습니다. 구조체의 메모리는 변수가 선언된 컨텍스트에서 인라인으로 할당됩니다. 값 형식 변수에 대한 별도 힙 할당이나 가비지 수집 오버헤드는 없습니다.
값 형식인 record struct 형식을 선언하고 레코드의 합성 맴버를 포함할 수 있습니다. 값 형식에는 struct 및 enum의 두 가지 범주가 있습니다. 기본 제공 숫자 형식은 구조체이며, 엑세스할 수 있는 필드와 메서드가 있습니다.
byte b = byte.MaxValue;
Console.WriteLine(b);
하지만 단순 비집계 형식처럼 값을 선언하고 변수에 할당합니다.
byte num = 0xA;
int i = 5;
char c = '2';
값 형식은 sealed입니다. 값 형식(예 System.Int32)에서 형식을 파생할 수 없습니다 구조체는 System.ValueType에서만 상속할 수 있는 구조체를 정의할 수 없습니다. 그러나 구조체는 하나 이상의 인터페이스를 구현할 수 있습니다. 구조체 형식을 구현하는 인터페이스 형식으로 캐스팅할 수 있습니다. 이 캐스트로 인해 boxing작업은 관리되는 힘의 참조 형식 개체 내에 구조체를 래핑합니다.
boxing 작업은 System.Object 또는 인터페이스 형식을 입력 매개 변수로 사용하는 메서드에 값 형식을 전달할 때 발생합니다. struct 키워드를 사용해 고유한 사용자 지정 값 형식을 만듭니다. 일반적으로 구조체는 다음 예제와 같이 소규모 관련 변수 집합의 컨테이너로 사용됩니다.
boxing 및 unboxing - C#
C# 프로그래밍의 boxing 및 unboxing에 대해 알아봅니다. 코드 예제를 살펴보고 사용 가능한 추가 리소스를 확인합니다.
learn.microsoft.com
public struct Cords
{
public int x, y;
public Cords(int p1, int p2)
{
x = p1;
y = p2;
}
}
구조체 형식 - C# reference
C#의 구조체 형식에 관한 자세한 정보
learn.microsoft.com
값 형식 - C# reference
값 형식과 참조 형식, 값 형식의 종류, C#의 기본 제공 값 형식
learn.microsoft.com
값 형식의 다른 범주는 enum입니다. 열거형은 명명된 정수 상수 집합을 정의합니다. 예를 들어 .NET 클래스 라이브러리의 System.IO.FIleMode 열거형에는 파일을 여는 방법을 지정하는 명명의 상수 정수 집합이 포함됩니다.
public enum FileMod
{
CreateNew = 1,
Create = 2,
Open = 3,
OpenOrCreate = 4,
Truecate = 5,
Append = 6,
}
System.IO.FileMode.Create 상수 값은 2입니다. 그러나 이 이름은 소스 코드를 읽는 사람에게 훨씬 더 의미가 있습니다. 따라서 상수 리터럴 숫자 대신 열거형을 사용하는 것이 더 좋습니다.
FileMode 열거형 (System.IO)
운영 체제에서 파일을 여는 방법을 지정합니다.
learn.microsoft.com
모든 열거형은 System.ValueType에 상속받는 System.Enum에서 상속됩니다. 구조체에 적용되는 모든 규칙이 열거형에도 적용됩니다.
열거형 형식 - C# reference
선택 또는 선택의 조합을 나타내는 C# 열거형에 대해 알아봅니다
learn.microsoft.com
6.참조 형식
class,record, delegate, 배열 또는 interface로 정의된 형식은 reference type입니다. reference type의 변수를 선언하는 경우 해당 형식의 인스턴스로 할당되거나 new 연산자를 사용해 생성될 때까지 값 null을 포함합니다.
MyClass myClass = new MyClass();
myClass myClass = myClass;
interface는 new 연산자를 활용해 직접 인스턴스화할 수 없습니다. 대신 인터페이스를 구현하는 클래스의 인스턴스를 만들고 할당합니다.
// 참조 형식
MyClass myClass = new MyClass();
//myClass myClass = myClass;
IMyInterface myInterface = myClass;
IMyInterface myInterFace2 = new MyClass();
개체가 만들어지면 관리되는 힘에 메모리가 할당됩니다. 변수는 개체의 위치에 대한 참조만 포함합니다. 관리되는 힙의 형식은 할당될 때와 회수될 때 모두 오버헤드가 필요합니다. '가비지 수집'은 회수를 수행하는 CLR의 자동 메모리 관리 기능입니다. 그러나 가비지 수집은 고도로 최적화되고 대부분 시나리오에서 성능 문제를 일으키지 않습니다.
자동 메모리 관리 - .NET
자세한 정보: 자동 메모리 관리
learn.microsoft.com
모든 배열은 해당 요소가 값 형식이더라도 참조 형식입니다. 배열은 System.Array 클래스에서 암시적으로 파생됩니다.
int[] nums = [1, 2, 3, 4, 5, 6];
int len = nums.Length;
참조 형식은 상속을 완벽하게 지원합니다. 클래스를 만들 때 sealed로 정의되지 않은 기타 인터페이스 또는 클래스에서 상속할 수 있습니다. 기타 클래스는 직접 만든 클래스에서 상속되 가상 메서드를 재정의할 수 있습니다. 클래스를 직접 만드는 방법에 대한 자세한 내용은 클래스, 구조체, 레코드를 참고할 수 있습니다.
C#의 클래스, 구조체 및 레코드 - C#
C#의 클래스, 구조(구조체), 레코드 사용에 대해 설명합니다.
learn.microsoft.com
개체 지향 프로그래밍 - 상속 - C#
C#에서 상속을 사용하면 다른 클래스에 정의된 동작을 다시 사용, 확장 및 수정하는 새 클래스를 만들 수 있습니다.
learn.microsoft.com
7. 리터럴 값 형식
C#에서 리터럴 값이 컴파일러에서 형식을 받습니다. 숫자의 끝에 문자를 추가해 숫자 리터럴의 입력 방법을 지정할 수 있습니다. 예를 들어 값 4.56이 float으로 처리되도록 지정하려면 숫자 뒤에 "f" 또는 "F"를 추가합니다(4.56f). 문자를 추가하지 않으면 컴파일러가 리터럴의 형식을 유추합니다.
정수 숫자 형식
각 정수 숫자 형식에 대한 범위, 스토리지 크기 및 용도에 대해 알아봅니다.
learn.microsoft.com
부동 소수점 숫자 형식 - C# reference
기본 제공 C# 부동 소수점 형식인 float, double 및 decimal에 대해 알아보기
learn.microsoft.com
리터럴은 형식화되고 모든 형식이 궁극적으로 System.Object에서 파생되기 때문에 다음과 같은 코드로 컴파일할 수 잇습니다.
string s = "The answer is" + 5.ToString();
Console.WriteLine(s);
Type type = 12345.GetType();
Console.WriteLine(type);
8. 제네릭 형식
실제 형식("구체적 형식")에 대한 자리 표시자로 사용되는 하나 의상의 '형식 매개 변수'를 사용해 형식을 사용할 수 있습니다. 클라이언트 코드는 형식의 인스턴스를 만들 때 구체적 형식을 제공합니다. 해당 형식을 제네릭 형식이라 합니다.
예를 들어 .NET 형식 System.Coolections.Generic.List<T>에는 변환을 통해 이름 T가 제공되는 하나의 형식 매개 변수가 있습니다. 형식의 인스턴스를 만들 때 목록에 포함될 개체의 형식(string)을 지정합니다.
List<string> stringList = new List<string>();
stringList.Add("String example");
stringList.Add(4);
형식 매개 변수를 사용하면 각 요소를 개체로 변환할 필요 없이 같은 클래스를 재사용해 요소 형식을 포함할 수 있습니다.컴파일런는 컬렉션 요소의 특정 형식을 인식합니다.
9.암시적 형식, 무명 형식 및 nullable 값 형식
var 키워드를 사용해 클래스 맴버가 아닌 로컬 변수를 암시적으로 형식화 할 수 있습니다. 이 변수는 컴파일 타임에 형식을 받지만 컴파일러에서 제공됩니다.
암시적 형식 지역 변수 - C#
C#의 var 키워드는 초기화 문의 오른쪽에 있는 식에서 변수의 형식을 유추하도록 컴파일러에 지시합니다.
learn.microsoft.com
일반적인 값 형식은 null 값을 가질 수 없습니다. 그러나 형식 뒤 ?를 추가해 null 허용 값 형식을 만들 수 있습니다.
Nullable 값 형식 - C# reference
C# nullable 값 형식 및 사용 방법 알아보기
learn.microsoft.com
10. 컴파일 시간 형식 및 런타임 형식
변수의 컴파일 신간과 런타임 형식은 서로 다를 수 있습니다. 컴파일 시간 형식은 소스 코드에서 선언되거나 유추되는 변수의 형식으로 런타임 형식은 해당 변수에서 참조하는 인스턴스의 형식입니다.
// 컴파일 형식 및 런타임 형식
string message = "string runtime";
하지만 다음 두 가지 예에서 보듯 컴파일 시간 형식이 다른 경우도 있습니다.
object anotherMessage = "This is another string of characters";
IEnumerable<char> someCharacters = "abcdefghijkmnopqrstuvwxyz";
앞선 두 예제에 런타임 형식은 string입니다. 컴파일 시간 형식은 첫번째 줄에서 object 두 번째 줄에서 IEnumerable<char>입니다. 두 형식 변수에 대해 다른 경우 컴파일 시간 형식과 런타임 형식이 적용되는 경우 컴파일 시간 형식과 런타임 형식이 적용되는 경우를 이해하는 것이 중요합니다.
컴파일 시간 형식에 따라 컴파일러가 수행하는 모든 작업이 결정됩니다. 이러한 컴파일러 동작으로는 메서드 호출확인, 오버로드 확인 및 사용 가능한 암시적 및 명시적 캐스트가 있습니다. 런타임 형식에 따라 런타임에서 확인되는 모든 작업이 결정됩니다.이러한 런타임 동작에는 가상 메서드 호출 디스패치, is 및 switch 식 계산, 기타 형식 테스트 API가 포함됩니다. 코드가 형식과 상호 작용하는 방식을 보다 효과적으로 이해하려면 어떤 작업이 어떤 형식에 적용되는지를 알아야 합니다.
관련 단원
기본 제공 형식 - C# reference
C# 기본 제공 값 및 참조 형식 배우기
learn.microsoft.com
C# 형식 시스템 - C#
튜플, 레코드, 값 형식 및 참조 형식과 같은 C#의 형식 생성에 대해 알아봅니다.
learn.microsoft.com
'게임 모딩 > C#' 카테고리의 다른 글
[C#] 9장, C# 개체 지향 프로그래밍(OOP) (0) | 2025.02.24 |
---|---|
[C#] 8.C#의 네임스페이스, 클래스, 레코드, 인터페이스, 제네릭, 익명 형식 (0) | 2025.02.03 |
[C#] 6. C# 프로그램의 일반적인 구조체 (0) | 2025.01.27 |
[C#] 5.목록 형식을 사용한 데이터 컬렉션 관리 (0) | 2025.01.26 |
[C#] 4.분기 및 루프 문이 포함된 조건문 (0) | 2025.01.26 |