#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");
}
}
{
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()");
}
}
{
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()");
}
}
{
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멤버에도 접근할 수 있다. 은닉성과는 거리가 먼 특징을 지니
댓글 쓰기