카테고리 없음

부모 클래스와 자식 클래스 사이 형변환 (as, is 연산자)[질문1 -this]

유정쟝 2023. 7. 9. 23:09

*형변환

 

가능하면 형변환은 피하는게 좋고

불가피 하다면 as 가 안정적이다.

 

 

*형변환, as 연산자 비교

 

 as 연산자               =>    캐스트 연산자

t= st as MyType;     =>   t=(MyType)st;           st를 MYType으로 바

 

 

*as 연산자

 

namespace ConsoleApp_As 
{
    class Program
    {

            class Parent
            {
            }

           class Children : Parent
            {
                 public void Method()
                {
                Console.WriteLine("캐스팅 성공");
                }

               public void Method1()
               {
                Console.WriteLine("캐스팅 실패!");
               }

        }



            static void Main(string[] args)

            {

                Parent parent1 = new Parent();

                Parent parent2 = new Children();



                Children children = new Children();


            //as 사용예제


            children = parent1 as Children;

           // parent1 --> children 형변환


            if (children != null)
            {
                children.Method();
            }
            else
            { 
                Console.WriteLine("캐스팅 실패!"); 
            }

 

              // else
              //  {
              //  children.Method1();
              //  }

위와 같은 코드로 대체시 안되는 이유

 

해결책)

Children children1 = new Children(); 하나를 추가하고

        else
               {
                children1.Method1();
                }

 

이렇게 해주면 인스턴스화로 객체가 하나더 생겼기 때문에 이런식으로 불러오면 된다.

 

parent1도 초기화를 했지만 as 

 children = parent1 as Children;





            // is 사용하는 예제
            //  children = parent2 as Children;
            //그냥 단순히 형식변환하는 코드
            //parent2를  Parent --> Children


            if (parent2 is Children)
            {
                children = (Children)parent2;
                children.Method();
            }

            }



        }


    }

 

 

 

 

 

*업캐스팅(Upcasting)

class Monster

{

     public void Attack(){...}

}

class Slime : Monster

{

     public void LiqidAttack(){...}

}

    class Bubble : Monster

{

    public void LiqidAttack(){...}

}

    class RibonPig : Monster

{

    public void StrikeAttack(){...}

}

 

   class MonsterSpawn

{

public void Spwan(Slime slime) {...}

public void Spwan(Bubble bubbling) {...}

public void Spwan(RibonPig ribbonpig) {...}

}  

    

//업케스팅

class MonsterSpwan

{

public void Spwan(Monster monster){...}

}

 

자식 클래스의 고유기능을 사용하기 위해 형변환 사용(Type casting)

is ==> 결과를 bool값으로 변환

 

Monster monster = new Slime();

Slime slime;  //굳이 인스턴스화 까지는 안하는듯

if(monster is Slime)    ==> 만약에 부모가 자식이라면

{

slime = (Slime)monster;             자식객체 = 부모객체가 자식형태로 바뀜

slime.LiquidAttack();                   자식객체 매서드 사용가능

}

 

 

Monster monster = new Bubbling();

Bubbling bubbling = monster as Bubbling;

 

bubbling?.TailAttack();