제로의영역

7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is와 as 2. 본문

C#

7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is와 as 2.

아이큐제로 2019. 5. 31. 18:36

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

형식 변환을 예제 중심으로 작성해보려고 합니다.

기억을 되새기기 위해 어제 작성한 글을 다시한번 정리해봅니다.(머리가 나쁜기 때문에 무조건 반복 ㅜㅜ)

 

(1) 정리

 1) 기반 클래스(이하 부모클래스)와 파생 클래스(이하 자식클래스)의 형식 변환도 형식 변환 연산자와 같은 형식이고 형식 변환 연산자(int, float 등)가 들어가는 자리에 변환시킬  '자식클래스'가 들어감.

 2) is는 호환여부를 확인하는데 사용되며 결과를 bool값으로 반환하고 'if(부모클래스의 인스턴스+is+자식클래스)'로 표현.

 3) 형식 변환 연산자는 변수가 값 형식(데이터)일 때만 사용하고 참조 형식일 때는 as 연산자를 사용. '자식클래스+자식클래스의 인스턴스=부모클래스의 인스턴스+as+자식클래스'로 표현.

 

(2) 예제

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ex7_10
{
    
        class Mammal
        {
            public void Nurse()
            {
                Console.WriteLine("Nurse()");
            }
        }

        class Dog:Mammal                        //Mammal클래스를 상속받은 파생클래스
        {
            public void Bark()
            {
                Console.WriteLine("Bark()");
            }
        }

        class Cat: Mammal                      //Mammal클래스를 상속받은 파생클래스
    {
            public void Meow()
            {
                Console.WriteLine("Meow()");
            }
        }

    class MainApp
    {
        static void Main(string[] args)
        {
            Mammal mammal = new Dog();      // 기반클래스의 참조변수 mammal로 파생클래스 Dog()을 참조
            Dog dog;                        // dog을 Dog 클래스의 변수로 선언

            if (mammal is Dog)              // 참조 변수 mammal이 Dog()을 참조하기 때문에 true
            {
                dog = (Dog)mammal;          // mammal을 Dog클래스의 dog으로 형식변환
                dog.Bark();                 // Dog 클래스의 Bark() 실행
            }

            Mammal mammal2 = new Cat();     // 기반 클래스의 참조변수 mammal2로 파생클래스 Cat()을 참조

            Cat cat = mammal2 as Cat;       // mammal2를 Cat클래스의 cat으로 형식 변환 
            if (cat != null)                // mammal2는 Cat()을 참조하므로 형식 변환이 이루어지기 때문에 null값이 아님.
                cat.Meow();                 // Cat 클래스의 Meow() 실행

            Cat cat2 = mammal as Cat;       // mammal을 Cat클래스의 cat2로 형식 변환
            if (cat2 != null)               // mammal은 Dog()을 참조하므로 형식 변환이 이루어지지 않기 때문에 null값을 가짐.
                cat2.Meow();                // null값을 가지기 때문에 실행되지 않음.
            else                            // null값을 가지지 않기 때문에 실행됨.
                Console.WriteLine("cat2 is not a Cat");
        }
    }
}

출력 결과

Bark()
Meow()
cat2 is not a Cat