C#

가상 메서드 (Virtual), 추상 메서드(Abstract)

잼잼재미 2023. 11. 8. 15:48

가상 메서드 (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