반응형

이번 스터디에서는 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) 사용하여 유연하게 코딩을 하고 프로그램을 만들어 나가면 된다. 

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

오늘의 스터디 끝!

반응형
반응형

오늘 스터디한 부분은 '상속' 이라는 개념으로, 지난 스터디에 이어서 class스터디이다.

소스로 들어가기전에 '상속'이라는 단어를 먼저 알고가야 한다.


※상속이란 

1. 뒤를 이음.

2. 일정한 친족 관계가 있는 사람 사이에서, 한 사람이 사망한 후에 다른 사람에게 재산에 관한 권리와 의무의 일체를 이어 주거나, 다른 사람이 사망한 사람으로부터 그 권리와 의무의 일체를 이어받는 일.


위와 같이 정의되고 있다. 하지만 프로그래밍 언어에서의 상속이 위 사전적 내용과 백퍼센트 일치하진 않지만

어느정도의 내용을 가지고 가기 때문에, 반드시 기억하고 스터디를 시작할 필요는 있다.

먼저 상속이란것에 대해 알아보기 위해, class하나를 선언해보자.

void main(){

}

class Color {
  String name;
  String group;
  
  Color({
    String name,
    String group,
  }):this.name=name,
     this.group = group;
  
  void sayName(){
    print("이 색은 ${this.name}입니다.");
  }
  
  void sayGroup(){
    print("그룹은 ${this.group}입니다");
  }
  
}

생성자와 함수를 가지는 간단한 class하나를 준비한다.

다음으로, 상속을 알아보기 위해, class하나를 더 준비한다.

class Fruit extends Color{
   //1. Color클래스의 모든것을 상속받을수 있다.
  Fruit(
    String name,
    String group
  ):super ( // <- 2. 여기서 super는 부모 class를 지칭한다.
    name : name,
    group : group
  ); 
  //<- 3. 이 class가 생성될때, 받는 파라미터를 
  //부모color클래스에 name과group에 넣어준다는것.
  
  void sayCategory(){
    print("여름과일입니다");
  }
}

새로 만든 Fruit 클래스에서는 extends라는 용어를 사용하여 Color클래스를 상속받고 있다. (1번)

여기서 extends의 좌측에는 자식클래스명, 우측에는 부모클래스명을 작성하여 상속받는 클래스 형태를 만든다.

2번을 보면 기존에 this.name = name 형태로 작성되었지만, 지금은 super라고 지정하는 형태를 볼수있다.

여기서 super는 상속받은 부모클래스를 지칭하는 것이며, 해석하자면 Fruit클래스의 생성자에서 

생성당시 받는 파라미터를 부모클래스인 Color의 name과 group에 할당한다. 라는 의미이다.

main 함수에서 실행하여 알아보자.

void main(){
	//color클래스 선언
	Color color = new Color(name:'red',group:'A');
    
    //color클래스 정상동작 확인
    color.sayName();
    color.sayGroup();
    
    //자식클래스로 사용될 fruit클래스를 summer와 melon 파라미터를 넣어서 생성
    Fruit fr = new Fruit('SUMMER','MELON');
    
    //아래 결과를 실행
    print(fr.name);
    print(fr.group);
    
    
}
SUMMER
MELON

Fruit클래스가 생성될때, 받은 SUMMER와 MELON은 생성자를 통해 Color클래스의 name과 group으로 지정되면서

위와 같은 결과값이 나올수 있게되는것이다.

부모클래스로부터 상속을 받을때는 반드시 super키워드를 이용하여 부모클래스의 정보를 입력해주어야 하고

입력해주지 않으면 null값이 표현된다.

 

또한 Fruit클래스는 Color클래스를 상속받았기때문에 Color클래스에 있는 함수를 불러와서 사용할수 있다.

Fruit fr = new Fruit('SUMMER','MELON');
fr.sayName(); //color클래스에 있는 sayName()함수
이 색은 SUMMER입니다.

이렇듯 부모클래스를 상속받아서 정의된 자식클래스는 반드시 생성자를 통해 부모클래스의 정보를 할당하고,

부모클래스의 함수를 그대로 받아서 사용할수 있다는것을 확인하였다.

여기서 중요한 참고사항으로, 자식은 부모클래스를 상속받으면 부모클래스가 가지고 있는 함수와 변수를 

사용할 수 있지만, 반대로 부모클래스는 자식클래스의 변수나 함수를 사용할 수 없다. (중요)

또한, 하나의 부모클래스는 여러개의 자식클래스를 가질수 있으나, 자식클래스는 하나의 부모클래스만 가질수 있다.

 

과연 어디서 이 기능을 사용하는가...? 있어서 좋은점은...? 이런 의문은 곧 다룰 여러예제들을 통해 파악하겠다.

상속 스터디 끝.

반응형

+ Recent posts