2024.03.06 - 인터페이스(interface)
- 인터페이스의 구현
인터페이스가 뭔지 알아보기 전에 어떻게 생겼는지 알아보자.
- 인터페이스(Interface)의 선언
interface 인터페이스_이름
{
반환_형식 메소드_이름1(매개변수_목록);
반환_형식 메소드_이름2(매개변수_목록);
반환_형식 메소드_이름3(매개변수_목록);
//...
}
인터페이스를 선언하는 것은 클래스와 많이 닮아있다.
- 인터페이스의 특징
- 인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티 만을 가질 수 있다. (변수 같은 거를 못가진다)
- 인터페이스는 접근제한자를 사용할 수 없고, 모든 것이 public으로 선언된다.
- 인터페이스의 멤버는 구현부가 없다. (추상 클래스의 추상 메서드와 비슷하다)
- 인터페이스는 인스턴스를 만들 수 없다.
- 인터페이스 사용법
인터페이스는 클래스에 상속하여 사용한다. 써보자.
인터페이스를 상속받은 클래스는 인터페이스의 멤버를 구현해주어야한다.
이 점은 마치 추상 클래스와 추상 클래스를 상속받은 자식 클래스를 떠올리게 한다.
그럼 일단 인터페이스를 상속받은 클래스에서 멤버를 구현해보자
인터페이스의 멤버를 구현할 때는 public으로 선언해주지 않으면 안된다.
인터페이스를 상속받은 클래스는 인터페이스 객체로 취급할 수 있다.(업캐스팅이 된다)
- 그래서 인터페이스는 뭐하는데 쓰나요
인터페이스는 추상 클래스와 비슷한 역할을 한다. 상속할 클래스가 무엇을 구현해야 할지를 정의하는 역할을 한다.
- 그러면 추상 클래스랑 인터페이스는 무슨 차이가 있나요
자식 클래스가 부모클래스의 하위분류인 경우, 상속을 통해 자식클래스의 기능을 확장하는 경우에는 추상 클래스를 사용한다. 자식 클래스가 상속받은 어떤 행위를 할 수 있는 경우에는 인터페이스를 사용한다.
쉽게 말해서 상속받는 클래스가 '~이다' 관계이면 추상클래스를, 상속받는 클래스가 '~한다, ~있다 관계이면 인터페이스를 사용한다.
추상 클래스 Item은 effect()라는 메소드를 가졌지만 effect()가 어떻게 작동할 아이템인지 모르기 때문에 추상 메서드로 남겨놓았다. 클래스 Scroll은 Item을 상속받아 effect()를 구체화해준다. (Scroll은 Item'이다.')
인터페이스 IEatable은 Eat()할 수 있는 속성을 나타낸다. Eat()이 어떻게 작동할지 모르기 때문에(쩝쩝 먹을지, 으적으적 먹을지, ..) 구현하지 않았다. 클래스 Potion은 Eat()할 수 있는 IEatable 속성을 가진다. Potion은 IEatable을 상속받아 Eat()을 구체화해준다.(Potion은 먹을수'있다.' (Potion을 먹'는다.'))
위의 예시에서 Potion이 Item과 IEatable을 동시에 상속하고 있는것을 볼 수 있다.
클래스는 동시에 여러개를 상속할 수 없지만, 인터페이스는 동시에 여러개를 상속할 수 있다는 특징이 있다.