오늘은 추상 클래스에 대해 알아보쟈!

abstract class(추상클래스)가 뭐야? 🧐

인터페이스가 Can Do를 알려주는 역할이라면 추상클래스는 분류(category)를 알려주는 클래스다.

💚 예시 (내가 이해한 방식)

인터페이스에서 이야기했던 예시를 이어가자면, 앵무새와 참새, 펭귄 그리고 슈가 글라이더는 각자 객체를 가질 수 있다. 하지만 앵무새,참새 그리고 펭귄을 포함하는 조류, 슈가 글라이더를 포함하는 포유류라는 것은 객체가 없는, 추상적인 분류(category)의 개념이다. 추상클래스 안에 추상메소드는 인터페이스와 같은 역할이라고 생각하면된다. 즉, “이러한 분류(추상클래스)에 속하는 객체들은 이러한(추상메소드)것에 반드시 반응해야한다.” 라는 계약이 생긴다.

🍑 위의 내용을 추가로 코드를 수정해보자

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public abstract class Animal//동물이라는 카테고리를 표현
{
    private bool isAlive = true;//추상클래스는 필드를 가질 수 있다.

    public abstract void Eat();//추상메소드: 자식클래스에서 모두 구현을 해주어야함!

    public virtual void Die()//일반 메소드: 추상클래스는 일반 메소드 또한 가질 수 있다.
    {
        isAlive = false;
    }
}

public abstract class Birds : Animal//동물이라는 카테고리 속 조류라는 카테고리
{
    protected Birds(Beak beak)
    {
        this.beak = beak;
    }
    public Beak beak { get; private set; }
}

public class Sparrow : Birds, IFly//조류에 속하는 참새 객체 
{
    public Sparrow(Beak beak) : base(beak)
    {
    }
    public void Fly()
    {
        Console.WriteLine("포로록~ 참새 난다~");
    }
    public override void Eat()
    {
        Console.WriteLine("참새 쌀알 먹는다. 콕콕!");
    }
}

public class Parrot : Birds, IFly//조류에 속하는 앵무새 객체
{
    public Parrot(Beak beak) : base(beak)
    {
    }
    public void Fly()
    {
       Console.WriteLine("푸드덕~ 앵무새 난다~");
    }
    public override void Eat()
    {
        Console.WriteLine("츄릅~ 앵무새 메뚜기 먹는다!");
    }
}

abstract class(추상클래스)의 특징은? 🧐

  • 클래스 안에 추상메소드가 하나라도 존재한다면, 그 클래스는 반드시 추상클래스여야한다.
  • 추상클래스: abstract class ["클래스 이름"], 추상메소드: abstract ["반환타입"] ["메소드 이름"]( ["파라미터"] )로 표현한다.
  • 추상메소드는 내부가 구현되지않은 상태여야한다. (이전에 포스팅했던 인터페이스가 추상메소드만으로만 이루어진 것)
  • 접근한정자를 정해주지않으면 private 디폴트 값이다.
  • 필드와 일반메소드 모두 가지고 있을 수 있다.(인터페이스와 가장 큰 차이점 중 하나)
  • 다른 일반 클래스와 마찮가지로 다중상속이 불가능하다.
  • 인터페이스와 마찮가지로 인스턴스가 불가능하다.

** 다음 포스팅은 일반 클래스와 상속에 대해서 다루겠다!