profile image

L o a d i n g . . .

반응형

플러터를 사용하기 위해서는 다트라는 언어를 익혀야 하는데, 이 문법은 자바와 아주 유사하여 자바를 알고 있다면 더 배우기 쉽습니다.

그런데 오히려 코틀린을 사용하고 더 익숙한 사용자라면 다트랑 비슷비슷해서 조금씩 틀린고 갑자기 헷갈릴 수 있는데 그럴 수 있습니다. 저도 지금도 그러고 있고요 특히 마지막에 자꾸 ";"를 까먹어서 에러가 나네요

 

아무튼 상속도 자바와 아주 유사 아니 똑같아서 자바를 알고 있다면 한번 보는 것으로도 충분히 이해할 수 있을 거라 생각이 듭니다.

다트에서의 상속 하기

자바와 마찬가지로 클래스를 생성할 때 클래스 이름 옆에 extends를 붙여서 상속을 받습니다.

일단 상속을 받기 전에 부모 클래스를 먼저 만들어야 합니다. 이 또한 자바와 같습니다

class Sample{
  String name;
  int age;
  
  Sample({
    required this.name,
    required this.age,
  });
  
  void sayName() {
    print('저는 ${this.name}입니다');
  }
  
  void sayAge() {
    print('저의 나이는 ${this.age} 입니다.');
  }
}

코틀린으로 넘어오면서 생성자를 위와 같이 잘 안 쓰게 되는데 오랜만에 저렇게 생성자를 생성해 보네요 

생성자의 required는 non-nullable로 null이면 안 되는 값을 의미합니다. 저도 다트에서 처음 보는 것으로 저도 저 정도로만 알고 있습니다.

위와 같이 부모 클래스를 생성한 후 자식 클래스에 상속을 합니다.

class Boy extends Sample{
  Boy(
    String name,
    int boyAge,
  ): super(
      name: name,
      age: boyAge);
  
  void sayBoy() {
    print('저는 남자 입니다.');
  }
}

자바와 마찬가지로 클래스 이름 옆에 extends를 붙인 후 부모 클래스를 쓰면 상속이 됩니다.

생성자의 경우 super를 쓰게 되는데 super는 부모클래스를 의미합니다.

이렇게 상속을 받게 되어 boy에서 부모 클래스에서 만든 메소드를 호출할 수 있습니다.

부모 클래스의 메소드를 오버라이딩하여 재사용할 수 도 있습니다. 오버라이딩 개념 또한 상속을 통해 나옵니다.

마무리

호출 및 생성하는 방법도 자바와 동일합니다.

void main(){
  Sample sample = Sample(name: 'mader', age: 33);
  
  Boy boy = Boy('mader2', 23);
  print(boy is Sample);
}

위와 같이 호출 및 생성을 할 수 있으며, 부모클래스를 바로 생성할 수 도 있으며, 상속받은 클래스도 생성할 수 있습니다.

부모클래스의 생성자는 required를 사용하였기에, 생성 시 반드시 파라미터 이름을 입력해주어야 합니다 -> name: 'mader'

이런 식으로 하여야 하며, 안 할 시 에러가 발생합니다.

boy는 Sample 클래스를 상속받았기에 부모클래스에 있는 메소드를 호출할 수 있으며, is를 통해 타입을 확인해보면 부모클래스이기도 합니다. 그래서 true가 떨어집니다.

그리고 Boy클래스이기도 하기에 is를 통해 Boy 클래스인지 확인을 해보며 이 또한 true가 떨어지게 됩니다.

 

위의 sample과 boy는 서로 다른 객체이며, 메모리 위치도 다르기에 서로 데이터를 공유하거나 꼬이는 일이 없습니다.

 

상속의 경우 잘 사용을 하게 되면 재사용성도 늘어나게 되고 유지보수 시에도 많은 이점이 될 수 있습니다.

많은 라이브러리에도 상속을 받아서 사용해야 하는 라이브러리가 존재하며 꼭 알고 있어야 할 개념이라고 생각이 됩니다.

반응형
복사했습니다!