[C#] Abstract Class - 추상 클래스

PIAZZI·2024년 4월 25일

C#

목록 보기
4/9
post-thumbnail

Abstract Class - 추상 클래스

시작하기 전에 추상이란 단어에 대해 짚고 넘어가보자.

  • 추상
    1. 어떤 사물이 직접 경험하거나 지각할 수 있는 일정한 형태와 성질을 갖추고 있지 않은.
    2. 구체성이 없이 사실이나 현실에서 멀어져 막연하고 일반적인.

이를 토대로 추상 클래스의 의미를 유추해보면

일정한 형태가 없는 구체적이지 않은 클래스

조금 더해서 말해보자면 완성되지 않은 클래스라 생각할 수 있다.

Q. 완성되지 않을 클래스라는게 무슨 뜻인가?
A. 어떠한 기능을 사용하겠다고 선언은 하였지만, 선언만 했을 뿐 기능 구현 내용이 없는 클래스라는 뜻으로 볼 수 있다.


오늘의 단어 추상은 클래스가 아닌 메소드에도 붙을 수 있다.

Abstract Method - 추상 메소드

  • 선언 부분만 있고, 구현 부분이 없는 메소드
  • 정의가 되지않는 불완전한 메소드

위의 설명과 마찬가지로 완성되지 않은 메소드이다.
당연하게도 구현 부분이 없으니 쓸모가 없는 메소드이다.

그래서 만약 클래스가 이런 추상 메소드 하나라도 담고 있다면, 그 클래스추상 클래스가 된다!

그래서 만일 클래스 안에 추상 메소드가 있다면, 반드시 자식 클래스에서 구현을 해줘야 한다.


추상 클래스와 추상 메소드의 형태

abstract 키워드가 클래스 앞에 붙으면 추상 클래스, 메소드 앞에 붙으면 추상 메소드

형태는 아주 간단하다. 그냥 abstract가 붙어있는지 보면 알 수 있다.

추상 메소드의 형태

접근 지정자 abstract 데이터형 메소드_이름( );

  • 본체가 구현되어 있지 않기 때문에, 구체적인 동작을 정의하지 않고, 호출할 수도 없다.
  • 자식 클래스에서 반드시 재정의(오버라이딩)해야 하기에, 가상 메소드를 뜻하는 virtual을 붙이지 않아도 된다.
public abstract void Attack(); // Attack이라는 추상 메소드 선언. 물론 구현 내용은 없다.

추상 클래스의 형태

abstract class 추상 클래스 이름{ }

  • 클래스 선언시 abstract 키워드를 붙이면 추상 클래스라 부른다.
  • 또는 추상 메소드가 하나라도 포함되어 있다면 추상 클래스가 된다.

이 추상 클래스는 당연히 객체를 생성할 수 없다. (구체적인 동작이 정의되어 있지 않기 때문)
그래서 추상 클래스는 추상 클래스를 선언하고 선언한 추상 클래스를 상속받아 재정의하는 형태로 많이 쓰인다.

abstract class 추상_클래스_이름
{
	접근_지정자 abstract 데이터형 메소드_이름();
}

class 자식_클래스_이름 : 추상_클래스_이름
{
	접근_지정자 override 데이터형 메소드_이름()
    {
    	//메소드 기능
    }

}

예시를 들자면 다음과 같다.


abstract class Unit
{
	public abstract void Attack();
}

class Monster : Unit
{
	public override void Attack()
    {
    	//몬스터의 공격 기능 구현
    }
    
class Player : Unit
{
	public override void Attack()
    {
    	//플레이어의 공격 기능 구현
    }
}

조금만 더 추가해보자면,

abstract class Unit
{
	public abstract void Attack();
    public abstract void Move();
    public abstract void Drop_Item();
    
}

class Player : Unit
{	
	public override void Attack()
	{
    	Console.WriteLine("플레이어의 공격 구현")
    }
    
    public override void Move()
    {
    	Console.WriteLine("플레이어의 움직임 구현")
    }
    
    public override void Drop_Item()
    {
    	Console.WriteLine("플레이어의 드랍 아이템 구현")
    }
}

class Monster : Unit
{	
	public override void Attack()
	{
    	Console.WriteLine("몬스터의 공격 구현")
    }
    
    public override void Move()
    {
    	Console.WriteLine("몬스터의 움직임 구현")
    }
    
    public override void Drop_Item()
    {
    	Console.WriteLine("몬스터의 드랍 아이템 구현")
    }
}

이 예시를 보면 추상 클래스를 쓰는 이유를 어느정도 이해될 것이라 생각한다.

공통으로 주어진 메소드에서 각자 알맞게 기능을 구현해야 할 때 많이 사용된다.


위에서 추상 메소드하나라도 포함하면 추상 클래스가 된다고 했다.
이를 다르게 생각해보면, 추상 클래스라고 해도 모든 메소드추상 메소드는 아니라는 말이다.

abstract class Animal
{
	public void Eat_Pood() 		//사료를 먹는 기능이 구현된 메소드. - 추상 클래스가 아니며, 상속받는 모든 클래스에서도 동일하게 작동한다.
    {
    	Console.WriteLine("사료를 먹습니다.");
    }
    
    public abstract void Move(); 	//움직임 메소드만 추상 메소드로 선언 - 상속받는 모든 클래스는 새로 기능 구현을 해야한다.
    
}

class Dog : Animal
{	
	public void Eat_Pood() 		// Animal에서 이미 구현된 메소드가 들어있다.
    {
    	Console.WriteLine("사료를 먹습니다.");
    }
    
    public override void Move() 	// 여기서 본인만의 움직임을 구현해야한다.
    {
    	// 개의 움직임만 새로 구현
    }
}

class Cat : Animal
{	
	public void Eat_Pood()
    {
    	Console.WriteLine("사료를 먹습니다.");
    }
    
    public override void Move()
    {
    	// 고양이의 움직임만 새로 구현
    }
    
    public void Sleep() 	//상속 받은 것을 포함하고, 아예 새로 메소드를 만들 수도 있다.
    {
    	Console.WriteLine("고양이가 배불러서 낮잠을 잡니다.");
    }
}

추상 클래스와 비슷한 개념으로 [Interface - 인터페이스]가 존재하는데 이 또한 다음에 다루도록 하겠다.


개인적인 공부를 위해 정리한 내용이며, 틀린 점이 있을 수 있습니다.
만일 틀린 내용이 있다면, 댓글로 알려주시면 감사하겠습니다.

profile
범부에오

0개의 댓글