[객체지향 프로그래밍] 7장-6 오버라이딩과 다형성

0

이것이 C#이다

목록 보기
13/26

7.10 오버라이딩과 다형성

객체지향에서 다형성은 객체가 여러 형태를 가질수 있음을 의미합니다. 다시말해, 자신으로부터 상속받아 만들어진 파생클래스를 통해 다형성을 실현한다는 겁니다.
다형성을 실현하는 방법으로 오버라이딩이 있습니다.

오버라이딩은 기반클래스에있는 메소드를 파생클래스에서 새롭게 재정의 하는 것을 의미합니다. 재정의를 하는 의미는 코드를 통일성있게 유지하면서 base키워드를 통해 기반클래스의 메소드도 불러와서 같은 작업을 할 수 있기 때문입니다.

class ArmorSuite
{
	//virtual을 사용하여 오버라이딩 준비
	public virtual void Initialize()
    {
    	Consol.WriteLine("아머 초기작업 완료됨");
    }
}

class IronMan : ArmorSuite
{
	//오버라이드 키워드로 오버라이딩된 함수임을 밝힘.
	public override void Initialize()
    {
    	//base로 기반클래스의 Initialize를 불러올수있음
    	base.Initialize();
        Console.WriteLine("리펄서 레이저 탑재됨");
    }
}

class warMachine : ArmorSuite
{
	public override void Initialize()
    {
    	//base로 기반클래스의 Initialize를 불러올수있음
    	base.Initialize();
        Console.WriteLine("더블베럴 캐논 탑재됨");
    }
}

7.11 sealed 키워드로 오버라이딩 봉인하기

클래스를 상속이 안 되도록 봉인하는 것처럼,
메소드도 오버라이딩 되지 않도록 sealed키워드를 이용해서 봉인할 수 있습니다.
오작동 위험이 있거나 잘못 오버라이딩함으로써 발생할수있는 문제가 예상 된다면,이렇게 봉인 메소드를 이용해서 상속을 사전에 막는것이 낫습니다.

7.12 메소드 숨기기

메소드 숨기기란, 기반클래스에서 구현된 버전의 메소드를 감추고 파생 클래스에서 구현된 버전만 보여주는 것을 말합니다.
메소드 숨기기는 파생클래스 버전의 메소드를 new 한정자를 수식함으로써 할 수 있습니다.(생성자를 호출할때 사용하는 new 연산자와는 전혀 다른 키워드 입니다.)

class Base
{
	public void MyMethod()
    {
    	Console.WriteLine("Base.MyMethod()");
    }
}

class Derived : Base
{
	//Base.MyMethod()를 감추고 Derived 클래스에서 구현된 MyMethod()만 노출합니다.
	public new void MyMethod()
    {
    	Console.WriteLine("Derived.MyMethod()");
    }
}

Derived derived = new Derived();
derived.MyMethod();

메소드 숨기기는 기반클래스에서 아무 생각없이 메소드를 구현해도 파생클래스에서 오버라이딩을 구현한듯한 효과를 얻을수있습니다.

하지만,메소드 숨기기는 말그대로 메소드를 숨기고 있을 뿐이고 아래와 같은 방법으로 Base.MyMethod 메소드를 실행 할수있습니다. 이러한 방식은 간단하게 오버라이딩 효과를 볼수있지만 실수를 통해 잘못된 메소드를 불러올수있는(잠재적 오류)
코드입니다.

Base baseOrDerived = new Derived();
baseOrDerived.MyMethod(); //Base.MyMethod()실행됨

0개의 댓글