C# Class3

Chan·2021년 12월 2일
0

C#

목록 보기
5/10

클래스 상속

  • 클래스는 다른 클래스로부터 상속받을 수 있다.
  • 객체지향에서는 자식 클래스가 부모 클래스 지정
  • 형식
class 기반클래스
{
}

class 파생클래스 : 기반클래스
{
}
  • 예시 코드
using System;

namespace Inheritance
{
    class Base
    {
        protected string Name;
        public Base(string Name)
        {
            this.Name = Name;
            Console.WriteLine($"{this.Name}.Base()");
        }

        ~Base()
        {
            Console.WriteLine($"{this.Name}.~Base()");
        }

        public void BaseMethod()
        {
            Console.WriteLine($"{Name}.BaseMethod()");
        }
    }

    class Derived : Base // 자식 클래스 : 부모 클래스 선언
    {
        public Derived(string Name) : base(Name)
        {
            Console.WriteLine($"{this.Name}.Derived()");
        }

        ~Derived()
        {
            Console.WriteLine($"{this.Name}.~Derived()");
        }

        public void DerivedMethod()
        {
            Console.WriteLine($"{Name}.DerivedMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Base a = new Base("a"); // a.Base()
            a.BaseMethod(); // a.BaseMethod()

            Derived b = new Derived("b"); // b.Base() b.Derived()
            b.BaseMethod(); // b.BaseMethod()
            b.DerivedMethod(); // b.DerivedMethod()
        }
    }
}
  • 상속이나 자식 클래스 구현을 막기 위해 상속이 불가능하게 하는 sealed 한정자 이용
  • 형식
sealed class Base
{
}

clase Derived : Base  //컴파일 에러
{
}

부모 클래스와 자식 클래스 사이의 형식 변환, is, as

  • 개, 고양이는 포유류라는 공통점이 있으므로 같은 부모클래스 가짐
class Mammal
{
	public void Nurse(){}
}

class Dog : Mammal
{
	public void Bark(){}
}

class Cat : Mammal
{
	public void Meow{}
}
  • 클래스의 인스턴스
Mammal mammal= new Mammal();
mammal.Nurse()

Dog dog = new Dog(); // 자식 클래스 인스턴스 생성
dog.Nurse(); // 부모 클래스 메소드도 사용
dog.Bark();

Cat cat = new Cat();
cat.Nurse();
cat.Meow();
  • 또다른 클래스의 인스턴스
Mammal mammal= new Mammal();
mammal.Nurse()

mammal = new Dog();
mammal.Nurse();

Dog dog = (Dog)mammal; // 형식변환 ? 
dog.Nurse();
dog.Bark();

mammal = new Cat();
mammal.Nurse();
Cat cat = (Cat)mammal;
cat.Nurse();
cat.Meow();
  • Mammal 클래스에서 300개의 클래스가 파생 시, 사육사 클래스를 만들고 이 동물을 씻기는 Wash()메소드를 구현한다면 300개의 Wash()메소드를 오버로딩 해야함?
    -> 300개의 동물 클래스가 모두 Mammal클래스로 부터 상속 받았기에 이들을 모두 Mammal로 간주해서 딱 하나의 Wash()메소드만 준비하면 됨
class Zookeeper
{
    //public void Wash(Dog dog){}
    //public void Wash(Cat cat){}
    //public void Wash(Elephant elephant){}
    //public void Wash(Lion lion){}
    //...
    public void Wash(Mammal mammal){}
}
  • is : 객체가 해당 형식에 해당하는지 검사하여 그 결과를 bool값으로 반환
Mammal mammal = new Dog();
Dog dog;
if(mammal is Dog)
{
	dog = (Dog)mammal;
	dog.Bark();
}
  • as : 형식 변환 연산자와 같은 역할, 다만 형식 변환 연산자가 실패하는 경우 예외를 던지지만 as연산자는 객체 참조를 null로 만든다.
Mammal mammal2 = new Cat();
Cat cat = mammal2 as Cat;
if(cat!=null)
{
	cat.Meow();
}
  • (Dog), (Mammal)과 같이 형식변환 대신 as연산자 사용하는 쪽을 권장 ⇒ 실패하더라도 예외가 일어나 갑자기 코드의 실행이 점프하는 일이 없어서 코드 관리가 용이
profile
Backend Web Developer

0개의 댓글