반응형

타입의 기초

모든 타입은 System.Object를 상속(Derived)한다.
Class Employee == Class Employee : System.Object

그러니 Object 클래스는 아래와 같은 메서드를 가지고 있다.

Public 메서드

설명

Equals

지정한 객체와 동일한 값을 가지는 경우 true 반환

GetHashCode

객체의 값으로부터 해시 코드를 만들어 반환.
, 생산되는 해시 코드가 유일성을 만족하지 못하므로 사용하려면 이 메서드를 override 하여 안정적으로 사용해야 할 것이다.

ToString

현재 타입의 전체 이름을 문자열로 반환.
몇몇 메서드(Boolean, Int32 )의 구현은 값에 대한 문자열 표현으로 재정의 되어있다.

GetType(비가상함수)

해당 함수를 호출하기 위해 사용된 객체의 타입을 설명하는 Type  타입으로부터 파생된 객체의 인스턴스를 반환

 

Protected 메서드

설명

MemeberWiseClone

이 메서드는 비가상 메서드로 현재 인스턴스와 동일한 타입의 새로운 인스턴스를 생성한 다음, 현재 만들어진 객체의 모든 필드를 새 객체로 복사하여 새 객체의 참조를 반환하는 기능

Finalize

가비지 수집기(Garbage Collector)가 해당 객체를 사용되지 않는다는 것을 파악했을 때, 메모리에 대한 회수요청이 들어왔을 때 호출된다.
별도로 작업을 해야할 필요가 있을 때 반드시 이 메서드를 재정의 해야함.

 

Employee e = new Employee(“ConstructorParam1”);
여기서 [new] 가 하는 일

1.     해당 타입에서 모든 필드들을 메모리에 할당하기 위한 바이트 수를 계산
+
(Heap)상에 타입 객체 포인터(Type Object Pointer) & 동기화 블록 인덱스(Sync Block Index 추가 – CLR에 의해 객체 관리되고 이 포인터 역시 크기에 포함된다.

2.     메모리에 할당한다, 처음 할당할 때에는 모든 바이트들을 0으로 초기화

3.     타입 객체 포인터, 동기화 블록 인덱스 멤버 초기화

4.     생성자에 파라미터가 있으면 그 파라미터를 전달한다.

하지만 해제할 방법은 없다 -> 가비지 컬렉터가 있기 때문

 

캐스팅과 is as

 

형식 테스트 및 캐스트 연산자 - C# 참조

식 결과의 형식을 검사하고, 필요한 경우 다른 형식으로 변환하는 데 사용할 수 있는 C# 연산자에 대해 알아봅니다.

docs.microsoft.com

더보기

다음 연산자를 사용하여 형식 검사 또는 형식 변환을 수행할 수 있습니다.

  • is 연산자: 식의 런타임 형식이 지정된 형식과 호환되는지 확인합니다.
  • as 연산자: 런타임 형식이 지정된 형식과 호환되는 경우 식을 해당 형식으로 명시적으로 변환합니다.
  • 캐스트 연산자 (): 명시적 변환을 수행합니다.
  • typeof 연산자: 형식의 System.Type 인스턴스를 가져옵니다.

is 연산자

is 연산자는 식 결과의 런타임 형식이 지정된 형식과 호환되는지 확인합니다. C# 7.0부터, is 연산자는 식 결과에 패턴이 있는지도 테스트합니다.

형식 테스트 is 연산자가 포함된 식의 양식은 다음과 같습니다.

C#복사

 

E is T

여기서 E는 값을 반환하는 식이고, T는 형식 또는 형식 매개 변수의 이름입니다. E은 무명 메서드 또는 람다 식일 수 없습니다.

E is T 식은 E의 결과가 null이 아니고 참조 변환, boxing 변환 또는 unboxing 변환을 통해 T 형식으로 변환될 수 있는 경우 true를 반환하고, 변환될 수 없으면 false를 반환합니다. is 연산자는 사용자 정의 변환을 고려하지 않습니다.

다음 예제에서는 식 결과의 런타임 형식이 지정된 형식에서 파생되는 경우, 즉 형식 간에 참조 변환이 있는 경우 is 연산자가 true를 반환하는 것을 보여 줍니다.

C#복사

 

public class Base { } public class Derived : Base { } public static class IsOperatorExample { public static void Main() { object b = new Base(); Console.WriteLine(b is Base); // output: True Console.WriteLine(b is Derived); // output: False object d = new Derived(); Console.WriteLine(d is Base); // output: True Console.WriteLine(d is Derived); // output: True } }

다음 예제에서는 is 연산자가 boxing 및 unboxing 변환은 고려하지만 숫자 변환을 고려하지 않는 것을 보여 줍니다.

C#복사

 

실행

int i = 27; Console.WriteLine(i is System.IFormattable); // output: True object iBoxed = i; Console.WriteLine(iBoxed is int); // output: True Console.WriteLine(iBoxed is long); // output: False

C# 변환에 대한 자세한 내용은 C# 언어 사양 변환 장을 참조하세요.

패턴 일치를 사용한 형식 테스트

C# 7.0부터, is 연산자는 식 결과에 패턴이 있는지도 테스트합니다. 특히, 다음 형태의 양식 패턴을 지원합니다.

C#복사

 

E is T v

여기서 E는 값을 반환하는 식이고, T는 형식 또는 형식 매개 변수의 이름이며, v는 T 형식의 새 로컬 변수입니다. E의 결과가 null이 아니고 참조, boxing 또는 unboxing 변환을 통해 T로 변환될 수 있는 경우 E is T v 식이 true를 반환하고 E 결과의 변환된 값이 v 변수에 할당됩니다.

다음 예제에서는 형식 패턴과 is 연산자를 사용하는 방법을 보여 줍니다.

C#복사

 

실행

int i = 23; object iBoxed = i; int? jNullable = 7; if (iBoxed is int a && jNullable is int b) { Console.WriteLine(a + b); // output 30 }

형식 패턴 및 기타 지원되는 패턴에 대한 자세한 내용은 is를 사용한 패턴 일치를 참조하세요.

as 연산자

as 연산자는 식의 결과를 지정된 참조 또는 nullable 값 형식으로 명시적으로 변환합니다. 변환할 수 없는 경우 as 연산자가 null을 반환합니다. 캐스트 연산자 ()와 달리, as 연산자는 예외를 throw하지 않습니다.

다음 형태의 식이 있다고 가정합니다.

C#복사

 

E as T

여기서 E는 값을 반환하는 식이고, T는 형식 또는 형식 매개 변수의 이름입니다. 이 식은 다음과 동일한 결과를 생성합니다.

C#복사

 

E is T ? (T)(E) : (T)null

단, E가 한 번만 계산됩니다.

as 연산자는 참조, nullable, boxing 및 unboxing 변환만 고려합니다. as 연산자를 사용하여 사용자 정의 변환을 수행할 수는 없습니다. 사용자 정의 변환을 수행하려면 캐스트 연산자 ()를 사용합니다.

다음 예제에서는 as 연산자의 사용법을 보여 줍니다.

C#복사

 

실행

IEnumerable<int> numbers = new[] { 10, 20, 30 }; IList<int> indexable = numbers as IList<int>; if (indexable != null) { Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]); // output: 40 }

 참고

앞의 예제와 같이, as 식의 결과를 null과 비교하여 변환에 성공했는지 확인해야 합니다. C# 7.0부터, is 연산자를 사용하여 변환에 성공하는지 테스트하고, 성공한 경우 해당 결과를 새 변수에 할당할 수 있습니다.

캐스트 연산자()

(T)E 형태의 캐스트 식은 E 식의 결과를 T 형식으로 명시적으로 변환합니다. E 형식에서 T 형식으로의 명시적 변환이 없는 경우 컴파일 시간 오류가 발생합니다. 런타임에 명시적 변환이 실패하고 캐스트 식이 예외를 throw할 수도 있습니다.

다음 예제에서는 명시적 숫자 및 참조 변환을 보여 줍니다.

C#복사

 

실행

double x = 1234.7; int a = (int)x; Console.WriteLine(a); // output: 1234 IEnumerable<int> numbers = new int[] { 10, 20, 30 }; IList<int> list = (IList<int>)numbers; Console.WriteLine(list.Count); // output: 3 Console.WriteLine(list[1]); // output: 20

지원되는 명시적 변환에 대한 자세한 내용은 C# 언어 사양 명시적 변환 섹션을 참조하세요. 사용자 지정 명시적 또는 암시적 형식 변환을 정의하는 방법에 대한 자세한 내용은 사용자 정의 변환 연산자를 참조하세요.

다른 () 용도

메서드 또는 대리자를 호출하는 경우에도 괄호를 사용합니다.

괄호를 사용하여 식에서 연산을 계산하는 순서를 조정하기도 합니다. 자세한 내용은 C# 연산자를 참조하세요.

typeof 연산자

typeof 연산자는 형식의 System.Type 인스턴스를 가져옵니다. typeof 연산자의 인수는 다음 예제와 같이 형식 또는 형식 매개 변수의 이름이어야 합니다.

C#복사

 

실행

void PrintType<T>() => Console.WriteLine(typeof(T)); Console.WriteLine(typeof(List<string>)); PrintType<int>(); PrintType<System.Int32>(); PrintType<Dictionary<int, char>>(); // Output: // System.Collections.Generic.List`1[System.String] // System.Int32 // System.Int32 // System.Collections.Generic.Dictionary`2[System.Int32,System.Char]

바인딩되지 않은 제네릭 형식과 typeof 연산자를 사용할 수도 있습니다. 바인딩되지 않은 제네릭 형식의 이름에는 형식 매개 변수 개수보다 하나 더 적은 적절한 개수의 쉼표가 포함되어야 합니다. 다음 예제에서는 바인딩되지 않은 제네릭 형식과 typeof 연산자를 사용하는 방법을 보여 줍니다.

C#복사

 

실행

Console.WriteLine(typeof(Dictionary<,>)); // Output: // System.Collections.Generic.Dictionary`2[TKey,TValue]

식은 typeof 연산자의 인수가 될 수 없습니다. 식 결과의 런타임 형식에 대한 System.Type 인스턴스를 가져오려면 Object.GetType 메서드를 사용합니다.

typeof 연산자를 사용한 형식 테스트

typeof 연산자를 사용하여 식 결과의 런타임 형식이 지정된 형식과 정확히 일치하는지 확인합니다. 다음 예제에서는 typeof 연산자와 is 연산자를 사용한 형식 검사의 차이점을 보여 줍니다.

C#복사

 

public class Animal { } public class Giraffe : Animal { } public static class TypeOfExample { public static void Main() { object b = new Giraffe(); Console.WriteLine(b is Animal); // output: True Console.WriteLine(b.GetType() == typeof(Animal)); // output: False Console.WriteLine(b is Giraffe); // output: True Console.WriteLine(b.GetType() == typeof(Giraffe)); // output: True } }

연산자 오버로드 가능성

is, as  typeof 연산자는 오버로드할 수 없습니다.

사용자 정의 형식은 () 연산자를 오버로드할 수 없지만, 캐스트 식에서 수행할 수 있는 사용자 지정 형식 변환을 정의할 수 있습니다. 자세한 내용은 사용자 정의 변환 연산자를 참조하세요.

 

 

is 연산자

식의 런타임 형식이 지정된 형식과 호환되는지 확인합니다.

as 연산자

런타임 형식이 지정된 형식과 호환되는 경우 식을 해당 형식으로 명시적으로 변환합니다. (실패 예외를 발생시키지 않고 해당 인스턴스에 null)

캐스트 연산자 ():

명시적 변환을 수행합니다.

typeof 연산자

형식의 System.Type 인스턴스를 가져옵니다.

반응형

'C# > CLR via' 카테고리의 다른 글

매개변수 & 프로퍼티  (0) 2020.02.21
메서드  (0) 2020.02.19
참조 타입과 값 타입  (0) 2020.02.18
CLR과 어셈블리  (0) 2020.02.16
CLR(Common Language RunTime) "공용 런타임"이란  (0) 2020.02.07
Posted by Lotus' Library
,