[C#] ์ ์ ์ซ์ ํ์
์ ์ ์ซ์ ํ์ - C# ์ฐธ์กฐ
๊ฐ ์ ์ ์ซ์ ํ์์ ๋ํ ๋ฒ์, ์คํ ๋ฆฌ์ง ํฌ๊ธฐ ๋ฐ ์ฉ๋์ ๋ํด ์์๋ด ๋๋ค.
docs.microsoft.com
Types - C# language specification
ํ์Types ์ํฐํด 09/18/2021 ์ฝ๋ ๋ฐ 48๋ถ ๊ฑธ๋ฆผ ๊ธฐ์ฌ์ 2๋ช ์ด ๋ฌธ์์ ๋ด์ฉ --> C # ์ธ์ด์ ํ์์ value types _ ๋ฐ _์ฐธ์กฐ ํ์*_ ์ด๋ผ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฒ์ฃผ๋ก ๊ตฌ๋ถ ๋ฉ๋๋ค.The types of the C# language are divided into
docs.microsoft.com
์ ์ ์ซ์ ํ์์ ์ ์๋ฅผ ํํํฉ๋๋ค. ๋ชจ๋ ์ ์ ์ซ์ ํ์์ ๊ฐ ํ์์ ๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ณธ ํ์์ด๊ธฐ๋ ํ๋ฉฐ, ๋ฆฌํฐ๋ด๋ก ์ด๊ธฐํํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ ์ ์ซ์ ํ์์ ์ฐ์ , ๋นํธ ๋ ผ๋ฆฌ, ๋น๊ต ๋ฐ ๊ฐ์ ์ฐ์ฐ์๋ฅผ ์ง์ํฉ๋๋ค.
์ ์ ํ์์ ํน์ฑ
C#์ ๋ค์๊ณผ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์๋ ์ ์ ํ์์ ์ง์ํฉ๋๋ค.
byte 1๋ฐ์ดํธ 0~255
short 2๋ฐ์ดํธ -3๋ง~3๋ง
int 4๋ฐ์ดํธ -21์ต~21์ต
long 8๋ฐ์ดํธ
์ฌ๊ธฐ์ s๊ฐ ๋ถ์ผ๋ฉด ์์
sbyte 1๋ฐ์ดํธ -128~127
ushort 2๋ฐ์ดํธ 0~6๋ง
uint 4๋ฐ์ดํธ 0~43์ต
ulong 8๋ฐ์ดํธ
| sbyte | -128 ~ 127 | ๋ถํธ ์๋ 8๋นํธ ์ ์ | System.SByte |
| byte | 0 ~ 255 | ๋ถํธ ์๋ 8๋นํธ ์ ์ | System.Byte |
| short | –32,768 ~ 32,767 | ๋ถํธ ์๋ 16๋นํธ ์ ์ | System.Int16 |
| ushort | 0 ~ 65,535 | ๋ถํธ ์๋ 16๋นํธ ์ ์ | System.UInt16 |
| int | –2,147,483,648 ~ 2,147,483,647 | ๋ถํธ ์๋ 32๋นํธ ์ ์ | System.Int32 |
| uint | 0 ~ 4,294,967,295 | ๋ถํธ ์๋ 32๋นํธ ์ ์ | System.UInt32 |
| long | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | ๋ถํธ ์๋ 64๋นํธ ์ ์ | System.Int64 |
| ulong | 0 ~ 18,446,744,073,709,551,615 | ๋ถํธ ์๋ 64๋นํธ ์ ์ | System.UInt64 |
| nint | ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฆ | ๋ถํธ ์๋ 32๋นํธ ๋๋ 64๋นํธ ์ ์ | System.IntPtr |
| nuint | ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฆ | ๋ถํธ ์๋ 32๋นํธ ๋๋ 64๋นํธ ์ ์ | System.UIntPtr |
๋ง์ง๋ง ๋ ๊ฐ๋ฅผ ์ ์ธํ ๋ชจ๋ ํ ์ด๋ธ ํ์์ ๋งจ ์ผ์ชฝ ์ด์ ๊ฐ C# ํ์ ํค์๋๋ ํด๋นํ๋ .NET ํ์์ ๋ณ์นญ์ ๋๋ค. ํค์๋์ .NET ํ์ ์ด๋ฆ์ ์๋ก ๋ฐ๊ฟ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ ์ธ์ ๋์ผํ ํ์์ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
int a = 123;
System.Int32 b = 123;
ํ์ ๋ง์ง๋ง ๋ ํ์ ์๋ nint ๋ฐ nuint ํ์์ ๊ธฐ๋ณธ ํฌ๊ธฐ ์ ์์ ๋๋ค. ์ด๋ค์ ์ง์ ๋ .NET ํ์์ ์ํด ๋ด๋ถ์ ์ผ๋ก ํ์๋์ง๋ง, ๊ฐ ๊ฒฝ์ฐ์ ํค์๋์ .NET ํ์์ ์๋ก ๋ฐ๊ฟ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ nint ๋ฐ nuint์ ๋ํ ์์ ๋ฐ ๋ณํ์ ํฌ์ธํฐ ํ์ System.IntPtr ๋ฐ System.UIntPtr์ ๋ํด ์ ๊ณตํ์ง ์๋ ์ ์ ํ์์ผ๋ก ์ ๊ณตํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ nint ๋ฐ nuintํ์์ ์ฐธ์กฐํ์ธ์.
๊ฐ ์ ์ ํ์์ ๊ธฐ๋ณธ๊ฐ์ 0์ ๋๋ค. ๊ธฐ๋ณธ ํฌ๊ธฐ ํ์์ ์ ์ธํ ๊ฐ ์ ์ ํ์์๋ ํด๋น ํ์์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์ ๊ณตํ๋ MinValue ๋ฐ MaxValue ์์๊ฐ ์์ต๋๋ค.
System.Numerics.BigInteger ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ๋๋ ํํ์ด ์๋ ๋ถํธ ์๋ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.
์ ์ ๋ฆฌํฐ๋ด
์ ์ ๋ฆฌํฐ๋ด์ ๋ค์ ํ์์ผ ์ ์์ต๋๋ค.
- 10์ง: ์ ๋์ฌ๊ฐ ์์
- 16์ง์: 0x ๋๋ 0X ์ ๋์ฌ ์ฌ์ฉ
- ์ด์ง: 0b ๋๋ 0B ์ ๋์ฌ ์ฌ์ฉ(C# 7.0 ๋ฐ ์ดํ ๋ฒ์ ์์ ๊ฐ๋ฅ)
๋ค์ ์ฝ๋์์๋ ๊ฐ ์์ ๋ฅผ ๋ณด์ฌ ์ค๋๋ค.
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
์์ ์์ ์์๋ C# 7.0๋ถํฐ ์ง์๋๋ ์ซ์ ๊ตฌ๋ถ ๊ธฐํธ์ธ _๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ๋ณด์ฌ ์ค๋๋ค. ๋ชจ๋ ์ข ๋ฅ์ ์ซ์ ๋ฆฌํฐ๋ด์์ ์ซ์ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ์ ๋ฆฌํฐ๋ด์ ํ์์ ์ ๋ฏธ์ฌ๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ฒฐ์ ๋ฉ๋๋ค.
- ๋ฆฌํฐ๋ด์ ์ ๋ฏธ์ฌ๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ํ์์ ๊ฐ์ด ํํ๋ ์ ์๋ int, uint, long, ulong ํ์ ์ค ์ฒซ ๋ฒ์งธ ํ์์ ๋๋ค.
- ์ฐธ๊ณ
- ๋ฆฌํฐ๋ด์ ์์ ๊ฐ์ผ๋ก ํด์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฆฌํฐ๋ด 0xFF_FF_FF_FF๋ uint ํ์์ ์ซ์ 4294967295๋ฅผ ๋ํ๋ด์ง๋ง, int ํ์์ ์ซ์ -1๊ณผ ๊ฐ์ ๋นํธ๋ฅผ ํํํฉ๋๋ค. ํน์ ํ์์ ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ ๋ฆฌํฐ๋ด์ ํด๋น ํ์์ผ๋ก ์บ์คํ ํฉ๋๋ค. ๋ฆฌํฐ๋ด ๊ฐ์ ๋์ ์ ํ์ผ๋ก ํํํ ์ ์๋ ๊ฒฝ์ฐ unchecked ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด unchecked((int)0xFF_FF_FF_FF)๋ -1์ ์์ฑํฉ๋๋ค.
- ๋ฆฌํฐ๋ด์ ์ ๋ฏธ์ฌ๊ฐ U ๋๋ u์ธ ๊ฒฝ์ฐ ํด๋น ํ์์ ๊ฐ์ด ํํ๋ ์ ์๋ uint, ulong ํ์ ์ค ์ฒซ ๋ฒ์งธ ํ์์ ๋๋ค.
- ๋ฆฌํฐ๋ด์ ์ ๋ฏธ์ฌ๊ฐ L ๋๋ l์ธ ๊ฒฝ์ฐ ํด๋น ํ์์ ๊ฐ์ด ํํ๋ ์ ์๋ long, ulong ํ์ ์ค ์ฒซ ๋ฒ์งธ ํ์์ ๋๋ค.
- ์ฐธ๊ณ
- ์๋ฌธ์ l๋ฅผ ์ ๋ฏธ์ฌ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์ l ๋ฐ ์ซ์ 1์ ํผ๋ํ๊ธฐ ์ฌ์ฐ๋ฏ๋ก ์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ ๊ฐ ์์ฑ๋ฉ๋๋ค. ์ฝ๊ฒ ๊ตฌ๋ณํ ์ ์๋๋ก L์ ์ฌ์ฉํฉ๋๋ค.
- ๋ฆฌํฐ๋ด์ ์ ๋ฏธ์ฌ๊ฐ UL, Ul, uL, ul, LU, Lu, lU ๋๋ lu์ด๋ฉด ํด๋น ํ์์ ulong์ ๋๋ค.
์ ์ ๋ฆฌํฐ๋ด๋ก ํ์๋๋ ๊ฐ์ด UInt64.MaxValue๋ฅผ ์ด๊ณผํ๋ฉด ์ปดํ์ผ ์ค๋ฅ CS1021์ด ๋ฐ์ํฉ๋๋ค.
๊ฒฐ์ ๋ ์ ์ ๋ฆฌํฐ๋ด ํ์์ด int์ด๊ณ ๋ฆฌํฐ๋ด์ด ๋ํ๋ด๋ ๊ฐ์ด ๋์ ํ์์ ๋ฒ์ ๋ด์ ์๋ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ด ์์์ ์ผ๋ก sbyte, byte, short, ushort, uint, ulong, nint ๋๋ nuint์ผ๋ก ๋ณํ๋ ์ ์์ต๋๋ค.
byte a = 17;
byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
์์ ์์ ์์ ๋ณผ ์ ์๋ฏ์ด ๋ฆฌํฐ๋ด ๊ฐ์ด ๋์ ํ์์ ๋ฒ์ ๋ด์ ์์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ ์ค๋ฅ CS0031์ด ๋ฐ์ํฉ๋๋ค.
์บ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ๋ฆฌํฐ๋ด๋ก ํ์๋๋ ๊ฐ์ ๊ฒฐ์ ๋ ๋ฆฌํฐ๋ด ํ์ ์ด์ธ์ ํ์์ผ๋ก ๋ณํํ ์๋ ์์ต๋๋ค.
var signedByte = (sbyte)42;
var longVariable = (long)42;
๋ณํ
๋ชจ๋ ์ ์ ์ซ์ ํ์์ ๋ค๋ฅธ ์ ์ ์ซ์ ํ์์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ๋์ ํ์์ด ์์ค ํ์์ ๋ชจ๋ ๊ฐ์ ์ ์ฅํ ์ ์๋ ๊ฒฝ์ฐ ๋ณํ์ ์์์ ์ ๋๋ค. ์ ์ฅํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์บ์คํธ ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ์์ ๋ณํ์ ์ํํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๊ธฐ๋ณธ ์ ๊ณต ์ซ์ ๋ณํ์ ์ฐธ์กฐํ์ธ์.
C # ์ธ์ด์ ํ์์ value types _ ๋ฐ _์ฐธ์กฐ ํ์*_ ์ด๋ผ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฒ์ฃผ๋ก ๊ตฌ๋ถ ๋ฉ๋๋ค. ๊ฐ ํ์๊ณผ ์ฐธ์กฐ ํ์์ ๋ชจ๋ ํ๋ ์ด์์ _ ํ์ ๋งค๊ฐ ๋ณ์ ๋ฅผ ์ฌ์ฉ ํ๋ _์ ๋ค๋ฆญ ํ์์ผ* ์ ์์ต๋๋ค. ํ์ ๋งค๊ฐ ๋ณ์๋ ๊ฐ ํ์๊ณผ ์ฐธ์กฐ ํ์์ ๋ชจ๋ ์ง์ ํ ์ ์์ต๋๋ค.
type
: value_type
| reference_type
| type_parameter
| type_unsafe
;
ํ์, ํฌ์ธํฐ์ ์ต์ข ๋ฒ์ฃผ๋ ์์ ํ์ง ์์ ์ฝ๋ ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ๋ํด์๋ ํฌ์ธํฐ ํ์์ ์์ธํ ์ค๋ช ๋์ด ์์ต๋๋ค.
๊ฐ ํ์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ง์ ํฌํจ ํ๋ ๋ฐ๋ฉด, ์ฐธ์กฐ ํ์์ ๋ณ์๋ ๋ฐ์ดํฐ์ *์ฐธ์กฐ _๋ฅผ ์ ์ฅ ํ ๊ณ , ํ์๋ _ *๊ฐ์ฒด* *๋ก ์๋ ค์ง์ ์ฐธ์กฐ ํ์๊ณผ ๋ค๋ฆ ๋๋ค. ์ฐธ์กฐ ํ์์ ์ฌ์ฉ ํ๋ ๊ฒฝ์ฐ ๋ ๋ณ์๊ฐ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์์ผ๋ฏ๋ก ํ ๋ณ์์ ๋ ํ ์์ ์ด ๋ค๋ฅธ ๋ณ์์์ ์ฐธ์กฐ ํ๋ ๊ฐ์ฒด์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ๊ฐ ํ์์ ์ฌ์ฉ ํ๋ ๊ฒฝ์ฐ ๋ณ์์๋ ๊ฐ๊ฐ ๊ณ ์ ํ ๋ฐ์ดํฐ ์ฌ๋ณธ์ด ์์ผ๋ฉฐ ํ ๋ณ์์ ๋ ํ ์์ ์ด ๋ค๋ฅธ ๋ณ์์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
C #์ ํ์ ์์คํ ์ ๋ชจ๋ ํ์์ ๊ฐ์ ๊ฐ์ฒด๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํตํฉ ๋์์ต๋๋ค. C#์ ๋ชจ๋ ํ์์ object ํด๋์ค ํ์์์ ์ง์ ๋๋ ๊ฐ์ ์ ์ผ๋ก ํ์๋๊ณ object๋ ๋ชจ๋ ํ์์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ์ฐธ์กฐ ํ์์ ๊ฐ์ object๋ก ์ธ์ํจ์ผ๋ก์จ ๊ฐ๋จํ ๊ฐ์ฒด๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๊ฐ ํ์์ ๊ฐ์ boxing ๋ฐ unboxing ์์ (boxing ๋ฐ unboxing)์ ์ํ ํ ์ฌ ๊ฐ์ฒด๋ก ์ฒ๋ฆฌ ๋ฉ๋๋ค.
๊ฐ ํ์
๊ฐ ํ์์ ๊ตฌ์กฐ์ฒด ํ์ ๋๋ ์ด๊ฑฐํ ํ์์ ๋๋ค. C #์์๋ ๋จ์ ํ์ ์ด๋ผ๋ ๋ฏธ๋ฆฌ ์ ์ ๋ ๊ตฌ์กฐ์ฒด ํ์์ ์งํฉ์ ์ ๊ณต ํฉ๋๋ค. ๋จ์ ํ์์ ์์ฝ์ด๋ฅผ ํตํด ์๋ณ ๋ฉ๋๋ค.
value_type
: struct_type
| enum_type
;
struct_type
: type_name
| simple_type
| nullable_type
;
simple_type
: numeric_type
| 'bool'
;
numeric_type
: integral_type
| floating_point_type
| 'decimal'
;
integral_type
: 'sbyte'
| 'byte'
| 'short'
| 'ushort'
| 'int'
| 'uint'
| 'long'
| 'ulong'
| 'char'
;
floating_point_type
: 'float'
| 'double'
;
nullable_type
: non_nullable_value_type '?'
;
non_nullable_value_type
: type
;
enum_type
: type_name
;
์ฐธ์กฐ ํ์์ ๋ณ์์ ๋ฌ๋ฆฌ ๊ฐ ํ์์ ๋ณ์๋ ๊ฐ null ํ์์ด nullable ํ์์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ์ ํฌํจํ ์ ์์ต๋๋ค. Null์ ํ์ฉ ํ์ง ์๋ ๋ชจ๋ ๊ฐ ํ์์ ๋ํด ๊ฐ๊ณผ ๊ฐ์ ๋์ผํ ์งํฉ์ ๋ํ๋ด๋ ํด๋น nullable ๊ฐ ํ์์ด ์์ต๋๋ค null .
๊ฐ ํ์์ ๋ณ์์ ํ ๋น ํ๋ฉด ํ ๋น ๋๋ ๊ฐ์ ๋ณต์ฌ๋ณธ์ด ์์ฑ ๋ฉ๋๋ค. ์ด๋ ์ฐธ์กฐ๋ฅผ ๋ณต์ฌ ํ์ง๋ง ์ฐธ์กฐ๋ก ์๋ณ ๋๋ ๊ฐ์ฒด๊ฐ ์๋ ์ฐธ์กฐ ํ์์ ๋ณ์์ ๋ ํ ํ ๋น๊ณผ ๋ค๋ฆ ๋๋ค.
System.object ํ์
๋ชจ๋ ๊ฐ ํ์์ ํด๋์ค์์ ์์์ ์ผ๋ก ์์ System.ValueType ๋๋ฉฐ,์ด๋ ํด๋์ค์์ ์์ object ๋ฉ๋๋ค. ๋ชจ๋ ํ์์ด ๊ฐ ํ์์์ ํ์ ๋ ์ ์๋ ๊ฒ์ ์๋๋๋ค. ๋ฐ๋ผ์ ๊ฐ ํ์์ ์์์ ์ผ๋ก ๋ด์ธ ๋ฉ๋๋ค (๋ด์ธ ๋ ํด๋์ค).
๋ System.ValueType ์์ฒด value_type ์ด ์๋๋๋ค. ๋์ ๋ชจ๋ value_type s๊ฐ ์๋์ผ๋ก ํ์ ๋๋ class_type ์ ๋๋ค.
๊ธฐ๋ณธ ์์ฑ์
๋ชจ๋ ๊ฐ ํ์์ *๊ธฐ๋ณธ ์์ฑ์ _ ๋ผ๊ณ ํ๋ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ public ์ธ์คํด์ค ์์ฑ์๋ฅผ ์์์ ์ผ๋ก ์ ์ธ ํฉ๋๋ค. ๊ธฐ๋ณธ ์์ฑ์๋ ๊ฐ ํ์์ ๋ํด _ ๊ธฐ๋ณธ๊ฐ* ์ด๋ผ๋ 0์ผ๋ก ์ด๊ธฐํ ๋ ์ธ์คํด์ค๋ฅผ ๋ฐํ ํฉ๋๋ค.
- ๋ชจ๋ simple_type s์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ๋นํธ ํจํด์ ์ํด ์์ฑ ๋ ๋ชจ๋ 0์ ๊ฐ์
๋๋ค.
- ,,,,,, ๋ฐ์ ๊ฒฝ์ฐ sbyte byte ๊ธฐ๋ณธ๊ฐ์ short ushort int uint long ulong 0 ์ ๋๋ค.
- ์ ๊ฒฝ์ฐ char ๊ธฐ๋ณธ๊ฐ์ '\x0000' ์ ๋๋ค.
- ์ ๊ฒฝ์ฐ float ๊ธฐ๋ณธ๊ฐ์ 0.0f ์ ๋๋ค.
- ์ ๊ฒฝ์ฐ double ๊ธฐ๋ณธ๊ฐ์ 0.0d ์ ๋๋ค.
- ์ ๊ฒฝ์ฐ decimal ๊ธฐ๋ณธ๊ฐ์ 0.0m ์ ๋๋ค.
- ์ ๊ฒฝ์ฐ bool ๊ธฐ๋ณธ๊ฐ์ false ์ ๋๋ค.
- Enum_type ์ ๋ ํ E ๊ธฐ๋ณธ๊ฐ์ 0 ํ์์ผ๋ก ๋ณํ ๋์ ๋๋ค E .
- Struct_type ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ๋ชจ๋ ๊ฐ ํ์ ํ๋๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ๊ณ ๋ชจ๋ ์ฐธ์กฐ ํ์ ํ๋๋ฅผ๋ก ์ค์ ํ ์ฌ ์์ฑ ๋๋ ๊ฐ์ ๋๋ค null .
- Nullable_type ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ HasValue ์์ฑ์ด false์ด ๊ณ Value ์์ฑ์ด ์ ์ ๋์ด ์์ง ์์ ์ธ์คํด์ค์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ nullable ํ์์ null ๊ฐ ์ด ๋ผ๊ณ ๋ ํฉ๋๋ค.
๋ค๋ฅธ ์ธ์คํด์ค ์์ฑ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ ํ์์ ๊ธฐ๋ณธ ์์ฑ์๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ํธ์ถ ๋ฉ๋๋ค new . ํจ์จ์ฑ์ ์ํด์ด ์๊ตฌ ์ฌํญ์ ์ค์ ๋ก ๊ตฌํ์์ ์์ฑ์ ํธ์ถ์ ์์ฑ ํ์ง ์๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ์๋ ์์ ์์ i ๋ฐ ๋ณ์ j ๋ ๋ชจ๋ 0์ผ๋ก ์ด๊ธฐํ ๋ฉ๋๋ค.
class A
{
void F() {
int i = 0;
int j = new int();
}
}
๋ชจ๋ ๊ฐ ํ์์๋ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ public ์ธ์คํด์ค ์์ฑ์๊ฐ ์์์ ์ผ๋ก ์์ผ๋ฏ๋ก ๊ตฌ์กฐ์ฒด ํ์์ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ์์ฑ์์ ๋ช ์์ ์ ์ธ์ด ํฌํจ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌ์กฐ์ฒด ํ์์ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ์ธ์คํด์ค ์์ฑ์ (์์ฑ์)๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
๊ตฌ์กฐ์ฒด ํ์
๊ตฌ์กฐ์ฒด ํ์์ ์์, ํ๋, ๋ฉ์๋, ์์ฑ, ์ธ๋ฑ์, ์ฐ์ฐ์, ์ธ์คํด์ค ์์ฑ์, ์ ์ ์์ฑ์ ๋ฐ ์ค์ฒฉ ํ์์ ์ ์ธํ ์ ์๋ ๊ฐ ํ์์ ๋๋ค. ๊ตฌ์กฐ์ฒด ํ์ ์ ์ธ์ ๊ตฌ์กฐ์ฒด ์ ์ธ์ ์ค๋ช ๋์ด ์์ต๋๋ค.
๋จ์ ํ์
C #์์๋ ๋จ์ ํ์ ์ด๋ผ๋ ๋ฏธ๋ฆฌ ์ ์ ๋ ๊ตฌ์กฐ์ฒด ํ์์ ์งํฉ์ ์ ๊ณต ํฉ๋๋ค. ๋จ์ ํ์์ ์์ฝ์ด๋ฅผ ํตํด ์๋ณ ๋์ง๋ง ์ด๋ฌํ ์์ฝ์ด๋ System ์๋ ํ์ ์ค๋ช ๋ ๋๋ก ๋ค์ ์คํ์ด์ค์ ๋ฏธ๋ฆฌ ์ ์ ๋ ๊ตฌ์กฐ์ฒด ํ์์ ๋ ํ ๋ณ์นญ์ ๋๋ค.
| sbyte | System.SByte |
| byte | System.Byte |
| short | System.Int16 |
| ushort | System.UInt16 |
| int | System.Int32 |
| uint | System.UInt32 |
| long | System.Int64 |
| ulong | System.UInt64 |
| char | System.Char |
| float | System.Single |
| double | System.Double |
| bool | System.Boolean |
| decimal | System.Decimal |
๋จ์ ํ์์์ ๊ตฌ์กฐ์ฒด ํ์์ ๋ณ์นญ์ ํ๋ฏ๋ก ๋ชจ๋ ๋จ์ ํ์์๋ ๋ฉค๋ฒ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด์๋ int ์ ์ ์ธ ๋ ๋ฉค๋ฒ System.Int32 ์์์ ์์ ๋ ๋ฉค๋ฒ System.Object ์ ๋ค์ ๋ฌธ์ด ํ์ฉ ๋ฉ๋๋ค.
int i = int.MaxValue; // System.Int32.MaxValue constant
string s = i.ToString(); // System.Int32.ToString() instance method
string t = 123.ToString(); // System.Int32.ToString() instance method
๋จ์ ํ์์ ํน์ ์ถ๊ฐ ์์ ์ ํ์ฉํ๋ค๋ ์ ์์ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ํ์๊ณผ๋ ๋ค๋ฆ ๋๋ค.
- ๊ฐ์ฅ ๊ฐ๋จํ ํ์์ ๋ฆฌํฐ๋ด (๋ฆฌํฐ๋ด)์ ์์ฑ ํ ์ฌ ๊ฐ์ ๋ง๋ค ์ ์๋๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, 123 ๋ ํ์์ ๋ฆฌํฐ๋ด์ด int ๋ฉฐ 'a' ์ ํ์์ ๋ฆฌํฐ๋ด์ ๋๋ค char . C #์ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ์กฐ์ฒด ํ์์ ๋ฆฌํฐ๋ด์ ํ๋ก ๋น์ ํ์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ํ์์ ๊ธฐ๋ณธ๊ฐ์ด ์๋ ๊ฐ์ ๊ถ๊ทน์ ์ผ๋ก ํญ์ ์ด๋ฌํ ๊ตฌ์กฐ์ฒด ํ์์ ์ธ์คํด์ค ์์ฑ์๋ฅผ ํตํด ์์ฑ ๋ฉ๋๋ค.
- ์์ ํผ์ฐ์ฐ์๊ฐ ๋ชจ๋ ๋จ์ ํ์ ์์์ธ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ ์๊ฐ์ ์์ ๊ณ์ฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ constant_expression (์์ ์) ์ด๋ผ๊ณ ํฉ๋๋ค. ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ํ์์ ์ํด ์ ์ ๋ ์ฐ์ฐ์๋ฅผ ํฌํจ ํ๋ ์์ ์์ ์์ผ๋ก ๊ฐ์ฃผ ๋์ง ์์ต๋๋ค.
- const์ ์ธ์ ํตํด ๋จ์ ํ์ (์์)์ ์์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ํ์์ ์์๋ ์์ ์ ์์ง๋ง ํ๋์์ ๋น์ทํ ํจ๊ณผ๋ฅผ ์ ๊ณต static readonly ํฉ๋๋ค.
- ๋จ์ ํ์์ ํฌํจ ํ๋ ๋ณํ์ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ํ์์ ์ํด ์ ์ ๋ ๋ณํ ์ฐ์ฐ์์ ํ๊ฐ์ ์ฐธ์ฌํ ์ ์์ง๋ง ์ฌ์ฉ์ ์ ์ ๋ณํ ์ฐ์ฐ์๋ ๋ค๋ฅธ ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์์ ํ๊ฐ์ ์ฐธ์ฌํ ์ ์์ต๋๋ค (์ฌ์ฉ์ ์ ์ ๋ณํ ํ๊ฐ).
์ ์ ๊ณ์ด ํ์ ํ
C #์,,,,,,, ๋ฐ์ 9 ๊ฐ์ง ์ ์ ํ์์ ์ง์ sbyte byte short ushort int uint long ulong char ํฉ๋๋ค. ์ ์ ๊ณ์ด ํ์์ ๋ค์ ํฌ๊ธฐ์ ๋ฒ์์ ๊ฐ์ ๊ฐ์ต๋๋ค.
- sbyteํ์์-128๊ณผ 127 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง ๋ถํธ ์๋ 8 ๋นํธ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.
- byteํ์์ 0์์ 255 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง ๋ถํธ ์๋ 8 ๋นํธ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.
- shortํ์์-32768๊ณผ 32767 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง ๋ถํธ ์๋ 16 ๋นํธ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.
- ushortํ์์ 0์์ 65535 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง ๋ถํธ ์๋ 16 ๋นํธ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.
- intํ์์-2147483648์์ 2147483647 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง ๋ถํธ ์๋ 32 ๋นํธ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.
- uintํ์์ 0๊ณผ 4294967295 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง ๋ถํธ ์๋ 32 ๋นํธ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.
- longํ์์-9223372036854775808๊ณผ 9223372036854775807 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง ๋ถํธ ์๋ 64 ๋นํธ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.
- ulongํ์์ 0์์ 18446744073709551615 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง ๋ถํธ ์๋ 64 ๋นํธ ์ ์๋ฅผ ๋ํ๋ ๋๋ค.
- charํ์์ 0์์ 65535 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง ๋ถํธ ์๋ 16 ๋นํธ ์ ์๋ฅผ ๋ํ๋ ๋๋ค. char ํ์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ ์งํฉ์ ์ ๋์ฝ๋ ๋ฌธ์ ์งํฉ๊ณผ ์ผ์นํฉ๋๋ค. char์๋์ ๋์ผํ ํํ์ด ์์ง๋ง ushort ํ ํ์์์ ํ์ฉ ๋๋ ๋ชจ๋ ์์ ์ด ๋ค๋ฅธ ํ์์์ ํ์ฉ ๋๋ ๊ฒ์ ์๋๋๋ค.
์ ์ ๊ณ์ด ํ์ ๋จํญ ๋ฐ ์ดํญ ์ฐ์ฐ์๋ ํญ์ ๋ถํธ ์๋ 32 ๋นํธ ์ ์ฒด ์๋ฆฟ์, ๋ถํธ ์๋ 32 ๋นํธ ์ ์ฒด ์๋ฆฟ์, ๋ถํธ ์๋ 64 ๋นํธ ์ ์ฒด ์๋ฆฟ์ ๋๋ ๋ถํธ ์๋ 64 ๋นํธ ์ ์ฒด ์๋ฆฟ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์๋ ํฉ๋๋ค.
- ๋จํญ + ๋ฐ ์ฐ์ฐ์์ ๊ฒฝ์ฐ ~ ํผ์ฐ์ฐ์๋ ํ์์ผ๋ก ๋ณํ ๋ฉ๋๋ค T . ์ฌ๊ธฐ์ T ๋ int uint long ulong ํผ์ฐ์ฐ์์ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฐ์ ์์ ํ ๋ํ๋ผ ์ ์๋,, ๋ฐ์ ์ฒซ ๋ฒ์งธ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ์์ ์ ์ฒด ์๋ฆฟ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์์ ์ ์ํ T ํ ๊ณ ๊ฒฐ๊ณผ์ ํ์์ T ์ ๋๋ค.
- ๋จํญ ์ฐ์ฐ์์ ๊ฒฝ์ฐ - ํผ์ฐ์ฐ์๋ ํ์์ผ๋ก ๋ณํ ๋ T ๊ณ , ์ฌ๊ธฐ์ T ๋ int long ํผ์ฐ์ฐ์์ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฐ์ ์์ ํ ํํํ ์ ์๋ ๋ฐ์ ์ฒซ ๋ฒ์งธ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ์์ ์ ์ฒด ์๋ฆฟ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์์ ์ ์ํ T ํ ๊ณ ๊ฒฐ๊ณผ์ ํ์์ T ์ ๋๋ค. ๋จํญ - ์ฐ์ฐ์๋ ํ์์ ํผ์ฐ์ฐ์์ ์ ์ฉํ ์ ์์ต๋๋ค ulong .
- Binary,,,,,,,,,,,, + - * / % & ^ | ๋ฐ ์ฐ์ฐ์์ ๊ฒฝ์ฐ == != > < >= <= ํผ์ฐ์ฐ์๋ ํ์์ผ๋ก ๋ณํ ๋ฉ๋๋ค T T . ์ฌ๊ธฐ์๋ int uint long ulong ๋ ํผ์ฐ์ฐ์์ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฐ์ ์์ ํ ๋ํ๋ผ ์ ์๋,, ๋ฐ์ ์ฒซ ๋ฒ์งธ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ์์ ์ ์ฒด ์๋ฆฟ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์์ ์ ์ํ T ํ ๊ณ ๊ฒฐ๊ณผ์ ํ์์ T (๋๋ bool ๊ด๊ณํ ์ฐ์ฐ์์ ๊ฒฝ์ฐ)์ ๋๋ค. ํ ํผ์ฐ์ฐ์๊ฐ ํ์์ด long ๊ณ ๋ค๋ฅธ ํผ์ฐ์ฐ์๋ ์ด์ง ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ํ์์ด ๋๋๋ก ํ์ฉ ๋์ง ์์ต๋๋ค ulong .
- ์ดํญ << ๋ฐ ์ฐ์ฐ์์ ๊ฒฝ์ฐ >> ์ผ์ชฝ ํผ์ฐ์ฐ์๊ฐ ํ์์ผ๋ก ๋ณํ ๋ฉ๋๋ค T . ์ฌ๊ธฐ์ T ๋ int uint long ulong ํผ์ฐ์ฐ์์ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฐ์ ์์ ํ ๋ํ๋ผ ์ ์๋,, ๋ฐ์ ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ์์ ์ ์ฒด ์๋ฆฟ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์์ ์ ์ํ T ํ ๊ณ ๊ฒฐ๊ณผ์ ํ์์ T ์ ๋๋ค.
charํ์์ ์ ์ ๊ณ์ด ํ์์ผ๋ก ๋ถ๋ฅ ๋์ง๋ง ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฅธ ์ ์ ๊ณ์ด ํ์๊ณผ ๋ค๋ฆ ๋๋ค.
- ๋ค๋ฅธ ํ์์์ char ํ์์ผ๋ก์ ์์์ ๋ณํ์ ์์ต๋๋ค. ํนํ, ๋ฐ ํ์์๋ sbyte byte ushort ํ์์ ์ฌ์ฉ ํ ์ฌ ์์ ํ ํํํ ์ ์๋ ๊ฐ ๋ฒ์๊ฐ ์์ง๋ง char , ๋๋์์๋ก์ ์์์ ๋ณํ์ด sbyte byte ushort char ์์ต๋๋ค.
- charํ์์ ์์๋ character_literal s๋ก ์์ฑ ํ๊ฑฐ๋ ํ์์ ๋ ํ ์บ์คํธ์ ํจ๊ป integer_literal ๋ก ์์ฑ ๋์ด์ผ ํฉ๋๋ค char . ์๋ฅผ ๋ค์ด (char)10์ '\x000A'๊ณผ ๊ฐ์ต๋๋ค.
checked๋ฐ unchecked ์ฐ์ฐ์์ ๋ฌธ์ ์ ์ ๊ณ์ด ํ์ ์ฐ์ ์ฐ์ฐ ๋ฐ ๋ณํ (checked ๋ฐ unchecked ์ฐ์ฐ์)์ ๋ ํ ์ค๋ฒํ๋ก ๊ฒ์ฌ๋ฅผ ์ ์ด ํ๋ ๋ฐ ์ฌ์ฉ ๋ฉ๋๋ค. checked์ปจํ ์คํธ์์ ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ ํ๋ฉด ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ ํ๊ฑฐ๋์ด System.OverflowException throw ๋ฉ๋๋ค. unchecked์ปจํ ์คํธ์์ ์ค๋ฒํ๋ก๋ ๋ฌด์ ๋ ๊ณ ๋์ ํ์์ ๋ง์ง ์๋ ์์ ๋นํธ๋ ๋ฌด์ ๋ฉ๋๋ค.
๋ถ๋ ์์์ ํ์
C #์์๋ ๋ ๊ฐ์ ๋ถ๋ ์์์ ํ์ float ๋ฐ์ ์ง์ double ํฉ๋๋ค. float๋ฐ double ํ์์ ๋ค์ ๊ฐ ์งํฉ์ ์ ๊ณต ํ๋ 32 ๋นํธ ๋จ ์ ๋ฐ๋ ๋ฐ 64 ๋นํธ ๋ฐฐ์ ๋ฐ๋ IEEE 754 ํ์์ ์ฌ์ฉ ํ ์ฌ ํํ ๋ฉ๋๋ค.
- ์์ 0 ๋ฐ ์์ 0. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์์ 0๊ณผ ์์ 0์ ๋จ์ ๊ฐ 0๊ณผ ๋์ผ ํ ๊ฒ ์๋ ํ์ง๋ง ํน์ ์ฐ์ฐ์ ๋ (๋๋๊ธฐ ์ฐ์ฐ์)๋ฅผ ๊ตฌ๋ถ ํฉ๋๋ค.
- ์์ ๋ฌดํ๋ ๋ฐ ์์ ๋ฌดํ๋ ๋ฌดํ๋๋ 0์ด ์๋ ์ซ์๋ฅผ 0์ผ๋ก ๋๋๋ ์ฐ์ฐ์ ์ํด ์์ฑ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด 1.0 / 0.0์ ์์ ๋ฌดํ๋๋ฅผ ์์ฑํ๊ณ -1.0 / 0.0์ ์์ ๋ฌดํ๋๋ฅผ ์์ฑํฉ๋๋ค.
- ์ซ์๊ฐ ์๋ ๊ฐ (์ข ์ข ์ฝ์ด NaN)์ ๋๋ค. NaN์ 0์ผ๋ก 0 ๋๋๊ธฐ์ ๊ฐ์ ์๋ชป๋ ๋ถ๋ ์์์ ์ฐ์ฐ์ ์ํด ์์ฑ๋ฉ๋๋ค.
- ํ์์ ๋ ํ 0์ด ์๋ ์ ํ ๊ฐ ์งํฉ์ ๋๋ค s * m * 2^e . ์ฌ๊ธฐ์ s ๋ 1 ๋๋-1์ด ๊ณ ,์ m e ํน์ ๋ถ๋ ์์์ ํ์ (,, ๋ฐ float 0 < m < 2^24 -149 <= e <= 104 ์ double 0 < m < 2^53 -1075 <= e <= 970 ๊ฒฝ์ฐ)์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ๋น ์ ๊ทํ ๋ ๋ถ๋ ์์์ ์ซ์๋ 0์ด ์๋ ์ ํจํ ๊ฐ์ผ๋ก ๊ฐ์ฃผ ๋ฉ๋๋ค.
floatํ์์ ๋๋ต์์ 1.5 * 10^-45 3.4 * 10^38 7 ์๋ฆฌ์ ์ ์ฒด ์๋ฆฟ์๋ฅผ ๊ฐ๋ ๊ฐ์ ๋ํ๋ผ ์ ์์ต๋๋ค.
doubleํ์์ ๋๋ต์์ 5.0 * 10^-324 1.7 × 10^308 15-16 ์๋ฆฌ์ ์ ์ฒด ์๋ฆฟ์๋ฅผ ๊ฐ๋ ๊ฐ์ ๋ํ๋ผ ์ ์์ต๋๋ค.
์ดํญ ์ฐ์ฐ์์ ํผ์ฐ์ฐ์ ์ค ํ๋๊ฐ ๋ถ๋ ์์์ ํ์์ธ ๊ฒฝ์ฐ ๋ค๋ฅธ ํผ์ฐ์ฐ์๋ ์ ์ ํ์ ๋๋ ๋ถ๋ ์์์ ํ์ ์ด์ด์ผ ํ๋ฉฐ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ ๋ฉ๋๋ค.
- ํผ์ฐ์ฐ์ ์ค ํ๋๊ฐ ์ ์ ํ์์ด ๋ฉด ํด๋น ํผ์ฐ์ฐ์๋ ๋ค๋ฅธ ํผ์ฐ์ฐ์์ ๋ถ๋ ์์์ ํ์์ผ๋ก ๋ณํ ๋ฉ๋๋ค.
- ๊ทธ๋ฐ ๋ค์ ํผ์ฐ์ฐ์ ์ค ํ๋๊ฐ ํ์์ธ ๊ฒฝ์ฐ double ๋ค๋ฅธ ํผ์ฐ์ฐ์๊ฐ๋ก ๋ณํ ๋ ๊ณ double , ์ต์ double ๋ฒ์์ ์ ์ฒด ์๋ฆฟ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์ฐ์ฐ์ด ์ํ ๋๋ฉฐ, ๊ฒฐ๊ณผ์ ํ์์ด double (๋๋ bool ๊ด๊ณํ ์ฐ์ฐ์์ ๊ฒฝ์ฐ)์ ๋๋ค.
- ๊ทธ๋ ์ง ์์ผ๋ฉด ์ต์ ๋ฒ์์ ์ ์ฒด ์๋ฆฟ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์์ ์ ์ํ ํ float ๊ณ , ๊ฒฐ๊ณผ์ ํ์์ float (๋๋ bool ๊ด๊ณํ ์ฐ์ฐ์์ ๊ฒฝ์ฐ)์ ๋๋ค.
ํ ๋น ์ฐ์ฐ์๋ฅผ ํฌํจ ํ๋ ๋ถ๋ ์์์ ์ฐ์ฐ์๋ ์์ธ๋ฅผ ์์ฑ ํ์ง ์์ต๋๋ค. ๋์ , ์์ธ ์ํฉ์์ ๋ถ๋ ์์์ ์ฐ์ฐ์ ์๋์ ์ค๋ช ๋ ๋๋ก 0, ๋ฌดํ๋ ๋๋ NaN์ ์์ฑ ํฉ๋๋ค.
- ๋ถ๋ ์์์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ ํ์์ ๋นํด ๋๋ฌด ์์ ๊ฒฝ์ฐ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ ์์ 0 ๋๋ ์์ 0์ด ๋ฉ๋๋ค.
- ๋ถ๋ ์์์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ ํ์์ ๋นํด ๋๋ฌด ํฐ ๊ฒฝ์ฐ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ ์์ ๋ฌดํ๋ ๋๋ ์์ ๋ฌดํ๋๊ฐ ๋ฉ๋๋ค.
- ๋ถ๋ ์์์ ์ฐ์ฐ์ด ์๋ชป ๋ ๊ฒฝ์ฐ ์์ ์ ๊ฒฐ๊ณผ๋ NaN์ด ๋ฉ๋๋ค.
- ๋ถ๋ ์์์ ์ฐ์ฐ์ ํผ์ฐ์ฐ์ ์ค ํ๋ ๋๋ ๋ ๋ค๊ฐ NaN์ด๋ฉด ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ NaN์ด ๋ฉ๋๋ค.
๋ถ๋ ์์์ ์ฐ์ฐ์ ์์ ์ ๊ฒฐ๊ณผ ํ์ ๋ณด๋ค ๋์ ์ ๋ฐ๋๋ก ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ผ๋ถ ํ๋์จ์ด ์ํคํ ์ฒ๋ ํ์ ๋ณด๋ค ๋ ํฌ๊ณ ์ ์ฒด ์๋ฆฟ์๋ฅผ ํฌํจ ํ๋ "ํ์ฅ" ๋๋ "long double" ๋ถ๋ ์์์ ํ์์ ์ง์ double ํ ๊ณ ์ด ๋์ ์ ์ฒด ์๋ฆฟ์ ํ์์ ์ฌ์ฉ ํ ์ฌ ๋ชจ๋ ๋ถ๋ ์์์ ์ฐ์ฐ์ ์์์ ์ผ๋ก ์ํ ํฉ๋๋ค. ์ฑ๋ฅ์ด ๊ณผ๋ ํ ๊ฒ ์ฆ๊ฐ ํ๋ ๊ฒฝ์ฐ์๋ง ์ด๋ฌํ ํ๋์จ์ด ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉ ํ ์ฌ ์ ๋ฐ๋๊ฐ ๋ฎ์ ๋ถ๋ ์์์ ์์ ์ ์ํํ ์ ์์ผ๋ฉฐ, ์ฑ๋ฅ๊ณผ ์ ์ฒด ์๋ฆฟ์๋ฅผ ๋ชจ๋ ์์ค ๊ตฌํ ํด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค. c #์์๋ ๋ชจ๋ ๋ถ๋ ์์์ ์ฐ์ฐ์ ๋ ๋์ ์ ๋ฐ๋ ํ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ณด๋ค ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณต ํ๋ ๊ฒ ์ธ์๋์ด๋ก ์ธํด ์ธก์ ๊ฐ๋ฅํ ์ํฅ์ด ๊ฑฐ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณฑํ๊ธฐ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑ ํ๋ ํผ์ ์์์ x * y / z double ์ดํ ๋๋๊ธฐ๋ ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฒ์์ ๋ค์ ํ์ ํ์ง๋ง double ์์ด ๋ ๋์ ๋ฒ์ ํ์์ผ๋ก ๊ณ์ฐ ๋ ๋ฉด ๋ฌดํ๋ ๋์ ์ ํ ๊ฒฐ๊ณผ๊ฐ ์์ฑ ๋ ์ ์์ต๋๋ค.
10์ง ํ์
decimal ํ์์ ์ฌ๋ฌด ๋ฐ ํตํ ๊ณ์ฐ์ ์ ํฉํ 128๋นํธ ๋ฐ์ดํฐ ํ์์ ๋๋ค. ์ด decimal ํ์์์์ 1.0 * 10^-28 7.9 * 10^28 28-29 ์๋ฆฌ์ ์ ํจ ์๋ฆฟ์๋ก ๋ฒ์๊ฐ ๋์ ๊ฐ์ ๋ํ๋ผ ์ ์์ต๋๋ค.
ํ์์ ๋ ํ ์ ํ ๊ฐ ์งํฉ์ ํ์ decimal ์ ๋๋ค (-1)^s * c * 10^-e . ์ฌ๊ธฐ์์ ๋ถํธ๋ s 0 ๋๋ 1์ด ๊ณ ๊ณ์๋์ c ์ํด ์ง์ ๋๋ฉฐ 0 <= *c* < 2^96 ์์ ์๋ฆฟ์์ ๋๋ค e 0 <= e <= 28 . decimal ํ์์ด signed 0, ๋ฌดํ๋ ๋๋ NaN์ ์ง์ ํ์ง ์์ต๋๋ค. ๋ decimal 10์ ๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ 96 ๋นํธ ์ ์๋ก ํ์ ๋ฉ๋๋ค. ๊ฐ decimal ๋ณด๋ค ์์ ์ ๋๊ฐ์ ์ฌ์ฉ ํ๋ ๊ฒฝ์ฐ 1.0m ๊ฐ์ 28 ๋ฒ์งธ ์์ ์๋ฆฟ์์ ๋์ผ ํ์ง๋ง ๋ ์ด์ ํ์ ํ์ง ์์ต๋๋ค. ๊ฐ decimal ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์ ๋๊ฐ์ ์ฌ์ฉ ํ๋ ๊ฒฝ์ฐ 1.0m ๊ฐ์ 28 ๋๋ 29 ์๋ฆฌ ์ซ์์ ๋์ผ ํฉ๋๋ค. float๋ฐ double ๋ฐ์ดํฐ ํ์๊ณผ ๋ฌ๋ฆฌ 0.1์ ๊ฐ์ ์์ ์์ ์๋ฆฟ์๋ ํํ์์ ์ ํ ํ ๊ฒ ํํํ ์ ์์ต๋๋ค decimal . float๋ฐ ํํ์์ double ์ด๋ฌํ ์ซ์๋ ์ข ์ข ๋ฌดํ ๋ถ์๋ก ํ์ ๋๋ฏ๋ก ์ด๋ฌํ ํํ์ ๋ฐ์ฌ๋ฆผ ์ค๋ฅ๊ฐ ๋ฐ์ ํ๊ธฐ ์ฝ์ต๋๋ค.
์ดํญ ์ฐ์ฐ์์ ํผ์ฐ์ฐ์ ์ค ํ๋๊ฐ ํ์์ธ ๊ฒฝ์ฐ decimal ๋ค๋ฅธ ํผ์ฐ์ฐ์๋ ์ ์ ํ์ ๋๋ ํ์ ์ด์ด์ผ ํฉ๋๋ค decimal . ์ ์ ๊ณ์ด ํ์ ํผ์ฐ์ฐ์๊ฐ ์๋ ๊ฒฝ์ฐ decimal ์์ ์ ์ํ ํ๊ธฐ ์ ์๋ก ๋ณํ ๋ฉ๋๋ค.
ํ์์ ๊ฐ์ ๋ ํ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ decimal ๊ฐ ์ฐ์ฐ์์ ๋ํด ์ ์ ๋ ๋๋ก ์ ํํ ๊ฒฐ๊ณผ (์์ ์๋ฆฟ์ ์ ์ง)๋ฅผ ๊ณ์ฐํ ๋ค์ ํํ์ ๋ง๊ฒ ๋ฐ์ฌ๋ฆผ ํ ๊ฒฐ๊ณผ์ ๋๋ค. ๊ฒฐ๊ณผ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ํํ ๊ฐ๋ฅํ ๊ฐ์ผ๋ก ๋ฐ์ฌ๋ฆผ ๋ ๊ณ , ๊ฒฐ๊ณผ๋ ๋ ๊ฐ์ ํํํ ์ ์๋ ๊ฐ๊ณผ ๋์ผ ํ ๊ฒ ๋น์ทํ ๊ฒฝ์ฐ ("์ํ์์ ๋ฐ์ฌ๋ฆผ" ์ด๋ผ๊ณ ํจ) 0 ์ธ ๊ฒฐ๊ณผ๋ ํญ์ ๋ถํธ๊ฐ 0์ด ๊ณ ์์ ์๋ฆฟ์๊ฐ 0์ ๋๋ค.
Decimal ์ฐ์ ์ฐ์ฐ์ด ์ ๋ ๊ฐ ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ์์ฑ ํ๋ ๊ฒฝ์ฐ 5 * 10^-29 ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ 0์ด ๋ฉ๋๋ค. decimal์ฐ์ ์ฐ์ฐ์์ ํ์์ ๋ํด ๋๋ฌด ๋ง์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑ ํ๋ ๊ฒฝ์ฐ decimal System.OverflowException ์ด throw ๋ฉ๋๋ค.
decimalํ์์ด ๋ถ๋ ์์์ ํ์ ๋ณด๋ค ์ ๋ฐ๋๋ ํฌ์ง๋ง ๋ฒ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ถ๋ ์์์ ํ์์์๋ก ๋ณํ ํ๋ฉด decimal ์ค๋ฒํ๋ก ์์ธ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ์์ decimal ๋ถ๋ ์์์ ํ์์ผ๋ก ๋ณํ ํ๋ฉด ์ ์ฒด ์๋ฆฟ์๊ฐ ์์ค ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก, ๋ถ๋ ์์์ ํ์๊ณผ, ๋ช ์์ ์บ์คํธ๊ฐ ์๋ ์์์ ๋ณํ์ ์กด์ฌ ํ์ง ์์ต๋๋ค decimal decimal . ๋์ผํ ์์์ ๋ถ๋ ์์์ ๊ณผ ํผ์ฐ์ฐ์๋ฅผ ํผํฉํ ์ ์์ต๋๋ค.
Bool ํ์
boolํ์์ ๋ถ์ธ ๋ ผ๋ฆฌ ์๋์ ๋ํ๋ ๋๋ค. ํ์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ bool true ๋ฐ false ์ ๋๋ค.
๊ณผ ๋ค๋ฅธ ํ์ ์ฌ์ด์๋ ํ์ค ๋ณํ์ด ์์ต๋๋ค bool . ํนํ bool ํ์์ ๊ณ ์ ํ๋ฉฐ ์ ์ ๊ณ์ด ํ์๊ณผ ๊ตฌ๋ถ ๋๋ฉฐ, bool ๊ฐ์ ์ ์ ๊ณ์ด ๊ฐ ๋์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
C ๋ฐ c + + ์ธ์ด์์ 0 ๊ฐ์ ์ ์ ๊ณ์ด ๋๋ ๋ถ๋ ์์์ ๊ฐ ๋๋ null ํฌ์ธํฐ๋ฅผ ๋ถ์ธ ๊ฐ์ผ๋ก ๋ณํ ํ๊ฑฐ๋ false 0์ด ์๋ ์ ์ ๊ณ์ด ๋๋ ๋ถ๋ ์์์ ๊ฐ์ผ๋ก ๋ณํ ํ๊ฑฐ๋ null์ด ์๋ ํฌ์ธํฐ๋ฅผ ๋ถ์ธ ๊ฐ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค true . C #์์ ์ด๋ฌํ ๋ณํ์ ์ ์ ๊ณ์ด ๋๋ ๋ถ๋ ์์์ ๊ฐ์ 0์ผ๋ก ๋ช ์์ ์ผ๋ก ๋น๊ต ํ๊ฑฐ๋ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ์ ๋ช ์์ ์ผ๋ก ๋น๊ต ํ ์ฌ ์ํ ๋ฉ๋๋ค null .
์ด๊ฑฐํ ํ์
์ด๊ฑฐํ ํ์์ ๋ช ๋ช ๋ ์์๊ฐ ์๋ ๊ณ ์ ํ ํ์์ ๋๋ค. ๋ชจ๋ ์ด๊ฑฐํ ํ์์๋,,,,, ๋๋ ์ฌ์ผ ํ๋ ๊ธฐ๋ณธ ํ์์ด ์์ต๋๋ค byte sbyte short ushort int uint long ulong . ์ด๊ฑฐํ ํ์์ ๊ฐ ์งํฉ์ ๋ด๋ถ ํ์์ ๊ฐ ์งํฉ๊ณผ ๋์ผ ํฉ๋๋ค. ์ด๊ฑฐํ ํ์์ ๊ฐ์ ๋ช ๋ช ๋ ์์ ๊ฐ์ผ๋ก ์ ํ ๋์ง ์์ต๋๋ค. ์ด๊ฑฐํ ํ์์ ์ด๊ฑฐํ ์ ์ธ (์ด๊ฑฐํ์ ์ธ)์ ํตํด ์ ์ ๋ฉ๋๋ค.
Nullable ์ ํ
Nullable ํ์์ ํด๋น ๊ธฐ๋ณธ ํ์ ๋ฐ ์ถ๊ฐ null ๊ฐ์ ๋ชจ๋ ๊ฐ์ ๋ํ๋ผ ์ ์์ต๋๋ค. Nullable ํ์์ด ์์ฑ ๋ฉ๋๋ค T? T . ์ฌ๊ธฐ์์ ๊ธฐ๋ณธ ํ์์ ๋๋ค. ์ด ๊ตฌ๋ฌธ์์ ์ถ์ฝํ ์ด๋ฉฐ System.Nullable<T> ๋ ๊ฐ์ง ํํ๋ฅผ ์๋ก ๋ฐ๊ฟ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Null์ ํ์ฉ ํ์ง ์๋ ๊ฐ ํ์ ๋ฐ๋๋ก๋ System.Nullable<T> ๋ฐ ํด๋น ์ฝ์ด T? (์ ๊ฒฝ์ฐ) ๋ฐ null์ T ํ์ฉ ํ์ง ์๋ ๊ฐ ํ์ (์ ์ฝ ์กฐ๊ฑด์ด ์๋ ๋ชจ๋ ํ์ ๋งค๊ฐ ๋ณ์)์ผ๋ก ์ ํ ๋๋ ๋ชจ๋ ํ์ ๋งค๊ฐ ๋ณ์์ ๋ ํ ๊ฐ ํ์์ ๋๋ค struct . System.Nullable<T>ํ์์ T (ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ ์กฐ๊ฑด)์ ๋ ํ ๊ฐ ํ์ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํฉ๋๋ค. ์ฆ, nullable ํ์์ ๊ธฐ๋ณธ ํ์์ด null์ ํ์ฉ ํ์ง ์๋ ๊ฐ ํ์์ผ ์ ์์ต๋๋ค. Nullable ํ์์ ๊ธฐ๋ณธ ํ์์ nullable ํ์ ๋๋ ์ฐธ์กฐ ํ์์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด int?? ๋ฐ string? ์ ์๋ชป ๋ ํ์์ ๋๋ค.
Nullable ํ์์ ์ธ์คํด์ค๋ T? ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ public ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ํฌํจ ํฉ๋๋ค.
- HasValueํ์์ ์์ฑbool
- Valueํ์์ ์์ฑT
์ด true ์ธ ์ธ์คํด์ค๋ HasValue null์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ ๋ฉ๋๋ค. Null์ด ์๋ ์ธ์คํด์ค๋ ์๋ ค์ง ๊ฐ์ ํฌํจ ํ ๊ณ Value ํด๋น ๊ฐ์ ๋ฐํ ํฉ๋๋ค.
๊ฐ false ์ธ ์ธ์คํด์ค๋ HasValue null ์ด๋ผ๊ณ ํฉ๋๋ค. Null ์ธ์คํด์ค์ ์ ์ ๋์ง ์์ ๊ฐ์ด ์์ต๋๋ค. Null ์ธ์คํด์ค์๋ฅผ ์ฝ์ผ๋ ค๊ณ ํ๋ฉด์ด Value System.InvalidOperationException throw ๋ฉ๋๋ค. Nullable ์ธ์คํด์ค์ ์์ฑ์ ์ก์ธ์ค ํ๋ ํ๋ก์ธ์ค๋ฅผ Value ๋ํ ํด์ ๋ผ๊ณ ํฉ๋๋ค.
๊ธฐ๋ณธ ์์ฑ์ ์ธ์๋ ๋ชจ๋ nullable ํ์์๋ T? ํ์์ ๋จ์ผ ์ธ์๋ฅผ ์ฌ์ฉ ํ๋ public ์์ฑ์๊ฐ ์์ต๋๋ค T . xํ์์ ๊ฐ์ด ์ง์ ๋ T ๊ฒฝ์ฐ ํผ์ ์์ฑ์ ํธ์ถ์ ๋๋ค.
new T?(x)
์์ฑ์ด ์ธ์ null์ด ์๋ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค T? Value x . ์ง์ ๋ ๊ฐ์ ๋ํด null์ ํ์ฉ ํ์ง ์๋ ํ์์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ํ๋ก์ธ์ค๋ฅผ ๋ํ ์ด๋ผ๊ณ ํฉ๋๋ค.
์์์ ๋ณํ์ null ๋ฆฌํฐ๋ด์์ T? (Null ๋ฆฌํฐ๋ด ๋ณํ) ๋ฐ์์ T T? (์์์ nullable ๋ณํ)๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฐธ์กฐ ํ์
์ฐธ์กฐ ํ์์ ํด๋์ค ํ์, ์ธํฐํ์ด์ค ํ์, ๋ฐฐ์ด ํ์ ๋๋ ๋๋ฆฌ์ ํ์์ ๋๋ค.
reference_type
: class_type
| interface_type
| array_type
| delegate_type
;
class_type
: type_name
| 'object'
| 'dynamic'
| 'string'
;
interface_type
: type_name
;
array_type
: non_array_type rank_specifier+
;
non_array_type
: type
;
rank_specifier
: '[' dim_separator* ']'
;
dim_separator
: ','
;
delegate_type
: type_name
;
์ฐธ์กฐ ํ์ ๊ฐ์ ํ์์ *instance _์ ๋ ํ ์ฐธ์กฐ ์ด๋ฉฐ, ํ์๋ _ *๊ฐ์ฒด* *๋ก ์๋ ค์ ธ ์์ต๋๋ค. ํน์ ๊ฐ์ null ๋ชจ๋ ์ฐธ์กฐ ํ์๊ณผ ํธํ ๋๋ฉฐ ์ธ์คํด์ค๊ฐ ์์์ ๋ํ๋ ๋๋ค.
ํด๋์ค ํ์
ํด๋์ค ํ์์ ๋ฐ์ดํฐ ๋ฉค๋ฒ (์์ ๋ฐ ํ๋), ํจ์ ๋ฉค๋ฒ (๋ฉ์๋, ์์ฑ, ์ด๋ฒคํธ, ์ธ๋ฑ์, ์ฐ์ฐ์, ์ธ์คํด์ค ์์ฑ์, ์๋ฉธ์ ๋ฐ ์ ์ ์์ฑ์) ๋ฐ ์ค์ฒฉ ํ์์ ํฌํจ ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ ํฉ๋๋ค. ํด๋์ค ํ์์ ํ์ ํด๋์ค์์ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ํ์ฅ ํ ๊ณ ํน์ํํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ธ ์์์ ์ง์ ํฉ๋๋ค. ํด๋์ค ํ์์ ์ธ์คํด์ค๋ object_creation_expression s (๊ฐ์ฒด ์์ฑ ์)๋ฅผ ์ฌ์ฉ ํ ์ฌ ์์ฑ ๋ฉ๋๋ค.
ํด๋์ค ํ์์ ํด๋์ค์์ ์ค๋ช ํฉ๋๋ค.
๋ฏธ๋ฆฌ ์ ์ ๋ ํน์ ํด๋์ค ํ์์ ์๋ ํ์ ์ค๋ช ๋ ๋๋ก c # ์ธ์ด์์ ํน๋ณ ํ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
| System.Object | ๋ค๋ฅธ ๋ชจ๋ ํ์์ ๊ถ๊ทน์ ์ธ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ๊ฐ์ฒด ํ์์์ฐธ์กฐ ํ์ธ์. |
| System.String | C # ์ธ์ด์ ๋ฌธ์์ด ํ์์ ๋๋ค. ๋ฌธ์์ด ํ์์์ฐธ์กฐ ํ์ญ์์ค. |
| System.ValueType | ๋ชจ๋ ๊ฐ ํ์์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. System.object ํ์์์ฐธ์กฐ ํ์ญ์์ค. |
| System.Enum | ๋ชจ๋ ์ด๊ฑฐํ ํ์์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ์ด๊ฑฐํ์ ์ฐธ์กฐ ํ์ธ์. |
| System.Array | ๋ชจ๋ ๋ฐฐ์ด ํ์์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ๋ฐฐ์ด์ ์ฐธ์กฐํ์ธ์. |
| System.Delegate | ๋ชจ๋ ๋๋ฆฌ์ ํ์์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ๋๋ฆฌ์๋ฅผ ์ฐธ์กฐ ํ์ธ์. |
| System.Exception | ๋ชจ๋ ์์ธ ํ์์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ์์ธ๋ฅผ ์ฐธ์กฐ ํ์ธ์. |
๊ฐ์ฒด ์ ํ
objectํด๋์ค ํ์์ ๋ค๋ฅธ ๋ชจ๋ ํ์์ ๊ถ๊ทน์ ์ธ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. C #์ ๋ชจ๋ ํ์์ด ์ง์ ๋๋ ๊ฐ์ ์ ์ผ๋ก object ํด๋์ค ํ์์์ ํ์ ๋ฉ๋๋ค.
ํค์๋๋ object ๋จ์ํ ๋ฏธ๋ฆฌ ์ ์ ๋ ํด๋์ค์ ๋ ํ ๋ณ์นญ์ ๋๋ค System.Object .
๋์ ํ์
dynamic๊ณผ ๊ฐ์ ํ์์ object ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ฐ์ฐ์๊ฐ ํ์์ ์์ ์ ์ฉ ๋ ๋ฉด dynamic ํ๋ก๊ทธ๋จ์ด ์คํ ๋ ๋๊น์ง ํด๋น ํ์ธ์ด ์ง์ฐ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ์ฐ์๋ฅผ ์ฐธ์กฐ ๋ ๊ฐ์ฒด์ ํฉ๋ฒ์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ปดํ์ผํ๋ ๋์ ์ค๋ฅ๊ฐ ์ ๊ณต ๋์ง ์์ต๋๋ค. ๋์ ๋ฐํ์์ ์ฐ์ฐ์์ ํ์ธ์ด ์คํจ ํ๋ฉด ์์ธ๊ฐ throw ๋ฉ๋๋ค.
์ด๋ ๋์ ๋ฐ์ธ๋ฉ์ ํ์ฉ ํ๋ ๊ฒ์ ๋๋ค .์ด๋ ๋์ ๋ฐ์ธ๋ฉ์ ์์ธํ ์ค๋ช ๋์ด ์์ต๋๋ค.
dynamic ๋ object ๋ค์๊ณผ ๊ฐ์ ์ธก๋ฉด์์๋ฅผ ์ ์ธ ํ ๊ณ ๋์ผ ํ ๊ฒ ๊ฐ์ฃผ ๋ฉ๋๋ค.
- ํ์์ ์์ ๋ ํ ์์ dynamic ์ ๋์ ์ผ๋ก ๋ฐ์ธ๋ฉ๋ ์ ์์ต๋๋ค (๋์ ๋ฐ์ธ๋ฉ).
- dynamic object ๋ ํ๋ณด ๋ชจ๋์ ํด๋น ํ๋ ๊ฒฝ์ฐ ํ์ ์ ์ถ (ํ์ ์ ์ถ)๋ฅผ ์ฌ์ฉ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๋ฌํ ๋๋ฑ์ฑ ๋๋ฌธ์ ๋ค์์ด ํฌํจ ๋ฉ๋๋ค.
- ๋ฐ ์ฌ์ด์๋์ object dynamic ๋ฅผ ๋ฐ๊ฟ ๋ ๋์ผ ํ ๊ฒ ์์ฑ ๋ ํ์ ๊ฐ์ ์์์ id ๋ณํ์ด ์์ต๋๋ค dynamic . object
- ๋ฐ์์๋ก์ ์์์ ๋ณํ๊ณผ ๋ช ์์ ๋ณํ์ object ์๋ ์ ์ฉ dynamic ๋ฉ๋๋ค.
- ๋ก ๋ฐ๊ฟ ๋ ๋์ผ ํ ๊ฒ ์ฌ์ฉ ๋๋ ๋ฉ์๋ ์๊ทธ๋์ฒ dynamic object ๋ ๋์ผํ ์๋ช ์ผ๋ก ๊ฐ์ฃผ ๋ฉ๋๋ค.
- ๋ฐํ์์์๋ ํ์์ dynamic ๊ตฌ๋ถํ ์ ์์ต๋๋ค object .
- ํ์์ ์์ dynamic ๋์ ์ ์ด๋ผ๊ณ ํฉ๋๋ค.
๋ฌธ์์ด ์ ํ
stringํ์์์์ ์ง์ ์์ ๋๋ ๋ด์ธ ๋ ํด๋์ค ํ์์ ๋๋ค object . ํด๋์ค์ ์ธ์คํด์ค๋ string ์ ๋์ฝ๋ ๋ฌธ์์ด์ ๋ํ๋ ๋๋ค.
ํ์์ ๊ฐ์ string ๋ฌธ์์ด ๋ฆฌํฐ๋ด (๋ฌธ์์ด ๋ฆฌํฐ๋ด)๋ก ์์ฑํ ์ ์์ต๋๋ค.
ํค์๋๋ string ๋จ์ํ ๋ฏธ๋ฆฌ ์ ์ ๋ ํด๋์ค์ ๋ ํ ๋ณ์นญ์ ๋๋ค System.String .
์ธํฐํ์ด์ค ํ์
์ธํฐํ์ด์ค๋ ๊ณ์ฝ์ ์ ์ํฉ๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ ํ๋ ํด๋์ค ๋๋ ๊ตฌ์กฐ์ฒด๋ ํด๋น ๊ณ์ฝ์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ์ธํฐํ์ด์ค๋ ์ฌ๋ฌ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค์์ ์์ํ ์ ์์ผ๋ฉฐ, ํด๋์ค ๋๋ ๊ตฌ์กฐ์ฒด๋ ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค ํ์์ ์ธํฐํ์ด์ค์ ์ค๋ช ๋์ด ์์ต๋๋ค.
๋ฐฐ์ด ํ์
๋ฐฐ์ด์ ๊ณ์ฐ ๋ ์ธ๋ฑ์ค๋ฅผ ํตํด ์ก์ธ์ค ๋๋ 0 ๊ฐ ์ด์์ ๋ณ์๋ฅผ ํฌํจ ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ๋ฐฐ์ด์ ํฌํจ๋ ๋ณ์, ์ฆ ๋ฐฐ์ด์ ์์๋ผ๊ณ ๋ ํ๋ ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ์ ํ์์ด๋ฉฐ, ์ด ํ์์ ๋ฐฐ์ด์ ์์ ํ์์ด๋ผ๊ณ ํฉ๋๋ค.
๋ฐฐ์ด ํ์์ ๋ฐฐ์ด์์ค๋ช ๋์ด ์์ต๋๋ค.
๋๋ฆฌ์ ํ์
๋๋ฆฌ์๋ ํ๋ ์ด์์ ๋ฉ์๋๋ฅผ ์ฐธ์กฐ ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ์ธ์คํด์ค ๋ฉ์๋๋ ํด๋น ๊ฐ์ฒด ์ธ์คํด์ค๋ ์ฐธ์กฐ ํฉ๋๋ค.
C ๋๋ c + +์์ ๋๋ฆฌ์์ ๊ฐ์ฅ ์ ์ฌํ ๊ฒ์ ํจ์ ํฌ์ธํฐ ์ด์ง๋ง ํจ์ ํฌ์ธํฐ๋ ์ ์ ํจ์๋ง ์ฐธ์กฐํ ์ ์์ง๋ง ๋๋ฆฌ์๋ ์ ์ ๋ฉ์๋์ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ํ์์ ๊ฒฝ์ฐ ๋๋ฆฌ์๋ ๋ฉ์๋ ์ง์ ์ ์ ๋ ํ ์ฐธ์กฐ ๋ฟ๋ง ์๋๋ผ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด ์ธ์คํด์ค์ ๋ ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅ ํฉ๋๋ค.
๋๋ฆฌ์ ํ์์ ๋๋ฆฌ์์ ์ค๋ช ๋์ด ์์ต๋๋ค.
boxing ๋ฐ unboxing
Boxing ๋ฐ unboxing์ ๊ฐ๋ ์ c # ํ์ ์์คํ ์ ํต์ฌ์ ๋๋ค. Value_type ์ ๋ชจ๋ ๊ฐ์ ํ์์ผ๋ก ๋ณํํ ์ ์๋๋ก ํ์ฉ ํ ์ฌ value_type s์ reference_type ๊ฐ์ ๋ธ๋ฆฌ์ง๋ฅผ ์ ๊ณต object ํฉ๋๋ค. Boxing ๋ฐ unboxing์ ์ฌ์ฉ ํ๋ฉด ๋ชจ๋ ํ์์ ๊ฐ์ ๊ถ๊ทน์ ์ผ๋ก ๊ฐ์ฒด๋ก ์ฒ๋ฆฌํ ์ ์๋ ํ์ ์์คํ ์ ํตํฉ ๋ทฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Boxing ๋ณํ
Boxing ๋ณํ์ ์ฌ์ฉ ํ๋ฉด value_type ๋ฅผ reference_type ์ผ๋ก ์์์ ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ๋ค์ boxing ๋ณํ์ด ์์ต๋๋ค.
- ๋ชจ๋ value_type object ์์ ํ์์ผ๋ก
- ๋ชจ๋ value_type System.ValueType ์์ ํ์์ผ๋ก
- ๋ชจ๋ non_nullable_value_type ์์ value_type ์ ์ํด ๊ตฌํ ๋๋ ๋ชจ๋ interface_type .
- ๋ชจ๋ nullable_type ์์ nullable_type ์ ๊ธฐ๋ณธ ํ์์ ์ํด ๊ตฌํ ๋๋ ๋ชจ๋ interface_type .
- ๋ชจ๋ enum_type System.Enum ์์ ํ์์ผ๋ก
- ๊ธฐ๋ณธ enum_type ๋ฅผ ์ฌ์ฉ ํ๋ ๋ชจ๋ nullable_type System.Enum ์์ ํ์์ผ๋ก
- ๋ฐํ์์ ํ์ ๋งค๊ฐ ๋ณ์์์์ ์์์ ๋ณํ์ ๊ฐ ํ์์์ ์ฐธ์กฐ ํ์์ผ๋ก์ ๋ณํ (ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ํฌํจ ํ๋ ์์์ ๋ณํ)์ ์ข ๋ฃ ํ๋ ๊ฒฝ์ฐ boxing ๋ณํ์ผ๋ก ์คํ ๋ฉ๋๋ค.
Non_nullable_value_type ๊ฐ์ Boxing ํ๋ ๊ฒ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ํ ๋น ํ ๊ณ non_nullable_value_type ๊ฐ์ ํด๋น ์ธ์คํด์ค์ ๋ณต์ฌ ํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ ๋ฉ๋๋ค.
Nullable_type ์ ๊ฐ์ Boxing ํ๋ฉด null ์ฐธ์กฐ null ( HasValue ๊ฐ ์ธ ๊ฒฝ์ฐ false )๊ฐ ๋ฐํ ๋ ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ๋ํ ํด์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ ๋ ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ ๊ฐ์ด boxing ๋ฉ๋๋ค.
Non_nullable_value_type ๊ฐ์ boxing ํ๋ ์ค์ ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธ ๋ ๊ฒ ์ฒ๋ผ ๋์ ํ๋ ์ผ๋ฐ boxing ํด๋์ค ์ ์กด์ฌ๋ฅผ ๋ฐ๊ฒฌ ํ ์ฌ ์ค๋ช ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
sealed class Box<T>: System.ValueType
{
T value;
public Box(T t) {
value = t;
}
}
์ด์ ํ์์ ๊ฐ์ ๋ ํ Boxing์ v T ์์ ์คํ new Box<T>(v) ํ ๊ณ ๊ฒฐ๊ณผ ์ธ์คํด์ค๋ฅผ ํ์์ ๊ฐ์ผ๋ก ๋ฐํ ํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ ๋ฉ๋๋ค object . ๋ฐ๋ผ์ ๋ฌธ์ด
int i = 123;
object box = i;
๊ฐ๋ ์ ์ผ๋ก ๋ค์์ ํด๋น ํฉ๋๋ค.
int i = 123;
object box = new Box<int>(i);
์์ ๊ฐ์ boxing ํด๋์ค๋ Box<T> ์ค์ ๋ก ์กด์ฌ ํ์ง ์์ผ๋ฉฐ boxed ๊ฐ์ ๋์ ํ์์ ์ค์ ๋ก ํด๋์ค ํ์์ด ์๋๋๋ค. ๋์ ํ์์ boxed ๊ฐ์๋ T ๋์ ํ์์ด ์์ผ๋ฉฐ T ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ ํ๋ ๋์ ํ์ ๊ฒ์ฌ๋ is ๋จ์ํ ํ์์ ์ฐธ์กฐํ ์ ์์ต๋๋ค T . ์์ :
int i = 123;
object box = i;
if (box is int) {
Console.Write("Box contains an int");
}
๋ ์ฝ์์ "" ๋ฌธ์์ด์ ์ถ๋ ฅ ํฉ๋๋ค Box contains an int .
Boxing ๋ณํ์ ๊ฐ์ ๋ณต์ฌ๋ณธ์ boxed๋ก ๋ง๋๋ ๊ฒ์ ์๋ฏธ ํฉ๋๋ค. ์ด๋ reference_type ๋ฅผ ํ์์ผ๋ก ๋ณํ ํ๋ ๊ฒ๊ณผ ๋ค๋ฆ ๋๋ค object .์ด ๊ฐ์ ๊ณ์ ํด ์ ๋์ผํ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐ ํ ๊ณ ๊ฐ๋จํ ํ์ ๋ ํ์์ผ๋ก ๊ฐ์ฃผ ๋ฉ๋๋ค object . ์๋ฅผ ๋ค์ด ์ ์ธ์ด ์ง์ ๋ ๊ฒฝ์ฐ
struct Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
๋ค์ ๋ฌธ
Point p = new Point(10, 10);
object box = p;
p.x = 20;
Console.Write(((Point)box).x);
๋์ ํ ๋น์์ ๋ฐ์ ํ๋ ์์์ boxing ์์ ์ผ๋ก ์ธํด์ ๊ฐ์ด ๋ณต์ฌ ๋๊ธฐ ๋๋ฌธ์๋ ์ฝ์์์ ๊ฐ 10์ ์ถ๋ ฅ p box p ํฉ๋๋ค. Point๊ฐ ๋์ ๋ก ์ ์ธ ๋ class ๊ฒฝ์ฐ p ๋ฐ box ๊ฐ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐ ํ๊ธฐ ๋๋ฌธ์ 20 ๊ฐ์ด ์ถ๋ ฅ ๋ฉ๋๋ค.
Unboxing ๋ณํ
Unboxing ๋ณํ์ ์ฌ์ฉ ํ๋ฉด reference_type ๋ฅผ value_type ๋ก ๋ช ์์ ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ๋ค์ unboxing ๋ณํ์ด ์์ต๋๋ค.
- ํ์์์ object value_type ํฉ๋๋ค.
- ํ์์์ System.ValueType value_type ํฉ๋๋ค.
- ๋ชจ๋ interface_type ์์ interface_type ๋ฅผ ๊ตฌํ ํ๋ non_nullable_value_type ํฉ๋๋ค.
- ๋ชจ๋ interface_type ์์ ๋ด๋ถ ํ์์ด interface_type ๋ฅผ ๊ตฌํ ํ๋ ๋ชจ๋ nullable_type .
- ํ์์์ System.Enum enum_type ํฉ๋๋ค.
- ํ์์์ System.Enum ๋ด๋ถ enum_type ์๋ ๋ชจ๋ nullable_type ๋ก
- ํ์ ๋งค๊ฐ ๋ณ์๋ก์ ๋ช ์์ ๋ณํ์ ๋ฐํ์์ ์ฐธ์กฐ ํ์์์ ๊ฐ ํ์์ผ๋ก์ ๋ณํ (๋ช ์์ ๋์ ๋ณํ)์ ์ข ๋ฃ ํ๋ ๊ฒฝ์ฐ unboxing ๋ณํ์ผ๋ก ์คํ ๋ฉ๋๋ค.
Non_nullable_value_type ์ ๋ ํ unboxing ์์ ์ ๋จผ์ ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์ง์ ๋ non_nullable_value_type ์ boxing ๋ ๊ฐ ์ธ์ง ํ์ธ ํ ๋ค์ ์ธ์คํด์ค ์ธ๋ถ์์ ๊ฐ์ ๋ณต์ฌ ํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ ๋ฉ๋๋ค.
Nullable_type ์ ๋ ํ Unboxing์ ์์ค ํผ์ฐ์ฐ์๊ฐ ์ธ ๊ฒฝ์ฐ nullable_type ์ null ๊ฐ์ ์์ฑ ํ ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ null ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ nullable_type ์ ๋ด๋ถ ํ์์ผ๋ก unboxing ํฉ๋๋ค.
์ด์ ์น์ ์ ์ค๋ช ๋ ํ์ boxing ํด๋์ค๋ฅผ ์ฐธ์กฐ ํ๋ ๊ฒฝ์ฐ ๊ฐ์ฒด๋ฅผ value_type๋ก unboxing ๋ณํ ํ๋ ๊ฒ์ ์์ ์คํ ํ๋ ๊ฒ์ผ๋ก box T ๊ตฌ์ฑ ๋ฉ๋๋ค ((Box<T>)box).value . ๋ฐ๋ผ์ ๋ฌธ์ด
object box = 123;
int i = (int)box;
๊ฐ๋ ์ ์ผ๋ก ๋ค์์ ํด๋น ํฉ๋๋ค.
object box = new Box<int>(123);
int i = ((Box<int>)box).value;
์ง์ ๋ non_nullable_value_type ์ ๋ ํ unboxing ๋ณํ์ด ๋ฐํ์์ ์ฑ๊ณต ํ๋ ค๋ฉด ์์ค ํผ์ฐ์ฐ์์ ๊ฐ์ด non_nullable_value_type boxed ๊ฐ์ ๋ ํ ์ฐธ์กฐ ์ฌ์ผ ํฉ๋๋ค. ์์ค ํผ์ฐ์ฐ์๊ฐ ์ธ ๊ฒฝ์ฐ null System.NullReferenceException ์ด throw ๋ฉ๋๋ค. ์์ค ํผ์ฐ์ฐ์๊ฐ ํธํ ๋์ง ์๋ ๊ฐ์ฒด์ ๋ ํ ์ฐธ์กฐ ์ด๋ฉด System.InvalidCastException ์ด throw ๋ฉ๋๋ค.
์ง์ ๋ nullable_type ์ ๋ ํ unboxing ๋ณํ์ด ๋ฐํ์์ ์ฑ๊ณต ํ๋ ค๋ฉด ์์ค ํผ์ฐ์ฐ์์ ๊ฐ์ด null nullable_type ์ ๊ธฐ๋ณธ non_nullable_value_type boxed ๊ฐ์ ๋ ํ ์ฐธ์กฐ ์ฌ์ผ ํฉ๋๋ค. ์์ค ํผ์ฐ์ฐ์๊ฐ ํธํ ๋์ง ์๋ ๊ฐ์ฒด์ ๋ ํ ์ฐธ์กฐ ์ด๋ฉด System.InvalidCastException ์ด throw ๋ฉ๋๋ค.
์์ฑ ๋ ํ์
์ ๋ค๋ฆญ ํ์ ์ ์ธ์ *ํ์ ์ธ์* ๋ฅผ ์ ์ฉ ํ ์ฌ ๋ค์ ํ ํ์์ ํ์ฑ ํ๋ "์ฒญ์ฌ์ง"์ผ๋ก ์ฌ์ฉ ๋๋ *๋ฐ์ธ๋ฉ๋์ง ์์ ์ ๋ค๋ฆญ ํ์ ๋ฅผ ๋ํ๋ ๋๋ค.. ํ์ ์ธ์๋ < > ์ ๋ค๋ฆญ ํ์์ ์ด๋ฆ ๋ฐ๋ก ๋ค์ ์ค๋ ๊บพ์ ๊ดํธ (๋ฐ) ๋ด์ ๊ธฐ๋ก ๋ฉ๋๋ค. ํ๋ ์ด์์ ํ์ ์ธ์๋ฅผ ํฌํจ ํ๋ ํ์์ *์์ฑ ๋ ํ์* ์ด๋ผ๊ณ ํฉ๋๋ค. ์์ฑ ๋ ํ์์ ํ์ ์ด๋ฆ์ด ํ์ ๋ ์ ์๋ ์ธ์ด์ ๋๋ถ๋ถ์ ์์น์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ธ๋ฉ๋์ง ์์ ์ ๋ค๋ฆญ ํ์์ _typeof_expression * (typeof ์ฐ์ฐ์) ๋ด ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ฑ ๋ ํ์์ ์์์๋จ์ํ ์ด๋ฆ์ผ๋ก์ฌ์ฉ ๋๊ฑฐ๋ ๋ฉค๋ฒ (๋ฉค๋ฒ ์ก์ธ์ค)์ ์ก์ธ์คํ ๋ ์ฌ์ฉ ๋ ์๋ ์์ต๋๋ค.
Namespace_or_type_name ๋ฅผ ํ๊ฐ ํ๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ์์ ํ์ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ์ ๋ค๋ฆญ ํ์๋ง ๊ณ ๋ ค ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ์์ด ๋ค๋ฅธ ํ์์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉ ํ๋ ๊ฒฝ์ฐ ๋์ผํ ์๋ณ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์๋ก ๋ค๋ฅธ ํ์์ ์๋ณํ ์ ์์ต๋๋ค. ์ด๋ ๋์ผํ ํ๋ก๊ทธ๋จ์์ ์ ๋ค๋ฆญ ๋ฐ ๋น ์ ๋ค๋ฆญ ํด๋์ค๋ฅผ ํผํฉํ ๋ ์ ์ฉ ํฉ๋๋ค.
namespace Widgets
{
class Queue {...}
class Queue<TElement> {...}
}
namespace MyApplication
{
using Widgets;
class X
{
Queue q1; // Non-generic Widgets.Queue
Queue<int> q2; // Generic Widgets.Queue
}
}
Type_name ๋ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ์ง์ ํ์ง ์๋๋ผ๋ ์์ฑ ๋ ํ์์ ์๋ณํ ์ ์์ต๋๋ค. ์ด๋ ์ ๋ค๋ฆญ ํด๋์ค ์ ์ธ ๋ด์์ ํ์์ด ์ค์ฒฉ ๋ ๊ณ ํฌํจ ์ ์ธ์ ์ธ์คํด์ค ํ์์ด ์ด๋ฆ ์กฐํ์ ์์์ ์ผ๋ก ์ฌ์ฉ ๋๋ ๊ฒฝ์ฐ (์ ๋ค๋ฆญ ํด๋์ค์ ์ค์ฒฉ ํ์) ๋ฐ์ํ ์ ์์ต๋๋ค.
class Outer<T>
{
public class Inner {...}
public Inner i; // Type of i is Outer<T>.Inner
}
์์ ํ์ง ์์ ์ฝ๋์์๋ ์์ฑ ๋ ํ์์ unmanaged_type (ํฌ์ธํฐ ํ์)๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ ์ธ์
ํ์ ์ธ์ ๋ชฉ๋ก์ ๊ฐ ์ธ์๋ ๋จ์ํ ํ์ ์ ๋๋ค.
type_argument_list
: '<' type_arguments '>'
;
type_arguments
: type_argument (',' type_argument)*
;
type_argument
: type
;
์์ ํ์ง ์์ ์ฝ๋ (์์ ํ์ง ์์ ์ฝ๋)์์๋ type_argument ํฌ์ธํฐ ํ์์ด ๋ ์ ์์ต๋๋ค. ๊ฐ ํ์ ์ธ์๋ ํด๋น ํ์ ๋งค๊ฐ ๋ณ์ (ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ ์กฐ๊ฑด)์ ๋ ํ ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑ ํด์ผ ํฉ๋๋ค.
Open ๋ฐ closed ํ์
๋ชจ๋ ํ์์ *open types _ ๋๋ _ ํ์ํ ์ ํ *์ผ๋ก ๋ถ๋ฅ ๋ ์ ์์ต๋๋ค. ๊ฐ๋ฐฉํ ํ์์ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ํฌํจ ํ๋ ํ์์ ๋๋ค. ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์ ๋งค๊ฐ ๋ณ์๋ ๊ฐ๋ฐฉํ ํ์์ ์ ์ ํฉ๋๋ค.
- ๋ฐฐ์ด ํ์์ ์์ ํ์์ด ๊ฐ๋ฐฉํ ํ์์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฐฉํ ํ์์ ๋๋ค.
- ์์ฑ ๋ ํ์์ ํด๋น ํ์ ์ธ์ ์ค ํ๋ ์ด์์ด ๊ฐ๋ฐฉํ ํ์์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฐฉํ ํ์์ ๋๋ค. ์์ฑ ๋ ์ค์ฒฉ ํ์์ ํด๋น ํ์ ์ธ์ ์ค ํ๋ ์ด์์ด ๋ ํฌํจ ํ๋ ํ์์ ํ์ ์ธ์๊ฐ ๊ฐ๋ฐฉํ ํ์์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฐฉํ ํ์์ ๋๋ค.
ํ์ํ ํ์์ ๊ฐ๋ฐฉํ ํ์์ด ์๋ ํ์์ ๋๋ค.
๋ฐํ์์ ์ ๋ค๋ฆญ ํ์ ์ ์ธ ๋ด์ ๋ชจ๋ ์ฝ๋๋ ์ ๋ค๋ฆญ ์ ์ธ์ ํ์ ์ธ์๋ฅผ ์ ์ฉ ํ ์ฌ ๋ง๋ ํ์ํ ์์ฑ ํ์์ ์ปจํ ์คํธ์์ ์คํ ๋ฉ๋๋ค. ์ ๋ค๋ฆญ ํ์ ๋ด์ ๊ฐ ํ์ ๋งค๊ฐ ๋ณ์๋ ํน์ ๋ฐํ์ ํ์์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค. ๋ชจ๋ ๋ฌธ๊ณผ ์์ ๋ฐํ์ ์ฒ๋ฆฌ๋ ํญ์ ํ์ํ ํ์์ผ๋ก ๋ฐ์ ํ๋ฉฐ, ๊ฐ๋ฐฉํ ํ์์ ์ปดํ์ผ ์๊ฐ ์ฒ๋ฆฌ ์ค์๋ง ๋ฐ์ ํฉ๋๋ค.
ํ์ํ ์์ฑ ๋ ๊ฐ ํ์์๋ ๋ค๋ฅธ ํ์ํ ์์ฑ ํ์๊ณผ ๊ณต์ ๋์ง ์๋ ๊ณ ์ ํ ์ ์ ๋ณ์ ์งํฉ์ด ์์ต๋๋ค. ๋ฐํ์์๋ ๊ฐ๋ฐฉํ ํ์์ด ์์ผ๋ฏ๋ก ๊ฐ๋ฐฉํ ํ์๊ณผ ์ฐ๊ฒฐ ๋ ์ ์ ๋ณ์๋ ์์ต๋๋ค. ๋ ํ์ํ ์์ฑ ํ์์ ๋์ผํ ๋ฐ์ธ๋ฉ๋์ง ์์ ์ ๋ค๋ฆญ ํ์์์ ์์ฑ ๋ ๊ฒฝ์ฐ ๋์ผํ ํ์์ด ๊ณ ํด๋น ํ์ ์ธ์๋ ๋์ผํ ํ์์ ๋๋ค.
๋ฐ์ธ๋ฉ๋ ํ์ ๋ฐ ๋ฐ์ธ๋ฉ๋์ง ์์ ํ์
* ๋ฐ์ธ๋ฉ๋์ง ์์ ํ์ _ ์ด๋ ์ฉ์ด๋ ์ ๋ค๋ฆญ์ด ์๋ ํ์์ด ๋ ๋ฐ์ธ๋ฉ๋์ง ์์ ์ ๋ค๋ฆญ ํ์์ ์ฐธ์กฐ ํฉ๋๋ค. _ Bound ํ์* ์ด๋ผ๋ ์ฉ์ด๋ ์ ๋ค๋ฆญ์ด ์๋ ํ์์ด ๋ ์์ฑ ๋ ํ์์ ๋ํ๋ ๋๋ค.
๋ฐ์ธ๋ฉ๋์ง ์์ ํ์์ ํ์ ์ ์ธ์ ์ํด ์ ์ธ ๋ ์ํฐํฐ๋ฅผ ์ฐธ์กฐ ํฉ๋๋ค. ๋ฐ์ธ๋ฉ๋์ง ์์ ์ ๋ค๋ฆญ ํ์์ ์์ฒด๊ฐ ํ์์ด ์๋๋ฏ๋ก ๋ณ์, ์ธ์ ๋๋ ๋ฐํ ๊ฐ์ ํ์ ๋๋ ๊ธฐ๋ณธ ํ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ธ๋ฉ๋์ง ์์ ์ ๋ค๋ฆญ ํ์์ ์ฐธ์กฐํ ์ ์๋ ์ ์ผํ ๊ตฌ๋ฌธ์ typeof ์ (typeof ์ฐ์ฐ์)์ ๋๋ค.
๋ง์กฑ ์ ์ฝ ์กฐ๊ฑด
์์ฑ ๋ ํ์ ๋๋ ์ ๋ค๋ฆญ ๋ฉ์๋๊ฐ ์ฐธ์กฐ ๋ ๋๋ง๋ค ์ ๊ณต ๋ ํ์ ์ธ์๋ ์ ๋ค๋ฆญ ํ์ ๋๋ ๋ฉ์๋ (ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ ์กฐ๊ฑด)์ ์ ์ธ ๋ ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ ์กฐ๊ฑด์ ๋ํด ๊ฒ์ฌ ๋ฉ๋๋ค. ๊ฐ ์ ์ ๋ํด where A ๋ช ๋ช ๋ ํ์ ๋งค๊ฐ ๋ณ์์ ํด๋น ํ๋ ํ์ ์ธ์๋ ๊ฐ ์ ์ฝ ์กฐ๊ฑด์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ํ์ธ ๋ฉ๋๋ค.
- ์ ์ฝ ์กฐ๊ฑด์ด ํด๋์ค ํ์, ์ธํฐํ์ด์ค ํ์ ๋๋ ํ์ ๋งค๊ฐ ๋ณ์์ธ ๊ฒฝ์ฐ ์ ๊ณต ๋ ํ์ ์ธ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์ ์ฝ ์กฐ๊ฑด C ์ ํ์ ๋๋ ํ์ ๋งค๊ฐ ๋ณ์์ ๋ํด ๋์ฒด ๋ ์ ์ฝ ์กฐ๊ฑด์ ๋ํ๋
๋๋ค. ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑ ํ๋ ค๋ฉด ํ์์ด A ๋ค์ ์ค ํ๋๋ฅผ ํตํด ํ์์ผ๋ก ๋ณํ ๋ ์ ์์ด์ผ ํฉ๋๋ค C .
- Id ๋ณํ (id ๋ณํ)
- ์์์ ์ฐธ์กฐ ๋ณํ (์์์ ์ฐธ์กฐ ๋ณํ)
- ํ์ A๊ฐ null์ ํ์ฉ ํ์ง ์๋ ๊ฐ ํ์์ธ ๊ฒฝ์ฐ boxing ๋ณํ (boxing ๋ณํ)์ ๋๋ค.
- ํ์ ๋งค๊ฐ ๋ณ์์์๋ก์ ์์์ ์ฐธ์กฐ, boxing ๋๋ ํ์ ๋งค๊ฐ ๋ณ์ ๋ณํ A C ์ ๋๋ค.
- ์ ์ฝ ์กฐ๊ฑด์ด ์ฐธ์กฐ ํ์ ์ ์ฝ ์กฐ๊ฑด () ์ด๋ฉด class ํ์์ A ๋ค์ ์ค ํ๋๋ฅผ ์ถฉ์กฑ ํด์ผ ํฉ๋๋ค.
- A ๋ ์ธํฐํ์ด์ค ํ์, ํด๋์ค ํ์, ๋๋ฆฌ์ ํ์ ๋๋ ๋ฐฐ์ด ํ์์ ๋๋ค. ๋ฐ๋ System.ValueType System.Enum ์ด ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑ ํ๋ ์ฐธ์กฐ ํ์์ ๋๋ค.
- A ๋ ์ฐธ์กฐ ํ์ (ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ ์กฐ๊ฑด)์ผ๋ก ์๋ ค์ง ํ์ ๋งค๊ฐ ๋ณ์์ ๋๋ค.
- ์ ์ฝ ์กฐ๊ฑด์ด ๊ฐ ํ์ ์ ์ฝ ์กฐ๊ฑด () ์ด๋ฉด struct ํ์์ A ๋ค์ ์ค ํ๋๋ฅผ ์ถฉ์กฑ ํด์ผ ํฉ๋๋ค.
- A ๋ ๊ตฌ์กฐ์ฒด ํ์ ๋๋ ์ด๊ฑฐํ ํ์ ์ด์ง๋ง nullable ํ์์ด ์๋๋๋ค. ๋ฐ๋ System.ValueType System.Enum ์ด ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑ ํ์ง ์๋ ์ฐธ์กฐ ํ์์ ๋๋ค.
- A ๊ฐ ํ์ ์ ์ฝ ์กฐ๊ฑด (ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ์กฐ๊ฑด)์ ํฌํจ ํ๋ ํ์ ๋งค๊ฐ ๋ณ์์ ๋๋ค.
- ์ ์ฝ ์กฐ๊ฑด์ด ์์ฑ์ ์ ์ฝ ์กฐ๊ฑด์ด ๋ฉด ํ์์์ด ์๋์ด์ผ new() A abstract ํ๋ฉฐ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ public ์์ฑ์๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋ค์ ์กฐ๊ฑด ์ค ํ๋์ ํด๋น ํ๋ ๊ฒฝ์ฐ์ด ๋ฌธ์ ๊ฐ ์ถฉ์กฑ ๋ฉ๋๋ค.
- A ๋ชจ๋ ๊ฐ ํ์์๋ ๊ณต์ฉ ๊ธฐ๋ณธ ์์ฑ์ (๊ธฐ๋ณธ ์์ฑ์)๊ฐ ์๊ธฐ ๋๋ฌธ์์ ๊ฐ ํ์์ ๋๋ค.
- A ์์ฑ์ ์ ์ฝ ์กฐ๊ฑด (ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ ์กฐ๊ฑด)์ ํฌํจ ํ๋ ํ์ ๋งค๊ฐ ๋ณ์์ ๋๋ค.
- A ๊ฐ ํ์ ์ ์ฝ ์กฐ๊ฑด (ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ์กฐ๊ฑด)์ ํฌํจ ํ๋ ํ์ ๋งค๊ฐ ๋ณ์์ ๋๋ค.
- A ๊ฐ์ด ์๋๊ณ abstract ๋งค๊ฐ ๋ณ์ ์์ด ๋ช ์์ ์ผ๋ก ์ ์ธ ๋ ์์ฑ์๋ฅผ ํฌํจ ํ๋ ํด๋์ค์ ๋๋ค public .
- A ๊ฐ์ด ์๋๊ณ abstract ๊ธฐ๋ณธ ์์ฑ์ (๊ธฐ๋ณธ์์ฑ์)๊ฐ ์๋ ๊ฒฝ์ฐ
์ง์ ๋ ํ์ ์ธ์์์ ํ๋ ์ด์์ ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ ์กฐ๊ฑด์ด ์ถฉ์กฑ ๋์ง ์์ผ๋ฉด ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ ํฉ๋๋ค.
ํ์ ๋งค๊ฐ ๋ณ์๋ ์์ ๋์ง ์์ผ๋ฏ๋ก ์ ์ฝ ์กฐ๊ฑด์ ์์ ๋์ง ์์ต๋๋ค. ์๋ ์์ ์์๋๊ฐ D T T ๊ธฐ๋ณธ ํด๋์ค์์ ์ ์ฉ ๋๋ ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑ ํ๋๋ก ํด๋น ํ์ ๋งค๊ฐ ๋ณ์์ ๋ ํ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํด์ผ B<T> ํฉ๋๋ค. ๋ฐ๋ฉด, ํด๋์ค๋ E ์ ๋ํด๋ฅผ ๊ตฌํ ํ๋ฏ๋ก ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค List<T> IEnumerable T .
class B<T> where T: IEnumerable {...}
class D<T>: B<T> where T: IEnumerable {...}
class E<T>: B<List<T>> {...}
ํ์ ๋งค๊ฐ ๋ณ์
ํ์ ๋งค๊ฐ ๋ณ์๋ ๋ฐํ์์ ๋งค๊ฐ ๋ณ์๊ฐ ๋ฐ์ธ๋ฉ๋๋ ๊ฐ ํ์ ๋๋ ์ฐธ์กฐ ํ์์ ์ง์ ํ๋ ์๋ณ์์ ๋๋ค.
type_parameter
: identifier
;
ํ์ ๋งค๊ฐ ๋ณ์๋ ๋ค์ ํ ์ค์ ํ์ ์ธ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์ธ์คํด์คํํ ์ ์์ผ๋ฏ๋ก ํ์ ๋งค๊ฐ ๋ณ์์๋ ๋ค๋ฅธ ํ์๊ณผ๋ ์ฝ๊ฐ ๋ค๋ฅธ ์์ ๊ณผ ์ ํ์ด ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
- ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ์ฌ์ฉ ํ ์ฌ ๊ธฐ๋ณธ ํด๋์ค (๊ธฐ๋ณธ ํด๋์ค) ๋๋ ์ธํฐํ์ด์ค (Variant ํ์ ๋งค๊ฐ ๋ณ์ ๋ชฉ๋ก)๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
- ํ์ ๋งค๊ฐ ๋ณ์์ ๋ ํ ๋ฉค๋ฒ ์กฐํ ๊ท์น์ ํ์ ๋งค๊ฐ ๋ณ์์ ์ ์ฉ ๋๋ ์ ์ฝ ์กฐ๊ฑด (์๋ ๊ฒฝ์ฐ)์ ๋ฐ๋ผ ๋ฌ๋ผ ์ง๋๋ค. ๋ฉค๋ฒ ์กฐํ์ ์์ธํ ์ค๋ช ๋์ด ์์ต๋๋ค.
- ํ์ ๋งค๊ฐ ๋ณ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ณํ์ ํ์ ๋งค๊ฐ ๋ณ์์ ์ ์ฉ ๋๋ ์ ์ฝ ์กฐ๊ฑด (์๋ ๊ฒฝ์ฐ)์ ๋ฐ๋ผ ๋ฌ๋ผ ์ง๋๋ค. ํ์ ๋งค๊ฐ ๋ณ์ ๋ฐ ๋ช ์์ ๋์ ๋ณํ๊ณผ๊ด๋ จ ๋ ์์์ ๋ณํ์ ์์ธํ ์ค๋ช ๋์ด ์์ต๋๋ค.
- ํ์ ๋งค๊ฐ ๋ณ์๊ฐ null ์ฐธ์กฐ ํ์ (ํ์ ๋งค๊ฐ ๋ณ์์ ๊ด๋ จ ๋ ์์์ ๋ณํ) ์ด๋ผ๊ณ ์๋ ค์ง ๊ฒฝ์ฐ๋ฅผ ์ ์ธ ํ ๊ณ ๋ ํ์ ๋งค๊ฐ ๋ณ์์ ์ง์ ๋ ํ์์ผ๋ก ๋ฆฌํฐ๋ด์ ๋ณํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ default ์ (๊ธฐ๋ณธ๊ฐ ์)์ ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ ํ์ ๋งค๊ฐ ๋ณ์์์ ๊ฐ ํ์ ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉ ํ์ง ์๋ ํ, ํ์ ๋งค๊ฐ ๋ณ์์ ์ง์ ๋ ํ์์ ๊ฐ์ null == ๋ฐ != (์ฐธ์กฐ ํ์ ๊ฐ์ ์ฐ์ฐ์)๋ฅผ ์ฌ์ฉ ํ ์ฌ ๋น๊ตํ ์ ์์ต๋๋ค.
- newํ์ ๋งค๊ฐ ๋ณ์๊ฐ constructor_constraint ๋๋ ๊ฐ ํ์ ์ ์ฝ ์กฐ๊ฑด (ํ์ ๋งค๊ฐ ๋ณ์ ์ ์ฝ์กฐ๊ฑด)์ ์ํด ์ ํ ๋๋ ๊ฒฝ์ฐ์๋ง ์ (๊ฐ์ฒด ์์ฑ ์)์ ํ์ ๋งค๊ฐ ๋ณ์์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํน์ฑ ๋ด์์ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฉค๋ฒ ์ก์ธ์ค (๋ฉค๋ฒ ์ก์ธ์ค) ๋๋ ํ์ ์ด๋ฆ (๋ค์ ์คํ์ด์ค ๋ฐ ํ์ ์ด๋ฆ)์์ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์ ์ ๋ฉค๋ฒ๋ ์ค์ฒฉ ํ์์ ์๋ณํ ์ ์์ต๋๋ค.
- ์์ ํ์ง ์์ ์ฝ๋์์ ํ์ ๋งค๊ฐ ๋ณ์๋ unmanaged_type (ํฌ์ธํฐ ํ์)๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์์ผ๋ก ํ์ ๋งค๊ฐ ๋ณ์๋ ์์ ์ปดํ์ผ ์๊ฐ ๊ตฌ๋ฌธ์ ๋๋ค. ๋ฐํ์์ ๊ฐ ํ์ ๋งค๊ฐ ๋ณ์๋ ์ ๋ค๋ฆญ ํ์ ์ ์ธ์ ํ์ ์ธ์๋ฅผ ์ ๊ณต ํ ์ฌ ์ง์ ๋ ๋ฐํ์ ํ์์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉ ํ ์ฌ ์ ์ธ ๋ ๋ณ์์ ํ์์ ๋ฐํ์์ ํ์ํ ์์ฑ ํ์ (๊ฐ๋ฐฉํ ๋ฐ ํ์ํ ํ์)์ด ๋ฉ๋๋ค. ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ํฌํจ ํ๋ ๋ชจ๋ ๋ฌธ๊ณผ ์์ ๋ฐํ์ ์คํ์์๋ ํด๋น ๋งค๊ฐ ๋ณ์์ ๋ ํ ํ์ ์ธ์๋ก ์ ๊ณต ๋ ์ค์ ํ์์ ์ฌ์ฉ ํฉ๋๋ค.
์ ํธ๋ฆฌ ํ์
*์ ํธ๋ฆฌ _๋ ๋๋ค ์์ ์คํ ์ฝ๋ ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ํํํ ์ ์๋๋ก ํ์ฉ ํฉ๋๋ค. ์ ํธ๋ฆฌ๋ ํ์์ _ ์ ํธ๋ฆฌ ํ์* ๊ฐ์ ๋๋ค System.Linq.Expressions.Expression<D> D . ์ฌ๊ธฐ์๋ ๋๋ฆฌ์ ํ์์ ๋๋ค. ์ด ์ฌ์์ ๋๋จธ์ง ๋ถ๋ถ์์๋ ์ฝ์ด๋ฅผ ์ฌ์ฉ ํ ์ฌ ์ด๋ฌํ ํ์์ ์ฐธ์กฐ ํฉ๋๋ค Expression<D> .
๋๋ค ์์์ ๋๋ฆฌ์ ํ์์ผ๋ก์ ๋ณํ์ด ์๋ ๊ฒฝ์ฐ D ์ ํธ๋ฆฌ ํ์์ ๋ ํ ๋ณํ๋ ์์ต๋๋ค Expression<D> . ๋๋ค ์์ ๋๋ฆฌ์ ํ์์ผ๋ก ๋ณํ ํ๋ ๊ฒฝ์ฐ ๋๋ค ์์ ์คํ ์ฝ๋๋ฅผ ์ฐธ์กฐ ํ๋ ๋๋ฆฌ์๋ฅผ ์์ฑ ํฉ๋๋ค. ์ ํธ๋ฆฌ ํ์์ผ๋ก ๋ณํ ํ๋ฉด ๋๋ค ์์ ์ ํธ๋ฆฌ ํํ์ด ์์ฑ ๋ฉ๋๋ค.
์ ํธ๋ฆฌ๋ ๋๋ค ์์ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ ํํ ์ด๋ฉฐ ๋๋ค ์์ ๊ตฌ์กฐ๋ฅผ ํฌ๋ช ํ ๊ณ ๋ช ์์ ์ผ๋ก ๋ง๋ญ๋๋ค.
๋๋ฆฌ์ ํ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก์๋ D ์ Expression<D> ๋์ผํ ๋งค๊ฐ ๋ณ์ ๋ฐ ๋ฐํ ํ์์ด ์๋ค๊ณ D ํฉ๋๋ค.
๋ค์ ์์ ์์๋ ๋๋ค ์์ ์คํ ์ฝ๋์ ์ ํธ๋ฆฌ๋ก ๋ํ๋ ๋๋ค. ์ ๋ ํ ๋ณํ์ด ์กด์ฌ ํ๊ธฐ ๋๋ฌธ์ Func<int,int> ๋ค์๊ณผ ๊ฐ์ ๋ณํ๋ ์์ต๋๋ค Expression<Func<int,int>> .
Func<int,int> del = x => x + 1; // Code
Expression<Func<int,int>> exp = x => x + 1; // Data
์ด๋ฌํ ํ ๋น์ ์ํ ํ๋ฉด ๋๋ฆฌ์๋ del ์ ๋ฐํ ํ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐ x + 1 ํ ๊ณ ์ ํธ๋ฆฌ๋ exp ์์ ์ค๋ช ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฐธ์กฐ ํฉ๋๋ค x => x + 1 .
Expression<D>๋๋ค ์์ด ์ ํธ๋ฆฌ ํ์์ผ๋ก ๋ณํ ๋ ๋ ์ ํธ๋ฆฌ๋ฅผ ์์ฑ ํ๋ ์ ํํ ๊ท์น ๋ฟ๋ง ์๋๋ผ ์ ๋ค๋ฆญ ํ์์ ์ ํํ ์ ์๋ ๋ชจ๋์ด ์ฌ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค.
๋ช ์์ ์ผ๋ก ์ํ ํ๋ ๋ ๊ฐ์ง ์ค์ ํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ชจ๋ ๋๋ค ์์ ์ ํธ๋ฆฌ๋ก ๋ณํํ ์ ์๋ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ ๋ณธ๋ฌธ์ด ์๋ ๋๋ค ์๊ณผ ๋์ ์์ ํฌํจ ํ๋ ๋๋ค ์์ ํํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๋ณํ์ ์ฌ์ ํ ์กด์ฌ ํ์ง๋ง ์ปดํ์ผ ์๊ฐ์๋ ์คํจ ํฉ๋๋ค. ์ด๋ฌํ ์์ธ๋ ์ต๋ช ํจ์ ๋ณํ์ ์์ธํ ์ค๋ช ๋์ด ์์ต๋๋ค.
- Expression<D>``Compileํ์์ ๋๋ฆฌ์๋ฅผ ์์ฑ ํ๋ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ ๊ณต ํฉ๋๋ค D .
์ด ๋๋ฆฌ์๋ฅผ ํธ์ถ ํ๋ฉด ์ ํธ๋ฆฌ๋ก ํ์ ๋๋ ์ฝ๋๊ฐ ์คํ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์์ ์ ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ del๊ณผ del2๋ ๋์ผ ํ ๊ณ ๋ค์ ๋ ๋ฌธ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ํฌ ์ ์์ต๋๋ค.Func<int,int> del2 = exp.Compile();
์ด ์ฝ๋๋ฅผ ์คํ ํ ํ ๋ฐ์๋ i1 i2 ๋ชจ๋ ๊ฐ์ด 2 ์์ต๋๋ค.int i1 = del(1); int i2 = del2(1); - C#๋ณต์ฌ
- C#๋ณต์ฌ