C#/C#

[C#] ์ •์ˆ˜ ์ˆซ์ž ํ˜•์‹

Rainbow๐ŸŒˆCoder 2022. 6. 11. 11:05
728x90

https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/integral-numeric-types

 

์ •์ˆ˜ ์ˆซ์ž ํ˜•์‹ - C# ์ฐธ์กฐ

๊ฐ ์ •์ˆ˜ ์ˆซ์ž ํ˜•์‹์— ๋Œ€ํ•œ ๋ฒ”์œ„, ์Šคํ† ๋ฆฌ์ง€ ํฌ๊ธฐ ๋ฐ ์šฉ๋„์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

docs.microsoft.com

https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/language-specification/types#836-integral-types

 

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๋ฐ”์ดํŠธ

C# ํ˜•์‹/ํ‚ค์›Œ๋“œ๋ฒ”์œ„ํฌ๊ธฐ.NET ํ˜•์‹
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 ํ˜•์‹ ์ด๋ฆ„์€ ์„œ๋กœ ๋ฐ”๊ฟ” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์„ ์–ธ์€ ๋™์ผํ•œ ํ˜•์‹์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
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 ๋ฐ ์ดํ›„ ๋ฒ„์ „์—์„œ ๊ฐ€๋Šฅ)

๋‹ค์Œ ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ ์˜ˆ์ œ๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
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์œผ๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
byte a = 17;
byte b = 300;   // CS0031: Constant value '300' cannot be converted to a 'byte'

์•ž์˜ ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์ด ๋Œ€์ƒ ํ˜•์‹์˜ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜ CS0031์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์บ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฐ’์„ ๊ฒฐ์ •๋œ ๋ฆฌํ„ฐ๋Ÿด ํ˜•์‹ ์ด์™ธ์˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
var signedByte = (sbyte)42;
var longVariable = (long)42;

๋ณ€ํ™˜

๋ชจ๋“  ์ •์ˆ˜ ์ˆซ์ž ํ˜•์‹์„ ๋‹ค๋ฅธ ์ •์ˆ˜ ์ˆซ์ž ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ํ˜•์‹์ด ์†Œ์Šค ํ˜•์‹์˜ ๋ชจ๋“  ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ณ€ํ™˜์€ ์•”์‹œ์ ์ž…๋‹ˆ๋‹ค. ์ €์žฅํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์บ์ŠคํŠธ ์‹๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์  ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ๋ณธ ์ œ๊ณต ์ˆซ์ž ๋ณ€ํ™˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

 

C # ์–ธ์–ด์˜ ํ˜•์‹์€ value types _ ๋ฐ _์ฐธ์กฐ ํ˜•์‹*_ ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฒ”์ฃผ๋กœ ๊ตฌ๋ถ„ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’ ํ˜•์‹๊ณผ ์ฐธ์กฐ ํ˜•์‹์€ ๋ชจ๋‘ ํ•˜๋‚˜ ์ด์ƒ์˜ _ ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š” _์ œ๋„ค๋ฆญ ํ˜•์‹์ผ* ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ๊ฐ’ ํ˜•์‹๊ณผ ์ฐธ์กฐ ํ˜•์‹์„ ๋ชจ๋‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

antlr๋ณต์‚ฌ
type
    : value_type
    | reference_type
    | type_parameter
    | type_unsafe
    ;

ํ˜•์‹, ํฌ์ธํ„ฐ์˜ ์ตœ์ข… ๋ฒ”์ฃผ๋Š” ์•ˆ์ „ ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ํฌ์ธํ„ฐ ํ˜•์‹์— ์ž์„ธํžˆ ์„ค๋ช… ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ’ ํ˜•์‹์€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ํฌํ•จ ํ•˜๋Š” ๋ฐ˜๋ฉด, ์ฐธ์กฐ ํ˜•์‹์˜ ๋ณ€์ˆ˜๋Š” ๋ฐ์ดํ„ฐ์— *์ฐธ์กฐ _๋ฅผ ์ €์žฅ ํ•˜ ๊ณ , ํ›„์ž๋Š” _ *๊ฐœ์ฒด* *๋กœ ์•Œ๋ ค์ง„์˜ ์ฐธ์กฐ ํ˜•์‹๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฐธ์กฐ ํ˜•์‹์„ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ๊ฐœ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•œ ๋ณ€์ˆ˜์— ๋Œ€ ํ•œ ์ž‘์—…์ด ๋‹ค๋ฅธ ๋ณ€์ˆ˜์—์„œ ์ฐธ์กฐ ํ•˜๋Š” ๊ฐœ์ฒด์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’ ํ˜•์‹์„ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€์ˆ˜์—๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ ์‚ฌ๋ณธ์ด ์žˆ์œผ๋ฉฐ ํ•œ ๋ณ€์ˆ˜์— ๋Œ€ ํ•œ ์ž‘์—…์ด ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

C #์˜ ํ˜•์‹ ์‹œ์Šคํ…œ์€ ๋ชจ๋“  ํ˜•์‹์˜ ๊ฐ’์„ ๊ฐœ์ฒด๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ†ตํ•ฉ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. C#์˜ ๋ชจ๋“  ํ˜•์‹์€ object ํด๋ž˜์Šค ํ˜•์‹์—์„œ ์ง์ ‘ ๋˜๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ ํŒŒ์ƒ๋˜๊ณ  object๋Š” ๋ชจ๋“  ํ˜•์‹์˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ ํ˜•์‹์˜ ๊ฐ’์€ object๋กœ ์ธ์‹ํ•จ์œผ๋กœ์จ ๊ฐ„๋‹จํžˆ ๊ฐœ์ฒด๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’ ํ˜•์‹์˜ ๊ฐ’์€ boxing ๋ฐ unboxing ์ž‘์—… (boxing ๋ฐ unboxing)์„ ์ˆ˜ํ–‰ ํ•˜ ์—ฌ ๊ฐœ์ฒด๋กœ ์ฒ˜๋ฆฌ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ’ ํ˜•์‹

๊ฐ’ ํ˜•์‹์€ ๊ตฌ์กฐ์ฒด ํ˜•์‹ ๋˜๋Š” ์—ด๊ฑฐํ˜• ํ˜•์‹์ž…๋‹ˆ๋‹ค. C #์—์„œ๋Š” ๋‹จ์ˆœ ํ˜•์‹ ์ด๋ผ๋Š” ๋ฏธ๋ฆฌ ์ •์˜ ๋œ ๊ตฌ์กฐ์ฒด ํ˜•์‹์˜ ์ง‘ํ•ฉ์„ ์ œ๊ณต ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœ ํ˜•์‹์€ ์˜ˆ์•ฝ์–ด๋ฅผ ํ†ตํ•ด ์‹๋ณ„ ๋ฉ๋‹ˆ๋‹ค.

antlr๋ณต์‚ฌ
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์œผ๋กœ ์ดˆ๊ธฐํ™” ๋ฉ๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
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 ์™€ ๋‹ค์Œ ๋ฌธ์ด ํ—ˆ์šฉ ๋ฉ๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
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 ๊ฒฝ์šฐ ํผ์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
new T?(x)

์†์„ฑ์ด ์ธ์˜ null์ด ์•„๋‹Œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค T? Value x . ์ง€์ • ๋œ ๊ฐ’์— ๋Œ€ํ•ด null์„ ํ—ˆ์šฉ ํ•˜์ง€ ์•Š๋Š” ํ˜•์‹์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ž˜ํ•‘ ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์•”์‹œ์  ๋ณ€ํ™˜์€ null ๋ฆฌํ„ฐ๋Ÿด์—์„œ T? (Null ๋ฆฌํ„ฐ๋Ÿด ๋ณ€ํ™˜) ๋ฐ์—์„œ T T? (์•”์‹œ์  nullable ๋ณ€ํ™˜)๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ ํ˜•์‹

์ฐธ์กฐ ํ˜•์‹์€ ํด๋ž˜์Šค ํ˜•์‹, ์ธํ„ฐํŽ˜์ด์Šค ํ˜•์‹, ๋ฐฐ์—ด ํ˜•์‹ ๋˜๋Š” ๋Œ€๋ฆฌ์ž ํ˜•์‹์ž…๋‹ˆ๋‹ค.

antlr๋ณต์‚ฌ
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 ํด๋ž˜์Šค ์˜ ์กด์žฌ๋ฅผ ๋ฐœ๊ฒฌ ํ•˜ ์—ฌ ์„ค๋ช… ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
sealed class Box<T>: System.ValueType
{
    T value;

    public Box(T t) {
        value = t;
    }
}

์ด์ œ ํ˜•์‹์˜ ๊ฐ’์— ๋Œ€ ํ•œ Boxing์€ v T ์‹์„ ์‹คํ–‰ new Box<T>(v) ํ•˜ ๊ณ  ๊ฒฐ๊ณผ ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜•์‹์˜ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ์„ฑ ๋ฉ๋‹ˆ๋‹ค object . ๋”ฐ๋ผ์„œ ๋ฌธ์ด

C#๋ณต์‚ฌ
int i = 123;
object box = i;

๊ฐœ๋…์ ์œผ๋กœ ๋‹ค์Œ์— ํ•ด๋‹น ํ•ฉ๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
int i = 123;
object box = new Box<int>(i);

์œ„์™€ ๊ฐ™์€ boxing ํด๋ž˜์Šค๋Š” Box<T> ์‹ค์ œ๋กœ ์กด์žฌ ํ•˜์ง€ ์•Š์œผ๋ฉฐ boxed ๊ฐ’์˜ ๋™์  ํ˜•์‹์€ ์‹ค์ œ๋กœ ํด๋ž˜์Šค ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€์‹  ํ˜•์‹์˜ boxed ๊ฐ’์—๋Š” T ๋™์  ํ˜•์‹์ด ์žˆ์œผ๋ฉฐ T ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š” ๋™์  ํ˜•์‹ ๊ฒ€์‚ฌ๋Š” is ๋‹จ์ˆœํžˆ ํ˜•์‹์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค T . ์˜ˆ์ œ:

C#๋ณต์‚ฌ
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 . ์˜ˆ๋ฅผ ๋“ค์–ด ์„ ์–ธ์ด ์ง€์ • ๋œ ๊ฒฝ์šฐ

C#๋ณต์‚ฌ
struct Point
{
    public int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

๋‹ค์Œ ๋ฌธ

C#๋ณต์‚ฌ
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 . ๋”ฐ๋ผ์„œ ๋ฌธ์ด

C#๋ณต์‚ฌ
object box = 123;
int i = (int)box;

๊ฐœ๋…์ ์œผ๋กœ ๋‹ค์Œ์— ํ•ด๋‹น ํ•ฉ๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
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 ๋ฅผ ํ‰๊ฐ€ ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์˜ ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ œ๋„ค๋ฆญ ํ˜•์‹๋งŒ ๊ณ ๋ ค ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜•์‹์ด ๋‹ค๋ฅธ ํ˜•์‹์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉ ํ•˜ ์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ํ˜•์‹์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ œ๋„ค๋ฆญ ๋ฐ ๋น„ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค๋ฅผ ํ˜ผํ•ฉํ•  ๋•Œ ์œ ์šฉ ํ•ฉ๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
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 ๋Š” ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์ง€์ • ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ƒ์„ฑ ๋œ ํ˜•์‹์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ์„ ์–ธ ๋‚ด์—์„œ ํ˜•์‹์ด ์ค‘์ฒฉ ๋˜ ๊ณ  ํฌํ•จ ์„ ์–ธ์˜ ์ธ์Šคํ„ด์Šค ํ˜•์‹์ด ์ด๋ฆ„ ์กฐํšŒ์— ์•”์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ ๋˜๋Š” ๊ฒฝ์šฐ (์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์˜ ์ค‘์ฒฉ ํ˜•์‹) ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
class Outer<T>
{
    public class Inner {...}

    public Inner i;                // Type of i is Outer<T>.Inner
}

์•ˆ์ „ ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ๋Š” ์ƒ์„ฑ ๋œ ํ˜•์‹์„ unmanaged_type (ํฌ์ธํ„ฐ ํ˜•์‹)๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜•์‹ ์ธ์ˆ˜

ํ˜•์‹ ์ธ์ˆ˜ ๋ชฉ๋ก์˜ ๊ฐ ์ธ์ˆ˜๋Š” ๋‹จ์ˆœํ•œ ํ˜•์‹ ์ž…๋‹ˆ๋‹ค.

antlr๋ณต์‚ฌ
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 .

C#๋ณต์‚ฌ
class B<T> where T: IEnumerable {...}

class D<T>: B<T> where T: IEnumerable {...}

class E<T>: B<List<T>> {...}

ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜

ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ๋Ÿฐํƒ€์ž„์— ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜๋Š” ๊ฐ’ ํ˜•์‹ ๋˜๋Š” ์ฐธ์กฐ ํ˜•์‹์„ ์ง€์ • ํ•˜๋Š” ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.

antlr๋ณต์‚ฌ
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>> .

C#๋ณต์‚ฌ
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 .
    Func<int,int> del2 = exp.Compile();
    
    ์ด ๋Œ€๋ฆฌ์ž๋ฅผ ํ˜ธ์ถœ ํ•˜๋ฉด ์‹ ํŠธ๋ฆฌ๋กœ ํ‘œ์‹œ ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ del๊ณผ del2๋Š” ๋™์ผ ํ•˜ ๊ณ  ๋‹ค์Œ ๋‘ ๋ฌธ์€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    int i1 = del(1);
    
    int i2 = del2(1);
    
    ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํ•œ ํ›„ ๋ฐ์—๋Š” i1 i2 ๋ชจ๋‘ ๊ฐ’์ด 2 ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#๋ณต์‚ฌ
  • C#๋ณต์‚ฌ
728x90