카테고리 없음

[3.17] abstract 키워드

ljw4104 2021. 3. 17. 15:12
abstract class Shape
{
    public abstract int GetArea();
}

추상 클래스 (Abstract class)

  • '불완전'한 클래스라고 생각하는게 제일 쉽다.
  • 클래스 앞에 'abstract'이라는 키워드를 붙혀 추상클래스로 만든다.
  • '불완전'한 클래스이기 때문에 인스턴스화 할 수 없다. 추상 메서드를 선언했으면 상속받는 클래스는 반드시 구현해야 한다.
  • 추상 메서드 선언은 추상 클래스에서만 허용된다. 또한 추상 메서드는 본문이 없다.
  • 추상 메서드에서 static 또는 virtual을 사용하는 것은 오류이다. 하지만 자식 클래스에서의 override는 붙인다.

 

예제

TerranUnit 클래스는 추상 클래스이다.

using System;

namespace Study07
{
    public class App
    {
        public App()
        {
            Wraith wraith = new Wraith();
            wraith.Cloak();
            wraith.Attack();
            wraith.UnCloak();

            Ghost ghost = new Ghost();
            ghost.Cloak();
            ghost.Attack();
            ghost.UnCloak();
        }
    }
}
using System;

namespace Study07
{
    interface Cloaking
    {
        void Cloak();
        void UnCloak();
    }
}
using System;

namespace Study07
{
    public abstract class TerranUnit : Cloaking
    {
        public abstract void Attack();
        public abstract void Cloak();
        public abstract void UnCloak();
    }
}
using System;

namespace Study07
{
    public class Wraith : TerranUnit
    {
        private bool isCloak;
        public Wraith()
        {
            Console.WriteLine("Wraith 생성자.");
        }

        public override void Attack()
        {
            Console.WriteLine("레이스가 공격합니다.");
        }

        public override void Cloak()
        {
            isCloak = !isCloak;
            Console.WriteLine("투명상태가 되었습니다.");
        }

        public override void UnCloak()
        {
            isCloak = !isCloak;
            Console.WriteLine("투명상태가 풀렸습니다.");
        }
    }
}
using System;

namespace Study07
{
    public class Ghost : TerranUnit
    {
        private bool isCloak;
        public Ghost()
        {
            Console.WriteLine("Ghost 생성자.");
        }
        public override void Attack()
        {
            Console.WriteLine("고스트가 공격합니다.");
        }

        public override void Cloak()
        {
            isCloak = !isCloak;
            Console.WriteLine("고스트가 투명상태가 되었습니다.");
        }

        public override void UnCloak()
        {
            isCloak = !isCloak;
            Console.WriteLine("고스트의 투명상태가 풀렸습니다.");
        }
    }
}