C# 클래스 상속, is/as 키워드

728x90
  • 클래스 상속(IS-A 관계)

- 부모 클래스 : base, parent, 상위, super

- 자식 클래스 : derived, child, 파생, sub

- 클래스의 재사용

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

namespace _081_01_classInheritance
{
    class Super
    {
        protected int a; //private 불가능, public 가능
        public void Print()
        {
            Console.WriteLine("Super Print()");
        }
    }
    class Sub : Super
    {
        int b;
        public void Print()
        {
            Console.WriteLine("Sub Print() a : {0}, b : {1}", a, b); 
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Super super = new Super();
            super.Print();

            Sub sub = new Sub();
            sub.Print();
        }
    }
}

protected 접근 한정자가 사용하된 변수는 상속 받는 클래스에서 접근 가능, public 선언도 가능하지만 private으로 선언하면 부모 클래스에서만 사용이 한정된다. 

 

  • 클래스 상속(생성자, 소멸자)

- 상속에서 생성자 함수와 소멸자 함수

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

namespace _081_02_classInheritance
{
    class Super
    {
        protected int a;
        public Super()
        {
            a = 100;
            Console.WriteLine("  Call Super 생성자 호출");
        }
        ~Super()
        {
            Console.WriteLine("  Call Super 소멸자 호출");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Super super = new Super();

            //Sub sub = new Sub();
        }
    }
}

- base 키워드

 : 부모 클래스의 멤버 함수를 호출할 수 있다.

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

namespace _081_03_class_base
{
    class Super
    {
        int num;
        protected string name;

        public Super(int num)
        {
            this.num = num;
        }
        public void PrintSuper()
        {
            Console.WriteLine("Super  num : {0}", num);
        }
    }
    class Sub : Super
    {
        string name;

        public Sub(int num, string name) : base(num)
        //부모 클래스 Super() 안에 int num 값을 넣었기 때문에 반드시 base로 연결해주어야 한다
        {
            this.name = name;
        }
        public void PrintSub()
        {
            base.name = "Super";
            base.PrintSuper();
            //부모클래스의 멤버를 가져온다

            Console.WriteLine("Super name : {0}", base.name);
            Console.WriteLine("Sub name : {0}", this.name);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Sub sub = new Sub(26, "Jack");
            //"Jack"은 Sub 클래스의 String name
            sub.PrintSub();
        }
    }
}

  • is 키워드

- 객체의 형식 검사

- bool 리턴

  • as 키워드

- 형식 변환

- null 리턴

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

namespace _082_as
{
    class Base
    {
        int num;
        public void Print()
        {
            Console.WriteLine("num : {0}", num);
        }
    }
    class AA : Base
    {
        int a;
        public void PrintA()
        {
            Console.WriteLine("a : {0}", a);
        }
    }
    class BB : Base
    {
        int b;
        public void PrintB()
        {
            Console.WriteLine("b : {0}", b);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Base _base = new Base();
            _base.Print();

            Base aa = new AA(); //부모 클래스 이름을 자식 클래스의 객체로 생성 가능
            aa.Print();

            if(aa is BB)
            {
                Console.WriteLine("aa는 BB의 객체 입니다");
            }
            else if(aa is AA)
            {
                Console.WriteLine("aa는 AA의 객체 입니다");
            }
            Base bb = new BB();

            //BB copyBB = (BB)bb;  //캐스팅 연산도 가능하긴 한데 예외 있음
            BB copyBB = bb as BB; //강제 형 변환
            if(null != copyBB)
            {
                Console.WriteLine("------------------------------------");
                Console.WriteLine("copyBB는 BB객체를 형식 변환!!");
            }

            //AA copyAA = (AA)bb;  //예외 상황 발생(프로그램이 강제종료 될 수 있음)
            AA copyAA = bb as AA;
            if(null == copyAA)
            {
                Console.WriteLine("------------------------------------");
                Console.WriteLine("copyAA는 AA객체가 아니므로 null!!");

                copyAA = new AA();
                copyAA.Print();
                //copyAA.PrintA();  //원하는 값이 찍히지 않음, 오류(다형성으로 가능)

                AA asAA = copyAA as AA; //강제 형 변환
                asAA.PrintA();
            }
        }
    }
}

728x90