반응형

상속(Inheritance)이란?

상속은 한 클래스의 필드(Field)와 메서드(Method)를 다른 클래스로 전달하는 개념이다. 보통 상속하는 클래스를 '부모 클래스', 상속 받는 클래스를 '자식 클래스'라고 한다.

Tenor

 

실생활에 있을 법한 예를 들어 보자. 엄마가 중학생 아들에게 학교 생활을 하며 사용하라고 체크카드를 줬다. 이 체크카드는 엄마 명의의 계좌에 연결되어 있다. 아들은 엄마 명의의 계좌에 있는 돈을 마음대로 사용할 수 있다. 이를 코드로 한 번 구현해 보자.

예시1:

class MotherAccount // base class 부모 클래스  
{
    public string accountName = "신한";
    public void Payment() // 
    {
        Console.WriteLine("0000원이 결제 되었습니다.");
    }
}

class Son : MotherAccount // Son 클래스가 MotherAccount 클래스를 상속  
{
    public string name = "영수";
}

class Program
{
    static void Main(string[] args)
    {
        // mySon 객체 생성  
        Son mySon = new Son();

        // Payment() 메서드 호출
        mySon.Payment();

        Console.WriteLine(mySon.name + "가 " + mySon.accountName + "체크카드를 사용했어요.");
    }
}

예시1의 결과

MotherAccount라는 클래스를 상속한 Son 클래스가 MotherAccount의 멤버에 접근할 수 있게 되었다. 상속을 하는 방법은 클래스를 선언할 때 다음과 같이 : 기호를 사용하면 된다. class Son : MotherAccount

sealed 키워드

다른 클래스가 특정 클래스에 상속되는 것을 원하지 않을 때는 sealed키워드를 선언부 앞에 추가하면 된다.
예시2:

sealed class Vehicle
{

}

class Car : Vehicle{

}

상속하려고 하는 경우 다음과 같은 에러 메시지가 발생할 것이다.

다형성(Polymorphism)이란 무엇일까?

다형성은 "다양한 형태"를 의미하는 말이다. 객체 지향 프로그래밍에서 중요한 개념인데, 같은 이름의 메서드가 다른 클래스에 의해 다르게 구현될 수 있는 능력을 의미한다. 아래 예시를 살펴보자.

예시3:

class Animal  // 부모클래스
{
  public virtual void animalSound() 
  {
    Console.WriteLine("The animal makes a sound");
  }
}

class Pig : Animal  // 자식클래스 Pig
{
  public override void animalSound() 
  {
    Console.WriteLine("The pig says: wee wee");
  }
}

class Dog : Animal  // 자식 클래스 Dog
{
  public override void animalSound() 
  {
    Console.WriteLine("The dog says: bow wow");
  }
}

class Program 
{
  static void Main(string[] args) 
  {
    Animal myAnimal = new Animal();  // Animal 객체 생성
    Animal myPig = new Pig();  // Pig 객체 생성
    Animal myDog = new Dog();  // Dog 객체 생성

    myAnimal.animalSound();
    myPig.animalSound();
    myDog.animalSound();
  }
}

상속을 통해 PigDog 클래스는 Animal 클래스의 특성을 상속받는다. 이처럼 새로운 동물 클래스를 추가할 때 기존 코드의 수정 없이 새로운 클래스를 만들어 확장할 수 있다.

 

앞서 다형성은 같은 이름의 메서드가 다른 클래스에 의해 다르게 구현될 수 있음을 의미한다고 했다. 예시3에서 살펴보면 PigDog 클래스는 Animal 클래스 내의 animalSound()라는 메서드와 동일한 이름을 가진 메서드를 클래스 내에 선언하고 있다.

 

100마리의 동물 클래스를 추가한다고 했을 때 다형성을 사용하지 않는다고 하면 어떻게 될까? animalSound1, animalSound2… 이런 형태로 메서드 이름을 각자 다르게 가져가야 할 것이다.

virtual과 override 키워드

다형성은 virtual 키워드와 override 키워드를 사용해 구현할 수 있다.

예시4:

class Animal  // 부모클래스
{
  public virtual void animalSound() 
  {
    Console.WriteLine("The animal makes a sound");
  }
}

부모 클래스에서 virtual 키워드가 붙은 메서드는 하위 클래스에서 재정의 할 수 있게 된다.

class Dog : Animal  // 자식 클래스 Dog
{
  public override void animalSound() 
  {
    Console.WriteLine("The dog says: bow wow");
  }
}

Dog 클래스 내의 animalSound()메서드는 Animal 클래스 내의 메서드와 이름이 같다. 하지만 메서드 내의 코드는 다르게 작성된 것을 확인할 수 있다. 이런 형태로 부모 클래스의 메서드를 재정의(Override) 할 수 있다.

반응형

+ Recent posts