반응형
Virtual
- virtual은 재정의(override)가 선택사항이다.
- virtual 키워드가 포함된 클래스는 인스턴스화가 가능하다.
- 상속할 때 어떻게 할 것인지의 문제와 결부되어 있으므로 상속을 염두에 둔 클래스에 적용한다.
- 일반 메소드는 new를 통해 재정의할 수 있지만 부모 클래스를 기반으로 자식을 인스턴스화하면 부모 메소드가 나온다.
- 일반 메소드와 달리 override를 통해 재정의하면 부모 클래스를 기반으로 자식을 인스턴스화하더라도 제대로 자식 메소드가 나온다.
버추얼 메소드와 일반 메소드의 상속 차이
// Online C# Editor for free
// Write, Edit and Run your C# code using C# Online Compiler
using System;
public class HelloWorld
{
class A {
public A(){}
public void NormalMethod(){
Console.WriteLine (" 부모의 보통 메소드");
}
public virtual void VirtualMethod(){
Console.WriteLine (" 부모의 버추얼 메소드");
}
}
class B : A {
public B(){}
new public void NormalMethod(){
Console.WriteLine (" 자식의 재정의한 보통 메소드");
}
public override void VirtualMethod(){
Console.WriteLine (" 자식의 오버라이드한 버추얼 메소드");
}
}
public static void Main(string[] args)
{
Console.WriteLine("B b");
B bb = new B();
bb.NormalMethod();
bb.VirtualMethod();
// ---------------
Console.WriteLine("A a");
A a = new A();
a.NormalMethod();
a.VirtualMethod();
// ---------------
Console.WriteLine("A <- b");
A abb = bb;
abb.NormalMethod();
abb.VirtualMethod();
// ---------------
Console.WriteLine("A b");
A ab = new B();
ab.NormalMethod();
ab.VirtualMethod();
// 에러 : An explicit conversion exists (are you missing a cast?)
// B ba = new A();
// ba.NormalMethod();
// ba.VirtualMethod();
}
}
Abstract
- abstract는 자식 클래스에서 반드시 재정의해야 한다.
- 필드 혹은 메소드에 abstract를 사용하려면 클래스도 abstract여야 한다.
- abstract 클래스라고 해서 구성요소까지 모두 abstract여야만 하는 것은 아니다.
- abstract 클래스는 인스턴스화할 수 없다.
interface
- abstract와 달리 interface는 다중 상속이 가능하다.
- abstract가 아닌 필드는 정의할 수 없다.
- 정의만 있고 구현 내용이 없다.
- 접근 제한자를 사용할 수 없으며 모든 필드는 public이 적용된다.
- interface는 상속의 개념이 아니라 기능을 탑재하는 개념이다. Has-A not Is-A.
반응형
'C#' 카테고리의 다른 글
[C#] 박싱(Boxing)과 언박싱(Unboxing) (0) | 2022.09.10 |
---|---|
[C#] 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)의 이해 (0) | 2022.09.10 |
[C#] const와 readonly 차이 (0) | 2022.09.10 |
[C#] ref, in, out, params (1) | 2022.09.10 |
[C#] 메소드 재정의 (0) | 2022.08.30 |
댓글