반응형
class Pig
{
public void Eat()
{
Console.WriteLine("먹는다");
}
}
부모 클래스의 Eat()함수와 다르다는 것을 보여주기 위해 자식 크래스의 Eat() 함수 앞에 new를 붙여준다.
class PinkPig : Pig
{
public new void Eat()
{
Console.WriteLine("분홍돼지가 먹는다");
}
}
class BluePig : Pig
{
public new void Eat()
{
Console.WriteLine("파랑돼지가 먹는다");
}
}
PinkPig pinkpig = new PinkPig();
BluePig bluepig = new BluePig();
pinkpig.Eat();
bluepig.Eat();
각각의 해당하는 Eat함수가 실행됐음을 알 수 있다.
static void Eat(Pig pig)
{
pig.Eat();
}
Eat(bluepig);
우리가 Eat함수에 bluepig을 넣었음에도 불구하고 부모 클래스의 Eat()함수가 실행 됐음을 알 수 있다.
bluePig에 해당하는 Eat함수를 호출하기 위해 전 게시글에 있는 as를 사용하면 된다.
static void Eat(Pig pig)
{
BluePig bluepig = (pig as BluePig);
if(bluepig != null)
{
bluepig.Eat();
}
}
bluepig.Eat함수를 호출하기 위해서 매번 형변환을 체크하기 때문에 효율적이지 못하다.
그래서 다형성을 사용한다.
다형성(polymorphism)
1. virtual
부모 클래스에서 virtual를 사용해서 함수를 만들면 자식 클래스에서 함수를 재정의하는데 허용한다.
class Pig
{
public virtual void Eat()
{
Console.WriteLine("먹는다");
}
}
2. override
override를 사용하면 상속된 가상 속성을 자식 클래스에서 재정의 할 수 있다.
class PinkPig : Pig
{
public override void Eat()
{
Console.WriteLine("분홍돼지가 먹는다");
}
}
객체가 어떤 타입인지 런타임에 체크를 해가지고 그 타입에 맞는 버전의 함수를 호출한다.
static void Eat(Pig pig)
{
pig.Eat();
}
그러므로 BluePig에 해당되는 Eat함수가 호출된다.
Eat(bluepig);
부모의 함수를 같이 사용하고 싶을때 base을 사용하면 된다.
public override void Eat()
{
base.Eat();
Console.WriteLine("파랑돼지가 먹는다");
}
부모 함수도 같이 호출되는 것을 확인할 수 있다.
3. sealed
sealed가 있는 경우 본 자식까지만 override를 가능하게 하고 그 밑에 자식 클래스 부터는 override를 못하게 한다.
그림에서와 같이 밑의 자식이 override를 할려고 할 경우 봉인되어 있으므로 재정의 할 수 없다고 나온다.
본 게시글은 MMORPG Part1을 수강하고 정리한 글입니다.
반응형
'유니티 공부 > C# 문법' 카테고리의 다른 글
C# 문법 - abstract (0) | 2023.04.14 |
---|---|
C# 문법 - overloading(오버로딩) vs overriding(오버라이딩) (0) | 2023.04.12 |
C# 문법 - 클래스 형식 변환 (0) | 2023.04.12 |
C# 문법 - 은닉성(public, protected, private) (0) | 2023.04.12 |
C# 문법 - 상속성 (0) | 2023.04.11 |
댓글