NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 17-12. 클래스의 형변환. (Type Casting)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오랫만에 C# 관련 글을 작성하는군요. 이 글이 클래스에 대한 마지막 내용입니다. 오늘 알아볼 내용은 형변환인데요. 이게 상속과 관계가 있어서 원론적인 내용으로 들어가게 되면 내용이 상당히 길어지게 됩니다. 여기에서는 클래스를 어떻게 형변환해야 하는지 방법적인 내용만 다루고 인터페이스와 추상 클래스는 다음 단원에서 진행합니다.

     

    추상적인 클래스를 하나 추가합니다.

    Program.cs

    using System;
     
    namespace TypeCasting
    {
        class Animal
        {
            public void Cries()
            {
                Console.WriteLine("This is base class.");
            }
        }
     
        class Progrm
        {
            static void Main(string[] args)
            {
                Animal animal = new Animal();
                animal.Cries();
                Console.ReadKey();
            }
        }
    }

     

     

    Animal은 base 클래스가 되야합니다. 추상 클래스에 대해서 아직 배우지 않았기 때문에 abstract 키워드는 사용하지 않았습니다. 만약, 추상 클래스로 선언하게 되면 17라인처럼 new를 사용하여 인스턴스화 할 수 없습니다. 아무튼, OOP에 대해서 정리할 때 자세히 알아보기로 하고 지금은 Animal 클래스가 base가 된다는 것만 알아두면 됩니다. Java에서는 parent 또는 super가 됩니다.

    Program.cs

        class Dog : Animal
        {
            public void BowWow()
            {
                Console.WriteLine("This is dog class.");
            }
        }
     
        class Cat : Animal
        {
            public void Meow()
            {
                Console.WriteLine("This is cat class.");
            }
        }

     

     

    위의 코드와 같이 Dog와 Cat 클래스를 추가 했습니다. 이 둘은 동물이라는 범주의 포함되므로 둘다 Animal을 상속 받습니다. 이렇게 상속관계가 되면 Animal을 base class(기본 클래스)라 부르고 Dog와 Cat을 derived class(파생 클래스)라고 합니다. 이제 이들이 어떻게 형변환이 되는지 알아보죠.

    Program.cs

    using System;
     
    namespace TypeCasting
    {
        class Animal
        {
            public void Cries()
            {
                Console.WriteLine("This is base class.");
            }
        }
     
        class Dog : Animal
        {
            public void BowWow()
            {
                Console.WriteLine("This is dog class.");
            }
        }
     
        class Cat : Animal
        {
            public void Meow()
            {
                Console.WriteLine("This is cat class.");
            }
        }
     
        class Progrm
        {
            static void Main(string[] args)
            {
                Animal animal = new Animal();
                animal.Cries();
                Animal dog = new Dog();
     
                if (dog is Dog)
                {
                    ((Dog)dog).BowWow();
                }
     
                Animal cat = new Cat();
                Cat catInstance = cat as Cat;
     
                if (catInstance != null)
                {
                    catInstance.Meow();
                }
     
                Dog dogInstance = animal as Dog;
     
                if (dogInstance != null)
                {
                    dogInstance.BowWow();
                }
                else
                {
                    Console.WriteLine("Animal is not dog.");
                }
     
                Console.ReadKey();
            }
        }
    }

     

     

    38라인의 is 키워드는 클래스간에 형변환이 가능하면 true를 반환합니다. 반대로 형변환이 불가능하다면 false를 반환하죠. 타입은 Animal이지만, 내부 인스턴스는 Dog이므로 형변환이 정상적으로 이루어집니다. 이렇게 파생 클래스는 부모 클래스에 담을 수 있습니다. 그리고 형변환도 되죠. 반대로 자식 클래스에 부모는 담길수가 없습니다. 물론, 형변환도 안됩니다.

    44라인의 as 키워드는 클래스간에 형변환이 가능하다면 좌측에 형변환된 인스턴스를 반환하고, 형변환이 불가능하다면 null을 반환합니다. 따라서, as 키워드를 사용하면 아래에 if문에서 해당 인스턴스가 null인지 체크하는 로직이 들어가야 합니다.

    이렇게 is와 as를 통해 형변환이 되는지 체크 할수도 있지만, 명확하게 어떤 형(Type)인지 알고 있다면 클래스 왼쪽에 괄호안에 타입을 적어서 직접 캐스팅해도 됩니다.

     

    위 코드를 실행하면 아래 그림과 같은 결과를 확인할 수 있습니다.

    7kQz3ej.png

     

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.