말감로그

24.08.21 Unity_C# - 추상 클래스와 인터페이스 ,virtual 본문

TIL

24.08.21 Unity_C# - 추상 클래스와 인터페이스 ,virtual

habbn 2024. 8. 21. 15:23
728x90

추상 클래스와 인터페이스

추상클래스와 인터페이스는 객체지향프로그램에서 추상화를 통해 다형성과 코드 재사용을 가능하게 하지만 목적과 사용에 차이를 가지고 있습니다.

 

추상 클래스

추상 클래스는 일반적인 클래스와 동일하게 멤버변수와 메서드를 갖지만 추가적으로 "추상 메서드" 를 갖습니다.

추상 메서드는 메서드의 선언부만 존재하고 구현 코드가 없는 메서드를 말합니다.

public abstract class Animal
{
    // 추상 메서드 (구현 없음)
    public abstract void MakeSound();
    
    // 일반 메서드 (구현된)
    public void Sleep()
    {
    	Debug.Log("Sleeping...");
    }
}

 

구현부가 없는 메서드를 단 하나라도 가진 클래스는 추상 클래스가 됩니다. 추상 클래스가 되면 new 키워드를 사용하여 인스턴스화할 수 없습니다. 즉, 클래스를 쓸 수 없습니다. 

 

이 클래스를 사용하기 위해서는 다른 클래스가 이 추상 클래스를 상속받아야 합니다. 상속받은 자식 클래스가 부모 클래스에 존재하는 추상 메서드를 전부 오버라이딩하여 구현부를 작성하면 사용할 수 있는 객체가 됩니다.

public class Dog : Animal
{
    // 추상 메서드 구현
    public override void MakeSound()
    {
    	Debug.Log("왈왈");
    }
}

 

 

인터페이스

인터페이스는 클래스 간의 공통된 기능을 정의하는 데 사용됩니다.

추상 클래스의 특수형태로, 추상 클래스 중에서 멤버 변수와 메서드를 제거한 채 추상 메서드만을 남긴 형태가 인터페이스입니다. 

 

인터페이스도 마찬가지로 이를 구현한 자식 클래스에서 인터페이스의 추상 메서드를 모두 오버라이딩해야 비로소 객체로 사용할 수 있습니다. (추상 클래스나 인터페이스를 구현한 자식 객체가 추상 메서드를 전부 구현하지 않았다면 아예 컴파일이 되지 않습니다.)

 

추상 클래스는 클래스이기 때문에 다중으로 상속이 불가능하지만, 인터페이스의 경우 하나의 클래스가 여러 인터페이스를 가질 수 있고 , 가지고 있는 인터페이스의 모든 멤버에 대한 구현이 필요합니다.

public interface IMovable
{
    void Move();
}

public interface IAttackable
{
    void Attack();
}

public class Player : IMovable, IAttackable
{
    // IMovable 인터페이스 구현
    public void Move()
    {
        Debug.Log("Player is moving");
    }

    // IAttackable 인터페이스 구현
    public void Attack()
    {
        Debug.Log("Player is attacking");
    }
}

 

 

추상클래스 vs 인터페이스

- 추상 클래스는 구현된 메서드와 멤버 변수를 가질 수 있지만, 인터페이스는 오직 추상 메서드만 포함

- 추상 클래스는 단일 상속 , 인터페이스는 다중 상속

- 추상 클래스는 접근 제한자 사용, 인터페이스는 접근 제한자 사용x (오직 public)

 

추상 클래스는 기본적으로 클래스이며 이를 상속, 확장하여 사용하기 위한 것입니다. 

인터페이스는 해당 인터페이스를 구현한 객체들에 대한 동일한 사용방법과 동작을 보장하기 위해 사용합니다.

 

virtual 메서드

- 하나의 기능을 하는 완전한 클래스로, 파생 클래스에서 상속해서 기능 추가 및 재정의(오버라이딩)이 가능합니다.

 

 

728x90