반응형
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"
오늘은 헷갈리는 한정자의 용도를 정리해 보았다.
어떤 한정자를 사용하느냐는 그 용도에 따라 달라지는데,
외운다고 될 것이아닌, 사용해보면서 익숙해지는게 가장 좋은 방법인것 같다.
반응형
'프로그래밍,Tools > Unity,C#' 카테고리의 다른 글
[Unity] 유니티 UI 캔버스(Canvas) 해상도 조절하기 (0) | 2022.05.16 |
---|---|
[Unity] 레이캐스트(Raycast) 사용 시 out 키워드의 의미 (0) | 2022.04.12 |
[Unity] 유니티와 깃허브(GitHub) 연동하기 2 -메타파일 표시, .gitignore 편집 (2) | 2022.03.30 |
[Unity] 유니티와 깃허브(GitHub) 연동하기 1 (0) | 2022.03.29 |
[Unity] 3D 모델 다운로드/이용 가능한 사이트 정리 (0) | 2022.03.28 |
댓글