C#

[C#] 암묡적 νƒ€μž… μΆ”λ‘ κ³Ό 동적 νƒ€μž… - var와 dynamic ν™œμš©

hyonie 2024. 5. 15. 17:22

C#μ—μ„œλŠ” varνŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ—¬ objectν˜•νƒœλ‘œ 받은 값을 varν˜•νƒœλ‘œ λ‹€μ‹œ 좜λ ₯ν• μˆ˜ μžˆλ‹€.

이 νŒ¨ν„΄μ€ νŒ¨ν„΄ λ§€μΉ­ κΈ°λŠ₯을 μ΄ν•΄ν•˜λŠ” 데 도움이 되며, λ³€μˆ˜λ₯Ό νŠΉμ • μœ ν˜•μœΌλ‘œ λ°”μΈλ”©ν•˜κ³  μ‚¬μš©ν• λ•Œ μœ μš©ν•˜λ‹€. 일반적으둜 잘 μ‚¬μš©λ˜μ§€λŠ” μ•Šμ§€λ§Œ, μ½”λ“œλ₯Ό 더 읽기 쉽고 κ°„κ²°ν•˜κ²Œ λ§Œλ“œλŠ”λ° λ„μ›€μ΄λœλ‹€. 이제 var νŒ¨ν„΄μ— λŒ€ν•΄ μ’€ 더 μžμ„Ένžˆ μ•Œμ•„λ³΄μž.

 

 

 

 


암묡적 νƒ€μž… 좔둠을 ν™œμš©ν•œ C#의 var νŒ¨ν„΄ μ΄ν•΄ν•˜κΈ°

μ•„λž˜ μ½”λ“œλŠ” κ°€μž₯ λ¨Όμ €, varνŒ¨ν„΄μ„ λ³€μˆ˜λ₯Ό μž„μ˜μ˜ νƒ€μž…μΈ var λ³€μˆ˜λ‘œ 받은 ν›„ 쑰건을 μ κ²€ν•œλ‹€. μ΄λ•Œ, 쑰건을 μ κ²€ν•˜μ§€ μ•Šλ”λΌλ„ 일단 λ³€μˆ˜λ‘œ 값을 λ°›μ•„μ•Όν•œλ‹€.

object obj = "korea";

if(obj is var str){
	  Console.WriteLine(str);
}

 

예λ₯Ό λ“€μ–΄, `object obj = "korea";` 와 같이 객체λ₯Ό objectνƒ€μž…μœΌλ‘œ 받은 ν›„, varνŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ—¬ 값을  varν˜•μ‹μ˜ λ³€μˆ˜μ— λ‹΄μ•„λ‚Έλ‹€. 그리고 `if (obj is var str)`와 같이 isμ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 쑰건을 μ κ²€ν•œλ‹€. μ΄λ•Œ objλŠ” 항상 varν˜•μ‹κ³Ό μΌμΉ˜ν•˜λ―€λ‘œ 쑰건은 항상 참이 λœλ‹€. λ”°λΌμ„œ objλ₯Ό str에 λŒ€μž…ν•˜λŠ” 것과 같은 νš¨κ³Όκ°€ μžˆλ‹€.


암묡적 νƒ€μž… μΆ”λ‘ μ˜ κ°œλ…κ³Ό λ™μž‘ 원리

암묡적 νƒ€μž…μ΄λž€ νƒ€μž…μ„ λͺ…μ‹œν•˜μ§€ μ•Šκ³ , varν‚€μ›Œλ“œλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. μ΄λ•Œ μ»΄νŒŒμΌλŸ¬λŠ” μž…λ ₯된 값을 λΆ„μ„ν•˜μ—¬ λ³€μˆ˜μ˜ νƒ€μž…μ„ λ‚΄λΆ€μ μœΌλ‘œ μΆ”λ‘ ν•œλ‹€. 예λ₯Ό λ“€μ–΄, λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜μ—ˆλ‹€λ©΄ μ»΄νŒŒμΌλŸ¬λŠ” ν•΄λ‹Ή λ³€μˆ˜λ₯Ό λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ μΈμ§€ν•œλ‹€. 이것은 JavaScriptμ—μ„œλ„ λΉ„μŠ·ν•œ μ›λ‘œ λ™μž‘ν•œλ‹€. 즉, 암묡적 νƒ€μž…μ€ κ°œλ°œμžκ°€ λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ•„λ„ μ»΄νŒŒμΌλŸ¬κ°€ λ³€μˆ˜μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” 방식을 λ§ν•œλ‹€.

 

μ˜ˆμ‹œ μ½”λ“œ

// λ³€μˆ˜ xλŠ” μ •μˆ˜κ°’ 10을 κ°€μ§€κ³ , μ»΄νŒŒμΌλŸ¬λŠ” μ•”λ¬΅μ μœΌλ‘œ int νƒ€μž…μœΌλ‘œ μ •μ˜
var x = 10;

// λ³€μˆ˜ yλŠ” μ •μˆ˜κ°’ 5λ₯Ό κ°€μ§€κ³ , μ»΄νŒŒμΌλŸ¬λŠ” μ•”λ¬΅μ μœΌλ‘œ int νƒ€μž…μœΌλ‘œ μ •μ˜ 
var y = 5;

// λ³€μˆ˜ str은 λ¬Έμžμ—΄ "λ¬Έμžμ—΄"을 κ°€μ§€κ³ , μ»΄νŒŒμΌλŸ¬λŠ” μ•”λ¬΅μ μœΌλ‘œ string νƒ€μž…μœΌλ‘œ μ •μ˜
var str = "λ¬Έμžμ—΄";

// Console.SetCursorPosition λ©”μ„œλ“œμ— x, y 값을 μž…λ ₯ν•˜μ—¬ μ»€μ„œ μœ„μΉ˜λ₯Ό μ„€μ •ν•˜κ³ , "λ¬Έμžμ—΄"을 좜λ ₯ν•œλ‹€.
Console.SetCursorPosition(x, y);
Console.WriteLine(str);

μœ„ μ½”λ“œμ—μ„œ `var`λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ, μ»΄νŒŒμΌλŸ¬λŠ” λ³€μˆ˜μ— ν• λ‹Ήλœ 값을 보고 νƒ€μž…μ„ μΆ”λ‘ ν•œλ‹€. 예λ₯Ό λ“€μ–΄, `var x =10;`μ—μ„œ λ³€μˆ˜ `x`μ—λŠ” μ •μˆ˜κ°’μ΄ ν• λ‹Ήλ˜λ―€λ‘œ μ»΄νŒŒμΌλŸ¬λŠ” μ•”λ¬΅μ μœΌλ‘œ `x`λ₯Ό intνƒ€μž…μœΌλ‘œ μΆ”λ‘ ν•œλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ `var str =" λ¬Έμžμ—΄";`μ—μ„œλŠ” λ³€μˆ˜ `srt`에 λ¬Έμžμ—΄μ΄ ν• λ‹Ήλ˜λ―€λ‘œ μ»΄νŒŒμΌλŸ¬λŠ” `str`을 stringνƒ€μž…μœΌλ‘œ μΆ”λ‘ ν•œλ‹€. μ΄λ ‡κ²Œ μΆ”λ‘ λœ νƒ€μž…μ€ μ»΄νŒŒμΌλŸ¬κ°€ μ •μ μœΌλ‘œ κ²€μ‚¬ν•˜μ—¬ μ‹€ν–‰ 쀑에 였λ₯˜λ₯Ό λ°©μ§€ν•œλ‹€.

 


 

μ™œ 암묡적 νƒ€μž…μ„ μ‚¬μš©ν• κΉŒ?

var νƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ”λ° νŽΈλ¦¬ν•¨μ„ λŠλ‚„μˆ˜ μžˆμ§€λ§Œ, λ™μ‹œμ— μ½”λ“œμ˜ 가독성이 κ°μ†Œν•  수 μžˆλ‹€.

κ·ΈλŸΌμ— λΆˆκ΅¬ν•˜κ³  암묡적 νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?

 

그건 λŸ°νƒ€μž„ μ‹œμ— μ–΄λ–€ 값이 λ“€μ–΄μ˜¬μ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ„ λ•Œμ΄λ‹€. 예λ₯Ό λ“€μ–΄, λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ” κ°’μ˜ νƒ€μž….

이 μ½”λ“œ μž‘μ„± μ‹œμ μ— μ•Œμˆ˜ μ—†κ±°λ‚˜, λ‹€μ–‘ν•œ μœ ν˜•μ˜ 값이 λ³€μˆ˜μ— ν• λ‹Ήλ μˆ˜ μžˆλŠ” μƒν™”μ—μ„œ var νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 것이 μœ μš©ν•˜λ‹€.

 

예λ₯Ό λ“€μ–΄, μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λŠ” List 객체λ₯Ό μƒκ°ν•΄λ³΄μž. ListλŠ” λ‹€μ–‘ν•œ μœ ν˜•μ˜ 객체λ₯Ό ν¬ν•¨ν• μˆ˜ μžˆλ‹€.

μ΄λ•Œ List에 ν• λ‹Ήλ˜λŠ” 객체의 νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜λŠ” 것은 번거둭고 λ³΅μž‘ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ var νƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ List에 μ–΄λ–€ μœ ν˜•μ˜ 객체가 λ“€μ–΄μ˜¬μ§€ λͺ¨λ₯Ό λ•Œμ—λ„ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μœ μ§€ν•  수 μžˆλ‹€.

 

λ§Œμ•½ 클래슀λ₯Ό 생성 ν• λ–„ 곡간을 10개λ₯Ό 미리 ν• λ‹Ήν•΄ 놓은 경우, 보톡은 ν•΄λ‹Ή 클래슀의 이름을 λͺ…μ‹œν•˜κ³ , κ·Έ 뒀에 ν• λ‹Ήν•  κ³΅κ°„μ˜ 개수λ₯Ό μ§€μ •ν•œλ‹€. κ·ΈλŸ¬λ‚˜ var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš”ν•˜λ©΄ μ½”λ“œλ₯Ό κ°„μ†Œν™”ν• μˆ˜ μžˆλ‹€.

// λͺ…μ‹œμ μΈ 방법
List<MyNameSpace.MyDefinedClass> list = new List<MyNameSpace.MyDefinedClass>(10);

// κ°„μ†Œν™”λœ 방법(var μ‚¬μš©)
var list = new List<MyNameSpace.MyDefinedClass>(10);

μ΄λ ‡κ²Œ ν•˜λ©΄ μ½”λ“œκ°€ 더 깔끔해지고 가독성이 ν–₯μƒλœλ‹€. JavaScriptμ—μ„œλ„ 이와 λΉ„μŠ·ν•œ 방식을 μ‚¬μš©ν•œλ‹€. μ΄λŸ¬ν•œ ν˜•νƒœλŠ” λ˜‘κ°™μ€ νƒ€μž…μ˜ 선언을 μ–‘μͺ½μ— μž‘μ„±ν•  ν•„μš”κ°€ μ—†μ–΄μ„œ μ½”λ“œλ₯Ό κΉ”λ”ν•˜κ²Œ λ§Œλ“€μ–΄ μ€€λ‹€.

 

특히, νƒ€μž…μ΄ ν™•μ‹€ν•˜μ§€μ•Šμ„ λ•Œ(λ°˜ν™˜ νƒ€μž…μ„ μ•Œμˆ˜ μ—†λŠ” 경우) var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ„ μΆ”λ‘ ν•˜μ—¬ μ²˜λ¦¬ν•΄μ£ΌκΈ° λ•Œλ¬Έμ— μœ μš©ν•˜λ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ μ½”λ“œ μž‘μ„±μ„  더 νŽΈλ¦¬ν•˜κ²Œ λ§Œλ“€μ–΄μ€€λ‹€.

 

λ”°λΌμ„œ, 암묡적 νƒ€μž…μ„ μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μœ μ§€ν•˜λ©΄μ„œ λŸ°νƒ€μž„ μ‹œμ— λ°œμƒν•  수 μžˆλŠ” λ‹€μ–‘ν•œ 상황에 λŒ€λΉ„ν• μˆ˜ μžˆλ‹€.

 


 

foreach 루프λ₯Ό ν†΅ν•œ νƒ€μž… μΆ”λ‘ μ˜ νŽΈλ¦¬ν•¨

반볡자λ₯Ό μ΄μš©ν•˜μ—¬ foreach 루프λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ°˜λ³΅μžκ°€ λ‚΄μž₯λ˜μ–΄ μžˆλ‹€.예λ₯Ό λ“€μ–΄, int ν˜•μ‹μ˜ 배열을 μ„ μ–Έν•˜κ³  ν•΄λ‹Ή 배열을 foreach λ£¨ν”„λ‘œ λ°˜λ³΅ν•˜λ©΄ λ°°μ—΄μ˜ μš”μ†Œλ“€μ„ μˆœμ„œλŒ€λ‘œ μ½μ–΄μ˜¬ 수 μžˆλ‹€.

int[] ar = { 1, 2, 3, 4, 5, 6 }; // int ν˜•μ‹μ˜ λ°°μ—΄

foreach(var n in ar)
{
    Console.WriteLine(n);
}

foreach 루프λ₯Ό μ΄μš©ν•˜λ©΄ λ°°μ—΄μ˜ μš”μ†Œλ“€μ„ μˆœνšŒν•  수 μžˆλ‹€. μ‹€μ œλ‘œ λ°°μ—΄μ˜ μš”μ†Œλ“€μ„ μ½μ–΄μ˜€λŠ” κ³Όμ •μ—μ„œλŠ” μ•Œ 수 μ—†λŠ” 객체일지라도 μ»΄νŒŒμΌλŸ¬κ°€ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ„ μΆ”λ‘ ν•˜μ—¬ μ²˜λ¦¬ν•œλ‹€. λ”°λΌμ„œ int둜 λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ λ‚΄λΆ€μ μœΌλ‘œ μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ μΆ”λ‘ ν•œλ‹€. 

 

μ΄λ ‡κ²Œ μ œλ„€λ¦­ νƒ€μž…μ˜ μ»¬λ ‰μ…˜μΈ κ²½μš°μ—λ„ var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ νƒ€μž…μ„ μΆ”λ‘ ν•˜κ²Œ ν•˜λ©΄ μ½”λ“œκ°€ 더 κ°„κ²°ν•΄μ§€κ³  가독성이 ν–₯μƒλœλ‹€.

 

 


 

νƒ€μž… κ²°μ •μ˜ μ‹œμ  var, dynamic

μžλ°”μŠ€ν¬λ¦½νŠΈμ™€λŠ” λ‹€λ₯΄κ²Œ C#μ—μ„œλŠ” var ν‚€μ›Œλ“œλŠ” 컴파일 νƒ€μž„μ— νƒ€μž…μ΄ κ²°μ •λœλ‹€. μ΄λŠ” JavaScript의 동적 νƒ€μž…κ³ΌλŠ” 쑰금 λ‹€λ₯Έ κ°œλ…μ΄λ‹€. κ·ΈλŸ¬λ‚˜ C#μ—λŠ” 동적 νƒ€μž…μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ dynamic ν‚€μ›Œλ“œκ°€ μžˆλ‹€.

dynamic value; // varλŠ” 컴파일 쀑에 νƒ€μž… κ²°μ •, dynamic은 싀행쀑에 νƒ€μž… κ²°μ •
value = 5;
Console.WriteLine(value);  // 좜λ ₯: 5

value = 3.14;
Console.WriteLine(value);  // 좜λ ₯: 3.14

value = "λ¬Έμžμ—΄";
Console.WriteLine(value);  // 좜λ ₯: λ¬Έμžμ—΄

dynamic ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λ³€μˆ˜μ˜ νƒ€μž…μ΄ 싀행쀑에 κ²°μ •λ˜λ―€λ‘œ, ν•œλ²ˆ μ„ μ–Έ 된 후에도 λ‹€λ₯Έ νƒ€μž…μ˜ 값을 ν• λ‹Ήν•  수 μžˆλ‹€. JavaScirpt의 varκ³Ό μœ μ‚¬ν•œ 동적 νƒ€μž… κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

 

λ°˜λ©΄μ— var ν‚€μ›Œλ“œλŠ” μ»΄νŒŒμΌνƒ€μž„μ— νƒ€μž…μ΄ κ²°μ •λ˜λ―€λ‘œ, λ³€μˆ˜κ°€ 선언될 λ•Œμ˜ νƒ€μž…μœΌλ‘œ κ³ μ •λœλ‹€. ν•œ 번 κ²°μ •λœ ν›„μ—λŠ” λ‹€λ₯Έ νƒ€μž…μ˜ 값을 ν• λ‹Ήν•  수 μ—†λ‹€.

 

λ”°λΌμ„œ, var ν‚€μ›Œλ“œλŠ” μ»΄νŒŒμΌνƒ€μž„μ— νƒ€μž…μ„ μΆ”λ‘ ν•˜κ³ , dynamic ν‚€μ›Œλ“œλŠ” 싀행쀑에 νƒ€μž…μ„ κ²°μ •ν•˜λ―€λ‘œ 이 λ‘˜μ„ μ„œλ‘œ λ‹€λ₯Έ νŠΉμ„±μ„ κ°€μ§€κ³  μžˆλ‹€.  

 


 

λ‹€λ₯Έ μ–Έμ–΄μ™€μ˜ μƒν˜Έ μš΄μš©μ„±μ„ κ³ λ €ν•œ 동적 νƒ€μž…μ˜ λ„μž…

동적 νƒ€μž…μ„ μ§€μ›ν•˜λŠ” 이유 쀑 ν•˜λ‚˜λŠ” λ‹€λ₯Έ 동적 νƒ€μž… 언어인 λ£¨λΉ„μ™€μ˜ 연동을 μœ„ν•΄μ„œμ΄λ‹€. C#μ—μ„œλ„ λ£¨λΉ„μ™€μ˜ μƒν˜Έ μš΄μš©μ„±μ„ κ³ λ €ν•˜μ—¬ 동적 νƒ€μž…μ„ λ„μž…ν•œ 것이닀.

 

λ˜ν•œ C#ν™˜κ²½μ—μ„œλŠ” Python μ½”λ“œλ₯Ό μž‘μ„±ν•  μˆ˜λ„ μžˆλ‹€. 이건 ꢌμž₯λ˜μ§€λŠ” μ•Šμ§€λ§Œ κ°€λŠ₯ν•˜λ‹€. 이λ₯Ό μœ„ν•΄μ„œ NuGet νŒ¨ν‚€μ§€ κ΄€λ¦¬μžλ₯Ό 톡해 ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•΄μ•Όν•œλ‹€. 마치 Node.js의 npmμ—μ„œ νŒ¨ν‚€μ§€ λ₯Ό λ‹€μš΄λ‘œλ“œν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것과 μœ μ‚¬ν•˜κ²Œ, C#ν™˜κ²½μ—μ„œλ„ μ‰˜μ—μ„œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜κ³  ν™œμš©ν•  수 μžˆλ‹€.

 

 


 

IronPython νŒ¨ν‚€μ§€ μ„€μΉ˜ - C# ν™˜κ²½μ—μ„œμ˜ 파이썬 톡합

 

도ꡬ> NuGet νŒ¨ν‚€μ§€ κ΄€λ¦¬μž > νŒ¨ν‚€μ§€ κ΄€λ¦¬μž μ½˜μ†”

도ꡬ > NuGetνŒ¨ν‚€μ§€ κ΄€λ¦¬μž > νŒ¨ν‚€μ§€ μ½˜μ†”

 

νŒ¨ν‚€μ§€ κ΄€λ¦¬μž μ½˜μ†”

intall-package IronPython

 

IronPython νŒ¨ν‚€μ§€ μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ 파이썬 μ½”λ“œλ₯Ό C#μ—μ„œ μž‘μ„±ν•  μˆ˜μžˆλ‹€.

 

μ΄λ ‡κ²Œ C#은 λ‹€λ₯Έ 동적 νƒ€μž… μ–Έμ–΄μ™€μ˜ μƒν˜Έμš΄μš©μ„±μ„ κ³ λ €ν•˜μ—¬ 동적 νƒ€μž…μ„ μ§€μ›ν•˜κ³  있고, ν•„μš”μ— 따라 μ™ΈλΆ€ μ–Έμ–΄μ™€μ˜ 톡합을 μœ„ν•œ νŒ¨ν‚€κΈ°λ₯Ό μ„€μΉ˜ν•˜μš” μ‚¬μš©ν•  μˆ˜μžˆλ‹€.

 

 


 

 

νŒŒμ΄μ¬μ„ C#에 λ‚΄μž₯ν•˜μ—¬ μ‚¬μš©ν•˜κΈ°

이 μ½”λ“œλŠ” C#μ—μ„œ IronPython 엔진을 μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μ˜ˆμ‹œμ΄λ‹€. 파이썬 μŠ€ν¬λ¦½νŠΈλŠ” C# μ½”λ“œ μ•ˆμ—μ„œ λ¬Έμžμ—΄λ‘œ μ •μ˜λ˜κ³ , C#의 λ¬Έμžμ—΄ 내에 파이썬 μ½”λ“œλ₯Ό μž‘μ„±ν• μˆ˜ μžˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ C#μ—μ„œ 파이썬 μ½”λ“œλ₯Ό 직접 μž‘μ„±ν•˜κ³  μ‹€ν–‰ν• μˆ˜ μžˆλ‹€.