메서드 오버라이드는 일반적으로 virtual 메서드를 정의한 부모 클래스에서 해당 메서드의 기본적 기능을 구현하고
자식 클래스에서는 override 예약어를 사용해 그 기능을 재정의 하는것이다.
또한 부모, 자식 클래스는 new 를 이용해 인스턴스를 생성하는 것이 가능하다.
하지만 부모 클래스의 인스턴스를 생성하지 못하게 막고, 특정 메서드에 대해 반드시 재정의 하도록 강제하고 싶을 때가 있을 수 있다.
추상 클래스와 추상 메서드는 이와 같은 상황을 위해 존재한다.
먼저 추상 메서드는 abstract 예약어를 통해 지정한다.
그리고 구현 코드가 없는 메서드를 말한다.
추상 메서드는 일반 클래스에 존재할 수 없다. 반드시 추상클래스 안에서만 선언이 가능하다.
abstact 예약어가 지정된 추상 메서드를 다른말로 하자면 "코드가 없는 가상 메서드" 라고 이해하면 된다.추상 메서드는 접근 제한자로 private를 지정할 수 없다. 추상 메서드는 반드시 자식 클래스에서 재정의 되어야 한다는 점을 감안해 보면 이는 상식적으로 이해할 수 있다.
추상 클래스는 abstact 예약어가 지정돼 있다는 점을 제외하면 일반 클래스 정의와 완전히 동일하다.
이 예약어로 인해 일반 클래스와 차별되는점은 두가지가 있다.
1. new를 사용해 인스턴스로 만들 수 없다.
2. 추상 메서드를 가질 수 있다.
이뿐이다.
추상 메서드가 new를 이용해 인스턴스화 할 수 없는 이유는 추상 클래스는 내부에 구현 코드가 없는 메서드, 즉 추상 메서드가 있기 때문이다.
추상 클래스가 new를 통해 존재한다면 추상 메서드를 호출하는 경우 어떤 식으로 동작하는지 예측을 할 수가 없다.
추상 클래스에 반드시 추상 메서드가 들어가야 하는 것은 아니지만, new를 이용해 인스턴스화 할 수 없다.
using System;
namespace Project2
{
class Point
{
int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public override string ToString()
{
return "X : " + x + ", Y : " + y;
}
}
abstract class DrawingObject
{
public abstract void Draw();
public void Move()
{
Console.WriteLine("Move");
}
}
class Line : DrawingObject
{
Point pt1, pt2;
public Line(Point pt1, Point pt2)
{
this.pt1 = pt1;
this.pt2 = pt2;
}
public override void Draw()
{
Console.WriteLine("Line " + pt1.ToString() + " ~ " + pt2.ToString());
}
}
class Class1
{
public static void Main(String[] args)
{
DrawingObject line = new Line(new Point(10, 10), new Point(20, 20));
line.Draw();
}
}
}
물론 코드가 비어 있는 가상 메서드와 일반 클래스를 조합해서 사용해도 좋다.
단지 가상 메서드는 자식 클래스에서 재정의하지 않아도 컴파일 할 때 오류가 발생하지 않지만 추상 메서드는 반드시 자식 클래스에서 반드시 재정의 해야 한다.
'C# > 책 정리' 카테고리의 다른 글
C# 정리 ) 콜백 메서드 (0) | 2021.12.07 |
---|---|
C# 정리 ) 델리게이트 (0) | 2021.12.05 |
C# 정리 ) 중첩 클래스 (0) | 2021.12.05 |
C# 정리 ) 클래스 간의 형변환 (0) | 2021.12.05 |
C# 정리 ) 메서드 오버로드, 연산자 오버로드 (0) | 2021.12.04 |
댓글