언어/C# 46

C# 메서드 - 1. 생성자

인스턴스 생성자 - 클래스 (참조타입) 생성자는 항상 .ctor이라는 이름으로 불리고 이 이름으로 메서드 정의 메타데이터 테이블에 등록된다. 참조 타입으로 객체의 인스턴스를 생성하면, 데이터 필드들을 저장하기 위한 메모리가 할당되는데 그 과정에서 먼저 객체의 오버헤드 필드(타입 객체 포인터와 동기화 블록 인덱스)가 초기화되고, 그 다음에 타입의 인스턴스 생성자가 호출되어 객체의 초기 상태를 설정한다. 참조타입의 객체를 생성하면, 할당된 메모리는 우선 모두 0으로 초기화되며, 이후 타입의 인스턴스 생성자가 호출된다. 다른 메서드들과 다르게 인스턴스 생성자는 상속되지 않는다. (따라서 virtual,new,override,sealed,abstract 같은 키워드를 사용할 수 없다.) 만약 클래스를 정의할 때..

언어/C# 2020.11.22

C# 의 타입 - 4. 객체의 식별 (Equals, GetHashCode)

Equals System.Object 타입은 Equals 가상 메서드를 제공한다. 매개변수로 지정한 객체가 현재 객체와 동일하다고 판단하면 true를 반환한다. 다음과 같은 Equals 메서드가 있다고 하자 public virtual bool Equals(Object obj) { if(this == obj) return true; return false; } 두 객체의 포인터 주소가 동일하다면 같은 객체를 가리키는 것이므로 참을 반환하는 것은 옳다. 그러나 이것은 객체들의 값들을 비교하지는 못하므로 때에 따라서 적절하지 못할 수 있다. 그래서 프로그래머는 때때로 Equals를 재정의해서 사용해야 하는데, 이 때 객체가 같은 값을 가리키는지 확인하는 게 불가능해지므로 Object타입 내에서 Referenc..

언어/C# 2020.11.14

C# 의 타입 - 3. 값 타입과 참조타입 / 박싱, 언박싱

참조 타입과 값 타입 CLR은 참조 타입(Reference Type)와 값 타입(Value Type)이라는 두 종류의 타입 체계를 지원한다. 참조 타입은 항상 관리되는 힙에 할당된다. 따라서 참조 타입을 사용할 때 마다 메모리의 할당이 발생하는데, 모든 타입이 참조 타입이라면 엄청난 성능 저하가 있을 것이다. 따라서 성능 향상을 목적으로, 단순하고 자주 사용되는 타입들을 위하여 경량화된 값 타입이 존재한다. 값 타입의 인스턴스는 그 자체가 하나의 필드이며 필드를 얻어내기 위해 역추적을 할 필요가 없고 GC의 관리 대상또한 아니다. C#에서 모든 클래스는 참조 타입이며 모든 구조체, 열거 타입은 값 타입니다. (System.Int32등도 구조체이다.) 모든 구조체 타입은 System.ValueType 추상..

언어/C# 2020.11.14

C# 의 타입 - 2. 기본 타입 (Primitve Type)

기본 타입 (Primitve Type) 32비트의 정수형 변수를 할당한다면 다음과 같이 코드를 쓸 수 있다. System.Int32 a = new System.Int32(); 그런데 이렇게 쓰면 너무 귀찮으니까... 대부분의 컴파일러는 다음과 같이 표현하도록 해준다. int a = 0; 그리고 위와 같은 코드는 System.Int32 타입을 사용한 코드와 의미가 동일한 IL 코드를 만들어준다. 이처럼 컴파일러가 직접 지원하는 데이터 타입들을 기본 타입이라고 부른다. C#의 기본 타입과 FCL에 대응되는 타입은 다음과 같다. 기본 타입 FCL 타입 CLS 호환 비고 sbyte System.SBtye ㄴㄴ byte System.Byte ㅇㅇ short System.Int16 ㅇㅇ ushort System.U..

언어/C# 2020.10.31

C# 의 타입 - 1. 타입의 기초

System.Object c#의 모든 타입들은 System.Object를 상속받는다. class A // class A : System.Object 와 같다. (암시적으로 상속) { // code } Object 클래스에는 필드는 존재하지 않으며 다음과 같은 메서드들이 존재한다. (~Object()는 Finalize 메서드이며 protected임) namespace System { public class Object { public Object(); ~Object(); public static bool Equals(Object objA, Object objB); public static bool ReferenceEquals(Object objA, Object objB); public virtual boo..

언어/C# 2020.10.31