C#/이것이 C#이닀

24. C# ν˜•μ‹ λ³€ν™˜ 연산을 μœ„ν•œ μ—°μ‚°μž, is와 as

Rainbow🌈Coder 2022. 2. 11. 14:11
728x90
μ—°μ‚°μž μ„€λͺ…
is 객체가 ν•΄λ‹Ή ν˜•μ‹μ— ν•΄λ‹Ήν•˜λŠ”μ§€ κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό bool κ°’μœΌλ‘œ λ°˜ν™˜ν•œλ‹€
(객체(νž™μ„ κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜)κ°€ μ°Ύκ³  μžˆλŠ” μƒμ„±μž ν˜•μ‹μ„ κ°€λ¦¬ν‚€λŠ”κ²Œ λ§žλŠ”μ§€λ₯Ό 확인!!! λ‹€λ₯Έ μƒμ„±μž ν˜•μ‹μ„ 가리킬 μˆ˜λ„ μžˆμœΌλ‹ˆκΉŒ)
as 캐슀트. λ§κ·ΈλŒ€λ‘œ ν˜•μ‹ λ³€ν™˜!
ν˜•μ‹ λ³€ν™˜ μ—°μ‚°μžμ™€ 같은 역할을 ν•œλ‹€.
(아무리 μƒμ„±μž ν˜•μ‹μ„ κ°€λ₯΄ν‚¬μ§€ μ–Έμ • μ™„λ²½ν•˜κ²Œ ν˜•λ³€ν™˜ν•˜κΈ° μœ„ν•΄μ„œλŠ”
λ³€μˆ˜ μžμ²΄λ„ κ·Έ 선언을 같은 ν˜•μœΌλ‘œ μ§€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.)
λ‹€λ§Œ ν˜•μ‹ λ³€ν™˜ μ—°μ‚°μžκ°€ λ³€ν™˜μ— μ‹€νŒ¨ν•˜λŠ” 경우 μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” λ°˜λ©΄μ—
as μ—°μ‚°μžλŠ” 객체 μ°Έμ‘°λ₯Ό null둜 λ§Œλ“ λ‹€λŠ” 것이 λ‹€λ₯΄λ‹€.

as μ‚¬μš© 방법


 

 

            Mammal mammal3 = new Cat();
            if (mammal3 is Cat)
            {
                Cat cat2 = mammal3 as Cat;
                cat2.Meow();
            }


 

            Mammal mammal3 = new Cat(); 
            if (mammal3 is Cat)
            {
                Cat cat2 = (Cat)mammal3;
                cat2.Meow();
            }


기반 클래슀 λ³€μˆ˜μ˜€λ‹€λ©΄

κ²°κ΅­ μžμ‹ 클래슀 μƒμ„±μžλ₯Ό ν• λ‹Ήν•˜κΈ° μœ„ν•΄ new μžμ‹ν΄λž˜μŠ€μ‹λ³„μž() λΆˆλŸ¬μ„œ μ°Έμ‘° μ„€μ • λ°”κΏ”μ£Όκ³ ,

λ‹€μ‹œ μžμ‹ν΄λž˜μŠ€ λ³€μˆ˜μ—λ‹€ as ν‚€μ›Œλ“œ μ“°κ±°λ‚˜ (κ°•μ œ ν˜•λ³€ν™˜)ν‚€μ›Œλ“œλ₯Ό μ¨μ„œ 볡사해주어야 ν•œλ‹€.~~~

 

λ‘˜λ‹€ 좜λ ₯ κ²°κ³Όκ°€ λ˜‘κ°™κ³ 

Meow()λ₯Ό μ •μƒμ μœΌλ‘œ ν˜ΈμΆœν•œλ‹€.

 

일반적으둜 (Dog)λ‚˜ (Mammal) 꼴둜 μˆ˜ν–‰ν•˜λŠ” ν˜•μ‹ λ³€ν™˜ λŒ€μ‹  as μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” μͺ½μ„ ꢌμž₯ν•œλ‹€!

(빌 μ™€κ·Έλ„ˆ, [Effective C3]μ°Έμ‘°)

ν˜•μ‹ λ³€ν™˜μ— μ‹€νŒ¨ν•˜λ”λΌλ„ μ˜ˆμ™Έκ°€ μΌμ–΄λ‚˜ κ°‘μžκΈ° μ½”λ“œμ˜ 싀행이 μ ν”„ν•˜λŠ” 일이 μ—†μœΌλ―€λ‘œ

μ½”λ“œλ₯Ό κ΄€λ¦¬ν•˜κΈ°κ°€ 더 μˆ˜μ›”ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

단, as μ—°μ‚°μžλŠ” μ°Έμ‘° ν˜•μ‹μ— λŒ€ν•΄μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ

κ°’ ν˜•μ‹μ˜ κ°μ²΄λŠ” 기쑴의 ν˜•μ‹ λ³€ν™˜ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace UsingOut
{
    class Mammal
    {
        public void Nurse()
        {
            WriteLine("μžμ‹μ„ μ–‘μœ‘ν•˜λŠ” 쀑...");
        }

    }
    class Dog: Mammal
    {
        public void Bark() 
        {
            WriteLine("Bark!");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog();

            Mammal mammal = dog as Mammal;
            if (mammal != null)
            {
                mammal.Nurse();
            }
            else
            {
                WriteLine("μ΄μƒν•œ μ½”λ“œ");
            }
        }
    }
}

<좜λ ₯ κ²°κ³Ό>

μžμ‹μ„ μ–‘μœ‘ν•˜λŠ” 쀑...

<예제>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace UsingOut
{
    class Mammal
    {
        public void Nurse() { }
    }
    class Dog: Mammal
    {
        public void Bark() 
        {
            WriteLine("Bark!");
        }
    }
    class Rabbit : Mammal
    {
        public void Jump() { }
    }
    class Whale : Mammal
    {
        public void Swim() { }
    }
    class Cat : Mammal
    {
        public void Meow() 
        {
            WriteLine("Meow!");
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            Mammal mammal1 = new Dog();
            Dog dog;

            if(mammal1 is Dog)
            {
                dog = (Dog)mammal1; //mammal1 객체가 Dog ν˜•μ‹μž„μ„ ν™•μΈν–ˆμœΌλ―€λ‘œ μ•ˆμ „ν•˜κ²Œ ν˜•λ³€ν™˜
                dog.Bark();
            }

            Mammal mammal2 = new Cat();
            Cat cat = mammal2 as Cat;
            if (cat != null) //mammal2κ°€ Cat ν˜•μ‹ λ³€ν™˜μ— μ‹€νŒ¨ν–ˆλ‹€λ©΄ cat은 null이 λœλ‹€.
            { //ν•˜μ§€λ§Œ 이 μ½”λ“œμ—μ„œ mammal2λŠ” Catν˜•μ‹μ— ν•΄λ‹Ήν•˜λ―€λ‘œ μ•ˆμ „ν•˜κ²Œ μΊμŠ€νŠΈλ˜μ—ˆμœΌλ―€λ‘œ
                cat.Meow(); //(1)λ‚˜νƒ€λ‚¨
            }

            //mammal1 = new Cat(); //ν•΄λ‹Ή 주석을 ν’€λ©΄ (2)이 λ‚˜νƒ€λ‚¨
            Cat cat2 = mammal1 as Cat;
            if (cat2 != null)
            {
                cat2.Meow(); //(2)λ‚˜νƒ€λ‚˜μ§€ μ•ŠμŒ
            }
            else
                WriteLine("cat2 is not a Cat!");
        }
    }
}

<좜λ ₯>

Bark!
Meow!
cat2 is not a Cat!

<λ³€ν˜• 예제>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace UsingOut
{
    class Mammal
    {
        public void Nurse() { }
    }
    class Dog: Mammal
    {
        public void Bark() 
        {
            WriteLine("Bark!");
        }
    }
    class Rabbit : Mammal
    {
        public void Jump() { }
    }
    class Whale : Mammal
    {
        public void Swim() { }
    }
    class Cat : Mammal
    {
        public void Meow() 
        {
            WriteLine("Meow!");
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            Mammal mammal1 = new Dog();
            Dog dog;

            if(mammal1 is Dog)
            {
                dog = (Dog)mammal1;
                dog.Bark();
            }

            Mammal mammal2 = new Cat();
            Cat cat = mammal2 as Cat;
            if (cat != null)
            {
                cat.Meow(); //(1)λ‚˜νƒ€λ‚¨
            }

            mammal1 = new Cat(); //ν•΄λ‹Ή 주석을 ν’€λ©΄ (2)이 λ‚˜νƒ€λ‚¨
            Cat cat2 = mammal1 as Cat;
            if (cat2 != null)
            {
                cat2.Meow(); //(2)λ‚˜νƒ€λ‚¨
            }
            else
                WriteLine("cat2 is not a Cat!"); //(3)λ‚˜νƒ€λ‚˜μ§€ μ•ŠμŒ
        }
    }
}

<좜λ ₯ κ²°κ³Ό>

Bark!
Meow!
Meow!

 

 

μš”μ•½

 

<1>

            Mammal mammal1 = new Dog();
            Dog dog;

            if(mammal1 is Dog)
            {
                dog = (Dog)mammal1; //mammal1 객체가 Dog ν˜•μ‹μž„μ„ ν™•μΈν–ˆμœΌλ―€λ‘œ
                                    //μ•ˆμ „ν•˜κ²Œ ν˜•μ‹ λ³€ν™˜μ„ ν•΄μ€€λ‹€.
                dog.Bark();
            }
Bark!

<2>

            Mammal mammal1 = new Dog();
            if(mammal1 is Dog)
            {
                Dog dog = (Dog)mammal1;
                dog.Bark();
            }
Bark!

<3>

            Mammal mammal1 = new Dog();
            if(mammal1 is Dog)
            {
                Dog dog = mammal1 as Dog;
                dog.Bark();
            }
Bark!

 

 

<기타 μ—°μŠ΅>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace UsingOut
{
    class Mammal
    {
        public void Nurse() { }
    }
    class Dog: Mammal
    {
        public void Bark() 
        {
            WriteLine("Bark!");
        }
    }
    class Rabbit : Mammal
    {
        public void Jump() 
        {
            WriteLine("κΉ‘μΆ©κΉ‘μΆ©!");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Mammal mammal1 = new Dog();
            Dog dog = mammal1 as Dog;
            dog.Bark();

            Mammal mammal2 = new Rabbit();
            Rabbit rabbit = mammal2 as Rabbit;
            if (rabbit != null)
            {
                rabbit.Jump();
            }
            else
            {
                WriteLine("μ΄μƒν•œ μ½”λ“œ");
            }
        }
    }
}

<좜λ ₯ κ²°κ³Ό>

Bark!
κΉ‘μΆ©κΉ‘μΆ©!

 

 

<기타 μ—°μŠ΅2>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace UsingOut
{
    class Mammal
    {
        public void Nurse() { }
    }
    class Dog: Mammal
    {
        public void Bark() 
        {
            WriteLine("Bark!");
        }
    }
    class Rabbit : Mammal
    {
        public void Jump() 
        {
            WriteLine("κΉ‘μΆ©κΉ‘μΆ©!");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Mammal mammal1 = new Dog();
            Dog dog = mammal1 as Dog;
            dog.Bark();

            Mammal mammal2 = new Dog();
            Rabbit rabbit = mammal2 as Rabbit;
            if (rabbit != null)
            {
                rabbit.Jump();
            }
            else
            {
                WriteLine("μ΄μƒν•œ μ½”λ“œ");
            }

        }
    }
}

<좜λ ₯ κ²°κ³Ό>

Bark!
μ΄μƒν•œ μ½”λ“œ
728x90