티스토리 뷰

C#

4. 클래스(4) - 오버라이딩

루체도 2020. 1. 29. 21:50

객체 지향 프로그래밍에서 다형성은 객체가 여러 형태를 가질 수 있음을 의미한다.

다형성은 하위 형식 다형성의 준말이다. 이 말은 자신을 상속받아 만들어진 파생 클래스를 통해 다형성을 실현한다는 것

적절한 예인지는 모르지만 간단한 예를 들어 보겠다. 스타크래프트의 종족 클래스인 Kind 클래스에 Initialize 메소드를

가지고 있다.

class Kind
{
  public virtual void Initialize()
  {
  	Console.WriteLine("Start Game");
  }
}

이 Kind 클래스는 저그, 프로토스, 테란으로 파생될 수 있다.

그리고 게임을 시작할 때 각각 드론, 프로브, SCV를 가지고 시작한다.

class Zerg
{
  public override void Initialize()
  {
    base.Initialize();
    Console.WriteLine("Drone Get");
  }
}

class Protoss
{
  public override void Initialize()
  {
    base.Initialize();
    Console.WriteLine("Probe Get");
  }
}

메소드 오버라이딩을 하기 위해서는 오버라이딩 할 메소드가 virtual 키워드로 한정되어 있어야 한다는 것이다.

그리고 파생 클래스에서 오버라이딩하기 위해서는 컴파일러에게 메소드를 재정의했다고 알려줘야 하기 때문에

override로 한정해줘야 한다. 

주의할 점으로는 private으로 선언을 한 메소드는 재정의를 할 수가 없다.

 

오버라이딩 봉인

기반 클래스에서 virtual로 선언된 메소드를 파생 클래스에서 오버라이딩을 했다.

이 파생 클래스를 또 상속받아 새로운 파생클래스를 만드려고 할 때 오버라이딩을 하지 못하도록 막을 수가 있다.

이렇게 하려면 sealed라는 키워드를 사용하면 된다.

class Base
{
  public virtual void SealMe() {}
}

class Derived : Base
{
  public sealed override void SealMe() {}
}

class WantToOverride : Derived
{
  public override void SealMe() {}
}

//이렇게 작성을 하고 실행을 하면 컴파일 오류가 난다.

봉인 메소드는 파생 클래스의 작성자를 위한 기반 클래스 작성자의 배려이다.

혹시라도 상속받은 메소드를 오버라이딩 했는데 클래스의 다른 부분들이 오작동을 하는 것을 막기 위해

오버라이딩하는 것을 막는 것이다.

 

중첩 클래스

클래스 안에 클래스 하나를 더 선언하는 것이다.

class OutClass
{
 class InClass
 {
 
 }
}

중첩 클래스를 선언하는 방법은 위처럼 간단하다. 객체를 생성하고 메소드를 호출하는 방법도 보통의 클래스와 같다.

한가지 다른 클래스와 다른 점은 자신이 소속되어 있는 클래스의 멤버에 자유롭게 접근할 수 있다는 것이다.

private 멤버에도 접근할 수 있다. 다음은 중첩 클래스에서 자신이 소속된 클래스의 멤버에 접근하는 예제이다.

class OutClass
{
  private int Number1;
 class InClass
 {
   public void Example()
   {
     OutClass out = new OutClass();
     out.Number1 = 10;
   }
 }
}

중첩 클래스를 사용하는 이유는 다음과 같다.

 1. 클래스 외부에 공개하고 싶지 않은 형식을 만들고자 할 때

 2. 현재의 클래스의 일부분처럼 표현할 수 있는 클래스를 만들고자 할 때

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함