상속(Inheritance)이란?
상속은 한 클래스의 필드(Field)와 메서드(Method)를 다른 클래스로 전달하는 개념이다. 보통 상속하는 클래스를 '부모 클래스', 상속 받는 클래스를 '자식 클래스'라고 한다.
실생활에 있을 법한 예를 들어 보자. 엄마가 중학생 아들에게 학교 생활을 하며 사용하라고 체크카드를 줬다. 이 체크카드는 엄마 명의의 계좌에 연결되어 있다. 아들은 엄마 명의의 계좌에 있는 돈을 마음대로 사용할 수 있다. 이를 코드로 한 번 구현해 보자.
예시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();
}
}
상속을 통해 Pig
및 Dog
클래스는 Animal
클래스의 특성을 상속받는다. 이처럼 새로운 동물 클래스를 추가할 때 기존 코드의 수정 없이 새로운 클래스를 만들어 확장할 수 있다.
앞서 다형성은 같은 이름의 메서드가 다른 클래스에 의해 다르게 구현될 수 있음을 의미한다고 했다. 예시3
에서 살펴보면 Pig
와 Dog
클래스는 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) 할 수 있다.
'게임 & 게임개발 > C# 기초' 카테고리의 다른 글
[C#기초] 인터페이스(Interfaces)란 무엇인가 (2) | 2024.04.25 |
---|---|
[C#기초] 추상(abstract) 클래스와 메서드 (0) | 2024.04.25 |
[C#기초] 프로퍼티(Property)와 Get, Set 메서드 💊 (0) | 2024.04.23 |
[C#기초] 접근 제한자(Access Modifier)란 무엇일까? (0) | 2024.04.22 |
[C#기초] 클래스 생성자(Class Constructor)란 무엇일까? (0) | 2024.04.21 |