가상 메서드 (Virtual)
- 가상 메서드는 기본적으로 부모 클래스에서 정의되고 자식 클래스에서 재정의 할 수 있는 메서드
- 자식 클래스에서 부모 클래스의 메서드를 변경하거나 확장할 수 있음
- virtual을 사용해서 부모 클래스에서 정의, 자식 클래스에서 override로 재정의 가능
ex) virtual : "자식 클래스에서 재정의를 했을 수도 있어. 실형태에 재정의가 되어있는지 확인해봐. 없으면 이거 써!"
override : "여기 재정의 했어."
public class Unit
{
public virtual void Move()
{
Console.WriteLine("두발로 걷기");
}
public void Attack()
{
Console.WriteLine("Unit 공격");
}
}
public class Marine : Unit
{
}
public class Zergling : Unit
{
public override void Move()
{
Console.WriteLine("네발로 걷기");
}
}
// 사용 예시
// #1 참조형태와 실형태가 같을때
Marine marine = new Marine();
marine.Move(); // "두발로 걷기"
marine.Attack(); // "Unit 공격"
Zergling zergling = new Zergling();
zergling.Move(); // "네발로 걷기"
zergling.Attack(); // "Unit 공격"
// #2 참조형태와 실형태가 다를때
List<Unit> list = new List<Unit>();
list.Add(new Marine());
list.Add(new Zergling());
foreach (Unit unit in list)
{
unit.Move(); // "두발로 걷기", "네발로 걷기"
}
* virtual, override를 사용하지 않으면 List<unit> 사용 시, 부모 클래스의 함수가 호출 된다.
추상 메서드 (Abstract)
- 직접적으로 인스턴스를 생성할 수 없는 클래스
- 주로 상속을 위한 베이스 클래스로 사용됨
- abstract 키워드를 사용으로 선언, 추상 메서드를 포함할 수 있음
- 추상 메서드는 구현부가 없는 메서드로, 자식 클래스에서 반드시 override로 구현되어야 함
ex) abstract : "난 가진게 없어. 뼈대뿐이야. 자식 클래스꺼 써!"
abstract class Shape
{
public abstract void Draw();
}
class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a circle");
}
}
class Square : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a square");
}
}
class Triangle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a triangle");
}
}
// 사용 예시
List<Shape> list = new List<Shape>();
list.Add(new Circle());
list.Add(new Square());
list.Add(new Triangle());
foreach (Shape shape in list )
{
shape.Draw();
}
'C#' 카테고리의 다른 글
제너릭 (0) | 2023.11.08 |
---|---|
오버로딩(overloading)과 오버라이딩(overriding) (0) | 2023.11.08 |
프로퍼티 (Property) (0) | 2023.11.08 |
접근 제한자 (public, private, protected) (0) | 2023.11.08 |
객체지향 프로그래밍의 특징 (0) | 2023.11.08 |