정의
(1) 인터페이스란?
키워드 : 계약서, 설계도
메서드, 속성, 이벤트, 인덱서 등을 갖지만 이를 직접 구현하지 않고 단지 정의만 갖는다.
그렇기 때문에 인터페이스는 몸체가 없는 메서드를 만들고
이를 클래스가 상속받아 사용해야 하며
상속받아서 사용하는 클래스들은 반드시 인터페이스의 멤버를 구현해주어야 한다.
즉 추상 메서드만 담고 있는 추상클래스라 볼 수 있다.
*특징
- 모든 메서드들은 추상메서드로 간주되기 때문에 abstract를 적지 않는다.
- 선언된 필드는 모두 public static final이 생략되어 있다고 볼 수 있다.
- 추상 클래스와 마찬가지로 new 연산자를 사용하여 객체를 생성할 수 없다.
- 구현 객체가 같은 동작을 한다는 것을 보장하는 것이 목적이다.
- 다중 상속이 가능하다.
(2) 추상클래스란?
키워드 : 복제
일반적인 클래스와 동일하지만 객체를 생성할 수 없는 클래스로
클래스 구현부 내부에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다.
또 추상클래스의 추상메서드는 인터페이스의 메서드와 동일한 역할을 한다.
추상 클래스를 상속받은 클래스는 자기의 성질에 맞게 오버라이딩하여 사용한다.
이는 스스로 객체를 생성할 수 없고 임의의 추상 클래스를 포함할 수 있다는 특징이 있다.
*특징
- new 연산자를 사용하여 객체를 생성할 수 없다.
- 추상 클래스와 일반 클래스는 상속의 관계에 놓여있다.
- 공통된 필드와 메서드를 통일하여 일반 클래스 작성 시 시간을 절약할 수 있다.
- 단일 상속만 가능하며 일반 변수를 가질 수 있다.
- 동일한 부모를 가지는 클래스를 묶는 개념으로 상속을 받아 기능을 확장시키는 것이 목적이다.
- 클래스가 추상 클래스를 상속 받는다면 해당 클래스는 추상 클래스에 선언되어 있는 추상 메서드를
반드시 구현해야한다.
(3) 인터페이스와 추상클래스의 공통점과 차이점
* 공통점
- 선언부만 있고 구현은 없는 형태
- 객체 생성을 할 수 없다.
- 추상 메서드에는 접근 제한자를 private로 사용할 수 없다.
* 차이점
a. 추상클래스
- 목적 : 상속을 받아 기능을 확장시키는 것
- 다중상속을 지원하지 않는다.
즉 한 클래스는 하나의 Base 클래스만 가질 수 있지만 인터페이스는 여러 개를 가질 수 있다.
- 함수에 대한 접근 지정자를 가질 수 있다.
- 인터페이스에 비해 접근 속도가 빠르다
- 필드와 상수를 정의할 수 있다.
b. 인터페이스
- 목적 : 참조 변수를 통일시켜 결합도를 낮추고자 할 때,
구현하는 객체가 같은 동작을 한다는 것을 보장하고자 할 때
- 다중 상속을 지원하다
(다른 인터페이스는 상속 받을 수 있지만, 구조체 또는 클래스로부터 상속 받을 수 X)
- 함수에 대한 접근 지정자를 가질 수 X -> 디폴트로 public
- 상대적으로 느리다
- 필드를 가질 수 없다
(4) 사용 예제
추상 클래스의 키워드는 복제
인터페이스의 키워드는 설계도
ex. 자동차를 만들 때 뼈대, 프레임은 동일하게 구성하고 나머지 부분을 따로 구성하여 판매를 한다고
가정할 때
프레임을 복제한다. -> 추상클래스
그 외 부품을 다르게 설계하여 생산한다. -> 인터페이스
추상 클래스 사용
abstract public class A : MonoBehaviour
{
abstract public void Abc();
//변수를 선언할 수 있다.
public int a;
}
abstract public class B : MonoBehaviour
{
abstract public void Bbc();
}
//추상 클래스 다중 상속이 불가능!!
//AbstractEx : A, B할 경우 에러 발생!!
public class AbstractEx : A
{
public override void Abc()
{
a = 5;
Debug.Log("Abc 추상 메서드");
Debug.Log(" a값은 : " + a);
}
}
인터페이스 사용
interface IEx1
{
void Bbc();
//변수를 선언할 수 X
//함수, 프로퍼티, 인덱서, 이벤트를 사용할 수 있다.
int B { get; set; }
}
interface IEx2 : IEx1
{
void Cbc();
}
//IEx2를 상속함으로써 IEx1까지 사용할 수 있다.
public class InterfaceEx : IEx2
{
public int B { get; set; }
public void Bbc()
{
Debug.Log("상위 Bbc 인터페이스");
}
public void Cbc()
{
Debug.Log("Cbc 인터페이스");
}
}
public class Interface : MonoBehaviour
{
private void Start()
{
InterfaceEx Ex = new InterfaceEx();
Ex.B = 90;
Debug.Log("B의 값은 : " + Ex.B);
Ex.Bbc();
Ex.Cbc();
}
}
* 변수 선언 시 발생하는 에러
'Unity 개발' 카테고리의 다른 글
[Unity] 쿼터니언(Quaternion), 오일러 앵글(Euler Angle) (0) | 2023.01.31 |
---|---|
[Unity] 그래픽 기초, 렌더 파이프 라인 완벽 이해 (1) | 2023.01.31 |
싱글톤 오브젝트와 정적 멤버 (0) | 2022.12.09 |
Unity 코루틴(Coroutine) (0) | 2022.12.07 |
디자인 패턴 : 전략 패턴 (0) | 2022.12.02 |