C#

[C#] var ν‚€μ›Œλ“œμ˜ 암묡적 νƒ€μž… μΆ”λ‘ 

hyonie 2025. 2. 16. 22:40

C#μ—μ„œλ„ var νŒ¨ν„΄μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 객체(object)ν˜•νƒœλ‘œ 받은 값을 var ν‚€μ›Œλ“œλ₯Ό 톡해 κ°„λ‹¨νžˆ 좜λ ₯ν•˜κ±°λ‚˜ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이 νŒ¨ν„΄μ€ 일반적으둜 많이 μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ μ΄λŸ¬ν•œ 것듀이 μžˆκ΅¬λ‚˜.. μ΄ν•΄λ§Œ ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

πŸ“‚ λͺ©μ°¨

     


    1. 암묡적 νƒ€μž…μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

    암묡적 νƒ€μž…μ΄λž€ νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•˜μ§€μ•Šκ³ , μ»΄νŒŒμΌλŸ¬κ°€ 값을 보고 μΆ”λ‘ ν•˜λŠ” 방식을 μ˜λ―Έν•©λ‹ˆλ‹€. 이λ₯Ό C#μ—μ„œλŠ” var ν‚€μ›Œλ“œλ‘œ κ΅¬ν˜„ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

     

    κ°„λ‹¨ν•œ 예제둜:

    object obj = "Hello, World!";
    
    if(obj is var result)
    {
      Console.WriteLine(result);  // "Hello, World!" 좜λ ₯
    }

    μ—¬κΈ°μ„œ obj is var resultλŠ” obj의 값을 result λ³€μˆ˜μ— κ·ΈλŒ€λ‘œ ν• λ‹Ήν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. varλŠ” μ»΄νŒŒμΌλŸ¬κ°€ λ³€μˆ˜μ˜ νƒ€μž…μ„ μžλ™μœΌλ‘œ μΆ”λ‘ ν•˜λ―€λ‘œ, obj와 varλŠ” 항상 νƒ€μž…μ΄ μΌμΉ˜ν•˜κ²Œ λ©λ‹ˆλ‹€. λ”°λΌμ„œ is 연산은 항상 μ°Έ(true)이 λ©λ‹ˆλ‹€. 즉, νƒ€μž…μ— 관계없이 obj의 값이 κ·ΈλŒ€λ‘œ result에 λŒ€μž…λ˜κ³ , μ΄ν›„μ—λŠ” result λ³€μˆ˜λ₯Ό 톡해 ν•΄λ‹Ή 값을 μ‚¬μš©ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

     

    암묡적 νƒ€μž…μ˜ 원리

    암묡적 νƒ€μž…μ΄λž€ μ»΄νŒŒμΌλŸ¬κ°€ μž…λ ₯된 값을 기반으둜 λ³€μˆ˜μ˜ νƒ€μž…μ„ μžλ™μœΌλ‘œ μΆ”λ‘ ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ„ λͺ…μ‹œν•˜μ§€μ•Šκ³ λ„ λ³€μˆ˜λ₯Ό μ„ μ–Έν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μœ„μ—μ„œλ„ μ–ΈκΈ‰ν–ˆλ“―μ΄ μ»΄νŒŒμΌλŸ¬κ°€ μž…λ ₯된 값을 보고 λ‚΄λΆ€μ μœΌλ‘œ μΆ”λ‘ ν•©λ‹ˆλ‹€.

     

    예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같은 μ½”λ“œκ°€ μžˆλ‹€κ³  ν•˜μžλ©΄

    var x = 10; // xλŠ” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ int νƒ€μž…μœΌλ‘œ μΆ”λ‘ λ©λ‹ˆλ‹€.
    var str = "λ¬Έμžμ—΄"; // str은 string νƒ€μž…μœΌλ‘œ μΆ”λ‘ λ©λ‹ˆλ‹€.

    μ—¬κΈ°μ„œ xλŠ” λͺ…μ‹œμ μœΌλ‘œ int 라고 μ„ μ–Έν•˜μ§€ μ•Šμ•˜μ§€λ§Œ, κ°’ 10을 기반으둜 μ»΄νŒŒμΌλŸ¬κ°€ xλ₯Ό int νƒ€μž…μœΌλ‘œ κ°„μ£Όν•©λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ "λ¬Έμžμ—΄" 값을 기반으둜 str은 string νƒ€μž…μœΌλ‘œ 좔둠을 ν•©λ‹ˆλ‹€.

     

    이처럼 νƒ€μž… 좔둠은 값을 기반으둜 λ³€μˆ˜μ˜ νƒ€μž…μ„ μžλ™μœΌλ‘œ κ²°μ •ν•˜κ³ , JavsScript의 동적 타이핑과 μœ μ‚¬ν•œ 점이 μžˆμŠ΅λ‹ˆλ‹€. 

     

    예제: 암묡적 νƒ€μž…μ˜ ν™œμš©

    μ•„λž˜λŠ” κ°„λ‹¨ν•œ C# μ½”λ“œ μ˜ˆμ œμž…λ‹ˆλ‹€:

    static void Main(string[] args)
    {
        var x = 10;
        var y = 5;
        var str = "λ¬Έμžμ—΄";
    
        Console.SetCursorPosition(x, y);
        Console.WriteLine(str);
    }

     

    μœ„ μ½”λ“œλŠ” x, y, str의 νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•˜μ§€ μ•Šκ³ λ„ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 있게 ν•΄μ€λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ 값을 기반으둜 각 λ³€μˆ˜μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•΄μ£ΌκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

    xλŠ” κ°’ 10을 기반으둜 int νƒ€μž…μœΌλ‘œ μΆ”λ‘ λ˜κ³ , y μ—­μ‹œ κ°’ 5λ₯Ό 기반으둜 int νƒ€μž…μœΌλ‘œ μΆ”λ‘ λ©λ‹ˆλ‹€. str은 λ¬Έμžμ—΄ "λ¬Έμžμ—΄"을 기반으둜 string νƒ€μž…μœΌλ‘œ μΆ”λ‘ λ©λ‹ˆλ‹€. 

     

    λ˜ν•œ μ½”λ“œμ—μ„œ μ‚¬μš©λœ SetCursorPosition() λ©”μ„œλ“œλŠ” μ½˜μ†”μ—μ„œ 좜λ ₯ μœ„μΉ˜λ₯Ό μ„€μ •ν•˜λŠ” κΈ°λŠ₯을 ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ x와 y값이 μ½˜μ†” ν™”λ©΄μ˜ μ’Œν‘œλ‘œ μ‚¬μš©λ˜κ³ , μ§€μ •λœ μœ„μΉ˜(10, 5) μ’Œν‘œμ— str λ³€μˆ˜μ˜ κ°’ "λ¬Έμžμ—΄"을 좜λ ₯ν•΄ μ€λ‹ˆλ‹€.

     

    2. 암묡적 νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 이유

    var νƒ€μž…μ„ μ‚¬μš©ν•˜λ‹ˆκΉŒ νŽΈλ¦¬ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ var νƒ€μž…μ˜ 단점은 νƒ€μž…μ΄ λͺ…ν™•ν•˜κ²Œ λ“œλŸ¬λ‚˜μ§€ μ•Šμ„ 수 μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄, 암묡적 νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒμš”?

    κ·Έ μ΄μœ λŠ” λŸ°νƒ€μž„ μ‹œ μ–΄λ–€ 값이 λ“€μ–΄μ˜¬μ§€ 미리 μ•Œ 수 없을 λ•Œ μœ μš©ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 

    특히 객체λ₯Ό μƒμ„±ν–ˆλŠ”λ° νƒ€μž…μ΄ λͺ…ν™•νžˆ μ•Œ 수 μ—†κ±°λ‚˜, λ„ˆλ¬΄ κΈΈκ³  λ³΅μž‘ν•œ νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν•  λ•Œ varλ₯Ό ν™œμš©ν•˜λ©΄ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μž‘μ„±ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

     

    예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같은 List의 μ œλ„€λ¦­ ν˜•μ‹μ˜ μ½”λ“œκ°€ μžˆλ‹€λ©΄:

    List<MyNameSpace.MyDefinedClass> list = new List<MyNameSpace.MyDefindClass>(10);

     

    이 μ½”λ“œμ—μ„œ λ³€μˆ˜ list의 νƒ€μž…μ€ λͺ…ν™•νžˆ List<MyNameSpace.MyDefinedClass>둜 μ„ μ–Έλ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이처럼 νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ μž‘μ„±ν•΄μ•Ό ν•  λ•Œ, μ’Œλ³€κ³Ό μš°λ³€μ— λ™μΌν•œ νƒ€μž…μ„ 반볡적으둜 μ‚¬μš©ν•˜λŠ” 것은 λΆˆν•„μš”ν•˜κ³  번거둜울 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    이λ₯Ό var둜 κ°„μ†Œν™”ν•˜λ©΄ μ•„λž˜μ™€ 같이 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    var list = new List<MyNameSpace.MyDefindClass>(10);

    두 μ½”λ“œμ˜ κ²°κ³ΌλŠ” λ™μΌν•˜μ§€λ§Œ, varλ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œκ°€ μ§§μ•„μ§€κ³  λΆˆν•„μš”ν•œ 반볡이 μ‚¬λΌμ§‘λ‹ˆλ‹€.

     

    λ”°λΌμ„œ var λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” νƒ€μž…μ΄ λͺ…ν™•νžˆ μΆ”λ‘  κ°€λŠ₯ν•œ κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

     

     

     

    3. 암묡적 νƒ€μž…κ³Ό λžŒλ‹€μ‹μ˜ 연결고리

    암묡적 νƒ€μž…μ„ μ΄ν•΄ν•˜λ©΄, λžŒλ‹€μ‹μ„ 더 μ‰½κ²Œ μ΄ν•΄ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. λžŒλ‹€μ‹μ€ κ°„λ‹¨νžˆ 말해 읡λͺ… λ©”μ„œλ“œλ₯Ό 더 κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•œ λ°©μ‹μž…λ‹ˆλ‹€. κ²°κ΅­ JavaScript의 ν™”μ‚΄ν‘œ ν•¨μˆ˜(=>)와 λΉ„μŠ·ν•œ κ°œλ…μœΌλ‘œ λ°œμ „ν•˜κ²Œ λ©λ‹ˆλ‹€.

     

    λžŒλ‹€μ‹μ˜ κΈ°λ³Έν˜•μ‹:

    (parameter) => expression;

     

    예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같은 읡λͺ… λ©”μ„œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    읡λͺ…λ©”μ„œλ“œ:

    delegate(int x) {return x * x};

     

    λžŒλ‹€μ‹: 

    x => x * x;

    λžŒλ‹€μ‹μ€ 암묡적 νƒ€μž… 좔둠을 기반으둜 ν•˜κ³ , 이λ₯Ό 톡해 λ©”μ„œλ“œ 선언을 κ°„μ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    암묡적 νƒ€μž…μ€ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€. 특히 λ³΅μž‘ν•œ νƒ€μž…μ„ λ‹€λ£¨κ±°λ‚˜, λ°˜ν™˜ νƒ€μž…μ΄ λͺ…ν™•ν•˜μ§€ μ•Šμ„ λ•Œ(무엇을 return ν•˜λŠ”μ§€ λͺ¨λ₯΄λŠ” 경우), var νƒ€μž…μœΌλ‘œ λ°›μœΌλ©΄ μ•Œμ•„μ„œ 암묡적 ν˜•μ‹μœΌλ‘œ λ°›μ•„μ€λ‹ˆλ‹€. 이후 λžŒλ‹€μ‹μ΄λ‚˜ 읡λͺ…λ©”μ„œλ“œμ˜ κ°œλ…μ— λŒ€ν•΄μ„œλ„ μ‰½κ²Œ μ΄ν•΄ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

     

    μš”μ•½

    β˜‘οΈ 암묡적 νƒ€μž…μ€ var ν‚€μ›Œλ“œλ‘œ κ΅¬ν˜„λ˜κ³ , μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ μΆ”λ‘ ν•œλ‹€.

    β˜‘οΈ μ½”λ“œ 가독성을 높이고 λ°˜λ³΅μ„ 쀄이기 μœ„ν•΄ μ‚¬μš©λœλ‹€.

    β˜‘οΈ ν•˜μ§€λ§Œ νƒ€μž…μ΄ λͺ…ν™•ν•˜μ§€ μ•Šμ€ 경우 ν˜Όλž€μ„ 쀄 수 μžˆλ‹€.

    β˜‘οΈ 암묡적 νƒ€μž…μ€ λžŒλ‹€μ‹κ³Ό λ°€μ ‘ν•œ 관련이 μžˆλ‹€.