본문 바로가기
C#/책 정리

C# 정리 ) 추상 클래스

2021. 12. 5.

메서드 오버라이드는 일반적으로 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

댓글