내일배움캠프

내일배움캠프 11일차: 추상 클래스

pracumj 2024. 9. 26. 23:30

오늘의 공부 📝

오늘은 추상 클래스 개념이 헷갈려 집중적으로 공부하였다. 추상 클래스는 공통적인 기능을 제공하면서도, 특정 기능에 대해서는 자식 클래스가 반드시 구현하도록 강제하는 개념이다. 추상 클래스는 인스턴스화할 수 없고, 상속을 통해서만 사용된다. 또한, 추상 메서드를 통해 자식 클래스에서 해당 메서드를 반드시 구현하게 강제하며, 이를 구현하지 않으면 컴파일 오류가 발생한다.

 

추상 클래스 (Abstract Class)란?

추상 클래스는 공통적인 기능을 제공하면서, 구체적인 동작이 필요한 부분은 자식 클래스에서 구현을 강제하는 개념이다. 추상 클래스 자체는 인스턴스화할 수 없으며, 반드시 상속을 통해 사용이 된다. 추상 메서드를 통해 자식 클래스가 해당 메서드를 반드시 구현하도록 강제할 수 있으며, 만약 자식 클래스에서 이를 구현하지 않으면 컴파일 오류가 발생한다

  • 공통 기능 제공: 추상 클래스는 공통적인 기능(메서드, 속성)을 자식 클래스에서 사용할 수 있다.
  • 구현 강제: 추상 메서드를 통해 자식 클래스가 특정 메서드를 반드시 구현하도록 강제할 수 있다.
  • 기본 구현 제공 가능: 추상 클래스는 추상 메서드 외에도 구현이 포함된 메서드를 가질 수 있다.
  • 필요시 재정의 가능: 필요할 경우 자식 클래스가 재정의할 수 있는 메서드는 virtual로 정의하여, 공통적인 기능을 제공하되 자식 클래스에서 선택적으로 수정할 수 있다

  •  
  •  
abstract class Character
{
    // 공통된 기능: 모든 캐릭터가 걷는 기능은 동일하고 재정의 불가능
    public void Walk() => Console.WriteLine("Walking");
    
    // 공통된 기능: 자식 클래스에서 필요하면 재정의 가능
    public virtual void Talk() => Console.WriteLine("Talking");
    
    // 구현 강제: 공격 방식은 자식 클래스마다 다르게 정의해야 함
    public abstract void Attack();
}

class Warrior : Character
{
    // Warrior의 공격 방식
    public override void Attack() => Console.WriteLine("Warrior swings sword!");

    // Warrior의 말하기 방식 재정의
    public override void Talk() => Console.WriteLine("Warrior talks about battles.");
}

class Mage : Character
{
    // Mage의 공격 방식
    public override void Attack() => Console.WriteLine("Mage casts fireball!");

    // Mage는 기본 말하기 방식
}

 

  • Walk(): virtual 없이 정의된 메서드로, 모든 자식 클래스에서 동일하게 사용되며 재정의 불가능
  • Talk(): virtual로 정의된 메서드로, 자식 클래스에서 필요할 경우 재정의 가능하며, 재정의하지 않으면 부모 클래스의 구현을 따름
  • Attack(): 추상 메서드로, 자식 클래스에서 반드시 구현

이렇게 공통적으로 사용할 부분필요에 따라 재정의할 수 있는 부분을 구분하여, 자식 클래스의 동작을 효율적으로 관리할 수 있다.

 

언제 사용하는가?

  • 자식 클래스들이 공통적으로 사용하는 기능이 있지만, 구체적인 일부 동작은 각 자식 클래스에서 구현해야 할 때.
  • 기본적인 동작과 자식 클래스에서 꼭 재정의해야 하는 동작을 모두 포함하려고 할 때.

마무리 😺

처음에는 추상 클래스의 개념이 다소 헷갈렸지만, 사용 사례를 통해 공부하면서 그 구조와 목적을 명확하게 이해할 수 있었다. 특히, 공통적인 기능을 제공하면서도 특정 기능을 자식 클래스에서 반드시 구현하도록 강제하는 방식이 어떻게 유연한 설계를 가능하게 하는지 알게 되었다. 이 개념은 앞으로 객체 지향 설계에서 매우 유용하게 사용할 수 있을 것 같다. 추상 클래스를 통해 코드의 일관성과 확장성을 더욱 확보할 수 있도록 노력 해야겠다.