C# Programming Guide - Types 최도경 lifeisforu@wemade.com
이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx
Types, Variables, and Values C# 은 type 에민감한언어이다. 모든 variable( 변수 ) 와 constant( 상수 ) 는 type 을가진다. 모든 method 의 signature 는 input parameter 와 return value 를위한 type 을가진다. Class library 는내장 numeric type( 수치형 ) 뿐만아니라 file system, network connection, collection, array, date 등과같은복잡한논리구조를표현하는복잡한 type 들을가진다.
Type, Variables, and Values( cont ) Type 은다음과같은정보를포함하고있다. Variable 이요구하는 storage space. 최대, 최소값. Members( method, field, event 등 ). 상속한 base type. 실행시간에 variable 이할당된 memory 위치. 수행된 operation 의종류.
Built-in Types Integer, floating point value, boolean, text character, decimal value 등을표현하기위한 buit-in type( 내장형 ) 을제공한다.
Custom Types struct, class, interface, enum 을사용해자신만의 custom type 을만들수있다. Collection 을사용할수있다.
Common Type System 모든 type 은 System.Object 를 base class 로해서상속된다. 이러한통일된 type hierarchy 는 Common Type System( CTS ) 이라불린다. CTS 내의각 type 은 value type 이거나 reference type 일수있다. struct 와 enum keyword 를사용한것이 value type 이며, class key word 를사용한것이 reference type 이다. Reference type 과 value type 은서로다른 compile 규칙과 run-time 동작을가진다.
Common Type System( cont )
CTS - Value types System.ValueType 을상속한다. 이 System.ValueType 은 System.Object 를상속한다. ValueType 을상속한 type 들은 CLR 에서특별한동작을한다. 직접값을포함한다. 변수가선언된 context 에상관없이 memory 가 inline 으로할당된다. Heap 에할당되지않으며, garbage collection 의대상도아니다. struct 와 enum 은 value type 이다.
CTS - Value types( cont ) Built-in numeric type 들은 struct 이며, property 와 method 를가진다.
CTS - Value Types( cont )
CTS - Value Types( cont ) Value type 은 sealed 이다. 즉 System.Int32 를상속할수없고, class 나 struct 를상속하는 struct 를만들수없다는것을의미한다. 대신에 interface 를구현할수는있다. System.Object 형을취해야하는 method 에 value type 을넘기게되면 boxing 이일어난다 ( 나중에설명 ).
CTS - Reference Type class, delegate, interface 로정의된 type 은 reference type 이다. 실시간에 reference type 의변수를선언하면 new operator 를사용해명시적으로 object 를생성하거나다른 object 를할당하기전까지는 null 값을가진다. Reference type 의 object 는 managed heap 에생성되며, variable 은 object 의위치에대한참조를가진다.
CTS - Reference Type 같은 object 를참조한다면 hash code 가같다.
CTS - Reference Type Reference type 은 garbage collection 의대상이다. 모든 array 는 reference type 이다. 심지어그것의요소가 value type 이더라도 array 는 reference type 이다.
CTS - Literal Values Compiler 가 type 을결정함.
CTS - Generic Types 하나이상의 type parameter 를가지고선언된 type 을의미함. Type parameter 는실제 type 에대한 placeholder 의역할을함. 같은 class 를요소를 Object 로형변환하지않고도어떤 type 이든포함할수있는 container 로만들기위해서사용. 재사용성과확장성을높임. EX ) List< String > strings = new List< String >();
CTS - Implicit Local Variables var 라는 keyword 를사용. 실제 type 은 compiler 가결정해줌.
CTS - Anonymous Types 명시적으로 type 을정의하지않고도, 하나의 object 에 read-only property 들을넣을수있는방법을제공. Compiler 에의해서 type 이결정됨.
CTS - Nullable 일반적인 value type 은 null 일수가없다. 하지만값이없는상황을표현하고싶을때도있다.
CTS - Nullable( cont ) System.Nullable< T > 는 value type 을 null 로만들수있는가능성을제공한다. Int32? 처럼 "?" 를사용해 nullable 을표현한다.
Boxing & Unboxing Value type 으로선언된 variable 을 object type 으로만드는것이 boxing 이며, 이를다시 value type 으로만드는것이 unboxing 이다. Boxing 을하면 value type 으로선언된 variable 이 heap 으로옮겨지고, unboxing 을하면다시 local 로복사된다. Unboxing 을했을때는 boxing 하기전과같은 variable 이라할수없다.
Boxing & Unboxing( cont )
Boxing & Unboxing( cont ) C++ 과비교를해보면 CTS 의장점을느낄수있다. C++ 은 type 들이하나의 base class 를상속하는구조가아니기때문에, 모든 type 을받아들이는 container 나 parameter 를만들기위해서는 reinterpret_cast< void* > 를사용할수밖에없다. 하지만 reinterpret_cast< void* > 후에는 type 을검사하거나복구할방법이없다.
Conclusion 모든 type 은 System.Object 를상속하며, 이러한상속계층을 Common Type System 이라부른다. 이를통해모든 type 에대한형정보를획득할수있다. Type 은 value type 과 reference type 으로나뉘며, value type 은 local 에, reference type 은 heap 에생성된다. Value type 을 Object type 으로바꿔 heap 에복사하는것을 boxing 이라하고, 그반대를 unboxing 이라한다.