반응형

이번 스터디에서는 Dart의 Interface에 대해 다뤄보려 한다.

Interface는 class가 꼭 선언해야(가져야)하는 메소드와 변수를 지정해주는 역할을 한다.

참고로 다른언어에서는 Interface 키워드를 사용하거나, 별도의 파일에 정의하여 상속받아 사용하지만 

dart에서는 일반적인 class처럼 선언해서 사용한다는 차이점이 있다.

바로 소스로 확인해보자.

class WorldInterface{
  String name;
  //이 안에 함수안에 기능을 정의하지 않는다.
  void sayName(){}
}

class Korea implements WorldInterface{
  String name;
  
  Korea(
    String name,
  ):this.name= name;
  
  void sayName(){
    print('이 나라의 이름은 ${this.name}입니다.');
  }
}

class Usa implements WorldInterface{
  String name;
  
  Usa(
    String name,
  ):this.name = name;
  
  void sayName(){
    print('이 나라의 이름은 ${this.name}입니다.');
  }
  
}

 

WorldInterface클래스는 인터페이스의 용도로 사용될 것이기 때문에, 원하는 변수와 함수를 선언만 하고

기능은 정의하지 않는다.

이제 이 인터페이스를 어떻게 사용하느냐면, Korea클래스와 Usa클래스명 옆에 implements 키워드를 작성하고

우측에 WorldInterface를 작성한다.

이때 부턴 Korea클래스와 Usa클래스는 WorldInterface를 구현하고 있기때문에, 반드시 WorldInterface안에있는

변수와 함수를 무조건 선언 및 기능정의를 해야한다.

호출 및 사용은 똑같다.(인스턴스 생성 및 호출)

void main() {
      
  Korea korea = new Korea('한국');
  
  korea.sayName();
  
  Usa usa = new Usa('미국');
  
  usa.sayName();
  
  
}
이 나라의 이름은 한국입니다.
이 나라의 이름은 미국입니다.

이 인터페이스를 왜 사용해야 하는것일까?

인터페이스(Interface)를 사용하는 이유는 비슷한 성격을 가진 class들은 반드시 특정변수와 함수를 가져야 한다라는 

가정이 있을때 인터페이스(Interface)를 사용하면 유용하다.

※이 인터페이스(Interface)를 구현하면, 이 안에 지정된 것들은 모두 강제한다! 라는 것을 의미함.

 

그런데 여기서 하나 드는 의문.

별도의 Interface키워드를 사용하지 않는다면, 일반 클래스처럼 extends로 사용해도 되지않나? 아래처럼?

class Asia{
  final String name;
  
  Asia(
    String name,
  ):this.name = name;

  void sayName(){}
  
}


class Japan extends Asia{
  
  Japan(
    String name,
  ):super(
    name=name
  );

  @override
  void sayName(){
    print('이 나라의 이름은 ${this.name}입니다.');
  
  }
  
}

물론 소스상으로 봤을때나, 출력하는 형태에 대해서는 큰 차이는 없어보이지만

분명히 성격이 다르다. 

상속은 부모의 모든 값을 그대로 이어받아서 (위 소스기준으로) sayName을 한번더 

선언하지 않아도 (재사용-오버라이드-덮어쓰기) 되지만, 인터페이스의 경우 반드시 내가 가지고 있는 변수와 함수를

선언해라! 라는 강제의 의미가 들어있다.

어느것이든 정답은 없다.

상황에 따라 상속이나 구현을 (extends or interface) 사용하여 유연하게 코딩을 하고 프로그램을 만들어 나가면 된다. 

다만, 해당 변수와 함수가 강제되는 클래스를 만들고 싶다면, 상속보단 구현이 맞다고 본다.

오늘의 스터디 끝!

반응형

+ Recent posts