인터페이스
인터페이스란?
본래 프로그래밍 언어에서는 중요한 개념이 하나 존재한다. 같은 구문이 두 가지 이상의 의미로 해석될 여지가 있어서는 안 된다라는 것이다. 이러한 모호성을 해결하기 위해 만약 예약어가 겹치는 경우 어느 라이브러리의 예약어인지를 추가로 작성을 해줘야 한다.
이러한 이유로 다중 상속은 본래 불가능하지만 가끔 필요한 경우가 존재한다. 이러한 경우를 해결하기 위해 도입 된 것이 바로 인터페이스이다.
인터페이스는 interface 키워드를 이용하여 선언이 가능하다. 그러나 몇가지 제한사항이 존재하는데,
1. 인터페이스는 추상 메서드와 상수만을 포함한다.
2. 접근 제한자는 모두 public이고, 인터페이스를 상속받은 클래스에게 오버라이드를 강제한다.
3. 상속받은 클래스에서 구현하는 메서드도 모두 public으로 수식해야 한다.
4. 인터페이스는 클래스가 여러개를 상속받을 수 있다.
5. 가장 중요한 특징으로, 인터페이스는 구현부가 없다.
이러한 특징을 보면 대강 인터페이스에 대해 감이 올 것이다.
클래스간에 따라야 할 약속을 미리 정의해두고, 클래스 내부에서 그 기능을 구현하는 셈이다.
예시
public interface IDamagable
{
void OnDamage(GameObject attacker, DoActionData data);
}
이 코드 블록을 한번 보자.
interface로 선언한 이 인터페이스는 공격하는 대상, 무기 종류, 타격지점, 피해량 데이터를 매개변수로 갖는다.
public void OnDamage(GameObject attacker, DoActionData data)
{
healthPoint.Damage(data.Power);
transform.LookAt(attacker.transform, Vector3.up);
}
이 코드는 IDamagable 인터페이스를 상속받은 클래스에서 구현한 OnDamage 메서드이다.
간단하게 알아보자면, 피격을 당하게 되면, 대상의 체력을 깎고, 공격자를 쳐다보게 만드는 메서드라는 것을 알 수 있다.
추상 클래스
추상 클래스란?
추상 클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스이다.
인터페이스와는 달리 다중 상속이 불가능하고, 단일 상속만 가능하다.
추상 클래스는 추상 메서드 외에도 일반적인 필드, 메서드, 생성자 또한 가질 수 있다. 즉, 추상 클래스는 자신의 기능들을 하위 클래스로 확장시킨다는 느낌이 강하다.
추상 클래스는 class 앞에 abstract를 선언하여 만들 수 있다.
예시
public abstract class Weapon : MonoBehaviour
{
[SerializeField] protected WeaponType type;
protected GameObject rootObject;
protected virtual void Awake()
{
rootObject = transform.root.gameObject;
Debug.Assert(rootObject != null);
}
protected virtual void Start()
{
}
protected virtual void Update()
{
}
}
간단한 추상 클래스의 예시이다. 코드의 경우 무기의 Base 역할을 하는데, 무기에서 필요한 메서드들을 미리 구현해 두는 역할을 한다.
추상클래스는
상속받을 클래스들이 가지는 메서드와 필드가 많아서 중복 멤버를 통합하는 경우,
멤버에 public 이외의 접근자 선언이 필요한 경우,
하위 클래스가 재정의하는 기능을 공유하기 위해 상속 개념을 사용하는 경우 많이 사용한다.
추상 클래스와 인터페이스
공통점
1. 둘 다 가지고 있는 추상 메서드를 구현하도록 강제한다.
2. 인스턴스화가 불가능하다.
차이점
1. 인터페이스의 경우 모든 접근한정자는 public이지만, 추상 클래스는 그 외의 접근한정자도 사용이 가능하다.
2. 인터페이스는 다중 상속이 가능하지만, 추상 클래스는 단일 상속만 가능하다.
'Programming > 기타' 카테고리의 다른 글
워치독 타이머(Watchdog Timer) (0) | 2024.12.15 |
---|---|
소프트웨어의 정의와 특성 (1) | 2024.12.08 |
TDD(Test- Driven Development)에 대하여 (1) | 2024.12.06 |
동적 연결 라이브러리 (Dynamic Linked Library) (0) | 2024.12.03 |
의존성 주입(Dependency Injection) (0) | 2024.12.02 |