OOP개념에서 상속을 이야기할 때 Virtual이나 Abstract 한정자가 사용이됩니다.
두개를 사용하면서 헷갈리는 점을 정리했습니다. 또한 Interface와 비슷한 기능을 제공하는데
같이 비교해보겠습니다.
1.Virtual ( 가상 키워드 )
virtual 키워드는 메서드,속성, 인덱서 또는 이벤트 선언을 한정하는데 사용됩니다.
파생 클래스에서 필요에 따라서 재정의(override) 할 수 있지만 필수적으로 재정의 할 필요는 없습니다.
Virtual 한정자를 사용한 클래스는 완벽한 기능을 제공할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class Animal { public virtual void Speak() { Console.WriteLine("Nothing!"); } } public class Dog : Animal { public override void Speak() { Console.WriteLine("멍멍!"); } } Dog temp = new Dog(); temp.Speak();//멍멍! | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public abstract class Animal { public abstract void Speak(); } public class Dog : Animal { public override void Speak() { Console.WriteLine("멍멍!"); } } Dog temp = new Dog(); temp.Speak();//멍멍! | cs |
3.Interface (인터페이스)
인터페이스는 abstract와 비슷하지만 멤버필드(변수)를 사용할 수 없습니다. 대신에 프로퍼티는 사용이 가능합니다.
인터페이스는 보통 여러클래스에 공통적인 기능을 추가하기 위해서 사용합니다.
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 31 32 33 34 35 36 37 | public interface Animal { void Speak(); string Name { get; set; } } class Dog : Animal { private string name; public void Speak() { Console.WriteLine(name + "->멍멍!"); } public string Name { get { return name; } set { name = value; } } } Dog temp = new Dog(); temp.Name = "흰둥이"; temp.Speak(); //흰둥이->멍멍! | cs |
4.결론
-Vritual은 하나의 기능을 하는 완전한 클래스이며, 파생클래스에서 상속해서 추가적인 기능추가 및 virtual 한정자가 달린 것을 재정의해서
사용가능합니다.
-Abstract는 여러개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의만 하고 ,파생클래스에서 abstract 한정자가 달린 것을
모두 재정의(필수)해야 합니다.
-Interface에서도 abstract와 비슷하지만 멤버변수를 사용할 수 없습니다.
보통 abstract는 개념적으로 계층적인 구조에서 사용이 되며(동물이나 어떤 사물의 계층적인 구조가있을때) Interface는 서로다른 계층이나
타입이라도 같은기능을 추가하고 싶을때 사용합니다.(사람이나 기계가 말을하게(speak)하는 인터페이스를 추가할때)
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 델리게이트 ( delegate , 대리자 ) (0) | 2015.04.22 |
---|---|
[C#] Dispose VS Finalize (0) | 2015.04.14 |
[C#] Using 사용 (0) | 2015.04.01 |
[C#] string 과 StringBuilder 사용 (1) | 2015.03.31 |
[C#] 박싱 과 언박싱 (Boxing & UnBoxing) (0) | 2015.03.30 |