Interface - 인터페이스
I를 쓰는 관례가 있다.간단하게 말하자면 사용할 메소드들을 모아둔 명세라고 할 수 있다.
다음은 인터페이스의 선언 형태이다.
interface 키워드를 사용한다.
접근_지정자 interface 이름
{
}
다음은 선언한 인터페이스를 상속받는 클래스의 형태이다.
접근_지정자 calss 자식_클래스_이름 : 인터페이스
{
}
예시를 들면 다음과 같다.
public interface IUnit{ //Attack()과 Move() 메소드가 들어가 있다.
void Attack();
void Move();
}
public class Goblin : IUnit // IUnit 인터페이스를 상속 받았다.
{
public void Attack() // IUnit 인터페이스의 Attack 메소드를 구현하였다.
{
Console.WriteLine("고블린의 공격")
}
public void Move()
{
Console.WriteLine("고블린의 이동") // IUnit 인터페이스의 Move 메소드를 구현하였다.
}
}
public class Ghoul : IUnit
{
public void Attack()
{
Console.WriteLine("구울의 공격")
}
public void Move()
{
Console.WriteLine("구울의 이동")
}
}
static void main(string[] args)
{
Goblin goblin = new Goblin();
goblin.Attack();
goblin.Move();
Ghoul ghoul = new Ghoul();
ghoul.Attack();
ghoul.Move();
}
interface IUnit에서 Attack(), Move() 메소드를 명세만 하고, 자식 클래스에서 각자 구현한 것을 볼 수 있다.
여기까지만 보면 추상 클래스와 비슷하게 보인다.
그래서 추상 클래스와 인터페이스를 비교해보려 한다.
우선 둘의 공통점은 다음과 같다.
차이점은 다음과 같다.
차이점에서 볼 수 있듯이, 인터페이스는 오직 추상 메소드만을 가진다.
추상 클래스는 정상 메소드와 일부 추상 메소드가 있을 수 있다.
허나 인터페이스는 오직 추상 메소드만을 가진다.
사용 목적에 따라 추상 클래스를 사용할지, 인터페이스를 사용할지 나뉜다고 보면 된다.
추상 클래스 - 개념의 확장
이러한 점이 개념의 확장이라고 말 할 수 있다면, 인터페이스는 다른 점이 있다.
인터페이스 - 기능의 명세
즉 상속받은 추상 메소드를 집중적으로 구현하는 것을 목적으로 둔다고 볼 수 있다.
위에서 설명한 공통적인 기능의 명세처럼 정말 사용할 메소드들만 나열해둔 것이다.
스마트폰 기본 기능을 클래스로 구현했다고 생각해보자
abstract class 스마트폰_기본_기능
{
통화_기능(); //메소드
메세지_기능(); //메소드
블루투스_기능(); //추상 메소드
}
class S회사_스마트폰 : 스마트폰_기본_기능
{
통화_기능() // 메소드
메세지_기능() // 메소드
블루투스_기능() // 메소드
}
블루투스 기능은 추상 메소드로 선언했다.
그래서 S회사 스마트폰 클래스에서는 반드시 자신들만의 블루투스 기능을 구현해야한다.
또한 S회사 스마트폰만의 기능을 구현하기 위해 메소드를 추가할 수 있다.
그럼 인터페이스를 사용하면 어떻게 될까?
interface 통화_기능
{
}
interface 메세지_기능
{
}
interface 블루투스_기능
{
}
class A회사_스마트폰 : 통화_기능, 메세지_기능, 블루투스_기능 // 인터페이스는 다중 상속이 된다고 했는데, 바로 이것이다!
{
통화_기능 구현
메세지_기능 구현
블루투스_기능
}
만일 A회사에서 블루투스 기능을 구현할 생각이 없다면 블루투스 기능 인터페이스를 받지 않으면 된다!
추상 클래스와 달리 인터페이스는 필요한 기능의 명세라는 점을 볼 수 있다.
개인적인 공부를 위해 정리한 내용이며, 틀린 점이 있을 수 있습니다.
만일 틀린 내용이 있다면, 댓글로 알려주시면 감사하겠습니다.