본문 바로가기
유니티 공부/C# 문법

C# 문법 - 다형성(virtual, override)

by 코딩하는 돼징 2023. 4. 12.
반응형

 

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을 수강하고 정리한 글입니다.

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1/dashboard

반응형

댓글