본문 바로가기
  • Always Awake
프로그래밍,Tools/Unity,C#

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

by NerdyBoy 2022. 4. 3.

C# 에서 상속을 사용할 때 Abstract, Virtual 한정자가 뭐가 다른지 항상 헷갈릴 수 있다.

오늘은 이들을 명확하게 정리 해본다.

 


 

1. Virtual(가상)

virtual 한정자는 메서드, 속성, 인덱서 또는 이벤트 선언을 한정하는데 사용한다. 

  • 파생된 클래스에서 재정의(Override)를 할 수 있는데, 이를 필수적으로 재정의 할 필요는 없다(선택 가능)
  • 객체 생성이 가능하다.

아래 예시에서는 Employee 클래스를 상속 받아 객체를 생성하는 과정에서 virtual 한정자를 달고있는 메서드를 그대로 사용한다.

public class Employee
{
   protected virtual void Salary()
   {
        Debug.Log("None");
   }
}
 
public class Programmer : Employee
{
    protected override void Salary()
    {
        base.Salary();
    }
}

Programmer _programmer = new Programmer(); 
_programmer.Salary();//"None"

 

 

2. Abstract(추상)

abstract 한정자는 클래스, 메서드, 속성, 인덱서 및 이벤트에 사용할 수 있다. 여러 클래스에서 공유할 기본적인 정의를 지정

  • 추상 클래스는 자체적으로 구현이 불가능 하고, 파생 클래스에서 반드시 구현해야 한다.
  • 인스턴스화(객체 생성)가 불가능하다.

추상 클래스(abstract class) 는 구현이 불가능 하며, 추상 클래스를 상속받는 파생 클래스는 반드시 추상 클래스의 추상 메서드와 접근자의 실제 구현을 해야한다. 또한 추상 메서드(abstract method)는 추상 클래스 내에서만 선언될 수 있다.

 

아래는 추상클래스 Employee의 추상 메서드 Salary를 구현하는 예시이다.

public abstract class Employee
{
    public abstract void Salary();
    
}
 
public class Programmer : Employee
{
    public override void Salary()
    {
        Debug.Log("None");
    }
}
 
  Programmer _programmer = new Programmer();
  _programmer.Salary();//"None"

 

 

3. Interface(상속)

인터페이스에는 메서드, 속성, 이벤트 또는 인덱서의 시그니처만 포함된다. 인터페이스를 구현하는 클래스는 인터페이스에 사용된 멤버를 구현해야 한다. 여러 클래스에 공통적인 기능을 추가하기 위해 사용

 

  • 멤버필드(변수)를 사용할 수 없지만, 프로퍼티는 사용 가능
  • 접근제한자는 public 만 사용가능
  • 구현 불가능
  • 멤버에는 접근자, 한정자 지원되지 않는다

아래는 인터페이스 'Employee' 를 구현하고 테스트 하는 예시이다.

public interface Employee
{
    void Salary();
    string Name{ get; set;}	  
}

class Programmer : Employee
{
    private string name;
 	
    public void Salary()
    {
   		Debug.Log("None");
	}
    
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
}
 
Programmer _firstProg = new Programmer();
_firstProg.Name = "Won";
_firstProg.Salary();//"None"

 

 


 

오늘은 헷갈리는 한정자의 용도를 정리해 보았다.

어떤 한정자를 사용하느냐는 그 용도에 따라 달라지는데,

외운다고 될 것이아닌, 사용해보면서 익숙해지는게 가장 좋은 방법인것 같다.

댓글