[C#] Virtual(가상) vs Abstract(추상) vs Interface(인터페이스)

|

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




2.abstract (추상 키워드 )

abstract 키워드를 사용하면 불완전하여 파생 클래스에서 구현해야하는 클래스 및 클래스 멤버를 만들수 있습니다.
추상클래스의 사용 목적은 여러개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의를 제공하는 것입니다. 
추상 클래스는 인스턴스화할 수 없습니다.

 
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
And