C# 7. 클래스 상속과 오버라이딩
Feb. 27, 2022, 11:31 p.m.
1. 필요성
C# 프로그래밍을 하면서 클래스를 만들고 사용하다보면 여러 클래스에서 공통된 기능을 구현해야 하는 경우가 많습니다.
예를 들어 택시 클래스와 버스 클래스가 있다고 해보겠습니다. 택시와 버스는 가격도 다르고 생김새도 다릅니다. 그러나 둘다 바퀴가 4개인 자동차이면서 정해진 가격을 받으며 사람을 태우고 다니는 대중교통입니다.
그렇기 때문에 차가 움직이는 기능이나 대중교통의 요금을 받아서 결제하는 부분은 두 클래스의 공통된 기능이라고 볼 수 있겠습니다.
이 공통된 기능을 각 클래스에 따로 똑같이 구현할 수도 있겠지만 중복과 반복은 프로그래밍에서 좋은 게 아닙니다.
이럴 때는 중복되는 기능들을 모아 베이스 클래스를 만들고 하위 클래스에서 이를 상속받아서 사용하면 됩니당.
위와 같은 예시에서는 대중교통이라는 베이스 클래스를 만들고 택시와 버스 클래스가 이를 상속받으면 되겠네요!
2. 문법
실제로 C# 에서 클래스 상속을 어떻게 구현할까요?
Animal 클래스와 Dog, Cat 클래스를 통해 알아보겠습니다.
class Animal
{
public void Eat()
{
//eat something
}
public void Run()
{
//running
}
}
class Dog
{
public void Bark()
{
//Bark! Bark!
}
}
class Cat
{
public void Meow()
{
//Meow~
}
}
위를 보시면 Animal 클래스에는 Eat(), Run() 메서드가 있고 Dog클래스에는 Bark() 메서드, Cat 클래스에는 Meow() 메서드가 있습니다.
Dog과 Cat은 모두 동물이기 때문에 먹기와 달리기 (Eat()과 Run()) 을 할 수 있어야 합니다.
직접 Dog 클래스와 Cat 클래스에 Eat과 Run을 구현해 줄 수도 있지만 앞서 말했듯이 상속을 통해 베이스 클래스의 메서드를 사용할 수 있습니다.
상속은 클래스명 옆에 : 을 쓰고 상속받을 클래스 명을 적으면 됩니다.
Dog 클래스와 Cat 클래스에 Animal 클래스를 상속받아 보겠습니다.
class Dog : Animal
{
public void Bark()
{
//Bark! Bark!
}
}
class Cat : Animal
{
public void Meow()
{
//Meow~
}
}
이젠 개와 고양이도 먹고 달릴 수 있습니다.
Dog dog = new Dog();
Cat cat = new Cat();
dog.Eat();
cat.Run();
베이스 클래스가 생성자를 가지고 있다면 상속받는 클래스도 생성자를 만들어 주어야 합니다. 이는 다음 포스팅에서 base 키워드랑 함께 알아보도록 할게요.
3. 오버라이딩
만약에 베이스 클래스를 가져오되 살짝만 수정하고 싶다면 어떡해야 할까요? 예를들어 Animal 클래스에서 Eat은 그대로 가져오고 싶지만 Run은 동물의 특성에 맞게 수정하고 싶은 경우가 있겠네요.
그럴때는 오버라이딩을 통해 베이스 클래스의 메서드를 재 선언을 하여 수정할 수 있습니다.
먼저 오버라이딩이 가능한 메서드는 virtual 키워드를 사용해서 지정해 주어야 합니다.
class Animal
{
public void Eat()
{
//eat something
}
public virtual void Run()
{
//running
}
}
그다음 이를 상속받는 서브 클래스에서 override 키워드를 이용해 오버라이드 하여 수정할 수 있습니다.
class Dog : Animal
{
public override void Run()
{
//정신없이 내달리기
}
public void Bark()
{
//Bark! Bark!
}
}
class Cat : Animal
{
public override void Run()
{
//고상하게 사뿐사뿐 달리기
}
public void Meow()
{
//Meow~
}
}
이렇게 하면 Run() 메서드를 사용했을 때 Animal 클래스에서 선언된 메서드가 아닌 오버라이드 한 메서드가 실행이 됩니다. 개는 정신없이 내달리고, 고양이는 고상하게 사뿐사뿐 달리겠네요!
4. 유연한 형변환
상속 받은 클래스는 상위 클래스로 형변환이 가능합니다. 개나 고양이는 모두 동물이기 때문에 Animal로 형변환이 가능한 것이죠. 반대로 Animal 클래스를 Dog 클래스로 변환하는 것은 불가능합니다.
또한 Animal 클래스로 형변환 했을 경우 Animal 클래스에 해당되는 메서드나 필드만 접근할 수 있답니다. 오버라이드 했던 메서드라도 오버라이드는 적용되지 않습니다.
Dog dog = new Dog();
Cat cat = new Cat();
Animal animal = dog;
animal.Eat() //eat something
animal.Run()//running
animal.Bark()//실행 불가
Animal 클래스로 형변환된 개는 정신없이 달리지 못하고 짖지도 못하네요..
이번 포스팅에서는 클래스의 상속과 오버라이딩, 형변환을 알아봤습니다. 이를 통해 훨씬 구조적이고 명확한 프로그램을 만들어 보시길 바랍니다!
override virtual