C# 클래스 (4)

#1. 오버라이딩과 다형성


객체 지향 프로그램의 특성 중에서 다형성(Polymorphism)이라는 것이 있다. 다형성이란 객체가 여러 형태를 가질 수 있음을 의미한다.

오버라이딩(Overriding)이라는 것은 재정의라는 뜻을 말한다.

부모 클래스가 가지고 있는 메소드를 자식 클래스에서 부모 클래스 메소드의 기능 + 자식 클래스 메소드의 기능을 사용하고자 할 때 오버라이딩을 한다.

조금 쉽게 정리를 좀 해보자.

부모 클래스의 이름:장갑
부모 클래스의 메소드: 장착하다()

자식클래스의 이름:총
부모 클래스의 메소드:장착하다()

총을 장착하기 위해서는 먼저 장갑을 장착해야 한다고 할 경우, 먼저 부모 메소드의 장착하다()메소드를 실행한뒤 자식 메소드에 있는 코드를 실행해야 한다.

class parent
    {
        public virtual void init()
        {
            Console.WriteLine("init complete");
        }
    }

    class childeone : parent
    {
        public override void init()
        {
            base.init();
            Console.WriteLine("childone init");
        }
    }

    class childtwo : parent
    {
        public override void init()
        {
            base.init();
            Console.WriteLine("childTwo init");
        }
    }

부모 클래스에서 오버라이딩 할 메소드 앞에 virtual 키워드를 붙여주게 되면 오버라이딩이 가능해진다.

이후 자식 클래스에서 부모클래스의 오버라이딩 된 메소드를 사용할 때는 메소드앞에 override키워드를 명시해준다.
private로 선언된 메소드를 오버라이딩 할 수 없다.

#2. 메소드 숨기기


    class bases
    {
        public void method()
        {
            Console.WriteLine("base.method()");
        }
    }
    class Derived : bases
    {
        public new void method()
        {
            Console.WriteLine("Dervied.method()");
        }
    }

메소드 숨기기란 CLR에게 부모 클래스에서 구현된 메소드를 감추고 자식 클래스의 메소드를 new키워드로 수식하면 된다. (생성자 호출시 new와는 다르다!!)

메소드 숨기기는 완전한 다형성을 표현하지 못하는 한계를 지니고 있다.

#3. 오버라이딩 봉인


c#에서는 메소드를 오버라이딩이 되지 않게 하기 위해서는 이를 봉인해주는 기능이 있다. 물론 봉인 가능한 메소드는 virtual키워드로 선언된 가상 메소드를 오버라이딩한 메소드만이 봉인이 가능하다. 봉인은 saaled키워드를 메소드앞에 붙여줌으로서 가능하다.

 class basesSealed
    {
        public virtual void method()
        {
            Console.WriteLine("base.method()");
        }
    }

    class DerviedSealed : basesSealed
    {
        public sealed void method()
        {
            Console.WriteLine("Derved.method()");
        }
    }

앞서 클래스 상속에서는 언급을 하지 않았지만 메소드가 아닌 클래스도 sealed 키워드를 이용해서 상속 봉인을 할수 있다. 이러한 클래스를 봉인 클래스라고 한다.

#4. 중첩 클래스

반복문이나 조건문을 할때 했었던 중첩과 마찬가지로 클래스 역시 중첩으로 쓰는 것이 가능하다. 클래스를 중첩으로 쓰는 이유는 일반적으로 아래와 같다.

ㅡ클래스 외부에 공개하고 싶지 않은 형식을 만들고자 할 때
ㅡ현재의 클래스의 일부분처럼 표현할 수 있는 클래스를 만들고자 할 때

class class_one
{
   class class_two
  { 

  }
}

여기서 class_two를 중첩 클래스라고 한다. 중첩 클래스는 자신이 소속되어 있는 클래스의 멤버에 자유롭게 접근이 가능하다.  심지어 private멤버에도 접근할 수 있다. 은닉성과는 거리가 먼 특징을 지니



Post a Comment

다음 이전