본문 바로가기
Dart

[Dart] 언어 기본기 - 오버라이드편

by 가드 2022. 12. 12.
728x90

오버라이드 (Override)

부모 클래스에 있는 메소드를 자식 클래스에서 재정의 하는 것이다. 자식 클래스가 부모 클래스를 상속하여 자식 클래스에 없는 메소드를 호출하면 부모 클래스의 메소드를 찾게 된다. 반대로 부모 클래스의 메소드를 자식 클래스가 재정의 되어 있으면 부모 클래스의 메소드를 찾지 않고 자식 클래스를 호출하게 된다. 이런 행위를 오버라이드 또는 재정의라고 한다.

void main() {
  Book book = Book('헤리포터', 25000);
  print(book.bookInfo()); // 책 이름은 헤리포터, 책 가격은 25000원
  BookShop bookShop = BookShop('헤리포터', 25000, '교보문고');
  print(bookShop.bookInfo()); // 책 이름은 헤리포터, 책 가격은 25000원, 책 판매 서점은 교보문고
}

class Book {
  final String name;
  final int price;

  Book(this.name, this.price);

  String bookInfo() {
    return '책 이름은 ${name}, 책 가격은 ${price}원';
  }
}

class BookShop extends Book {
  String shopName;

  BookShop(name, price, this.shopName) : super(name, price);

  @override
  String bookInfo() {
    return '책 이름은 ${name}, 책 가격은 ${price}원, 책 판매 서점은 ${shopName}';
  }
}
  • Book 클래스에는 name과 price 변수를 가지고 있고 name과 price 정보를 반환해 주는 bookInfo() 메소드를 가지고 있다.
  • BookShop 클래스는 Book을 상속받기 때문에 name과 price 정보와 bookInfo() 메소드를 부여 받았지만 BookShop도 동일한 bookInfo() 메소드를 가지고 있다.
  • main() 메소드에서 Book 클래스 bookInfo를 호출하면 name과 price 정보 값을 반환해주는 반면에 BookShop 클래스 printInfo는 name과 price와 shopName 정보 값까지 반환해 준다.
  • BookShop 클래스의 bookInfo 메소드는 부모의 bookInfo 메소드를 오버라이드 한다는 뜻으로 @override를 반드시 선언해줘야 한다.

bookInfo 반환 문자열을 살펴보면 부모나 자식 클래스나 bookInfo 메소드의 문자열에는 '책 이름은 ${name}, 책 가격은 ${price}원'은 동일하게 적용되어 있다. 그래서 이번에는 부모의 문자열에서 책 판매 서점 정보만 더해서 반환하는 방식으로 구현해보자.

void main() {
  Book book = Book('헤리포터', 25000);
  print(book.bookInfo()); // 책 이름은 헤리포터, 책 가격은 25000원
  BookShop bookShop = BookShop('헤리포터', 25000, '교보문고');
  print(bookShop.bookInfo()); // 책 이름은 헤리포터, 책 가격은 25000원, 책 판매 서점은 교보문고
}

class Book {
  final String name;
  final int price;

  Book(this.name, this.price);

  String bookInfo() {
    return '책 이름은 ${name}, 책 가격은 ${price}원';
  }
}

class BookShop extends Book {
  String shopName;

  BookShop(name, price, this.shopName) : super(name, price);

  @override
  String bookInfo() {
    return super.bookInfo() + ', 책 판매 서점은 ${shopName}';
  }
}
  • 자식 클래스인 BookShop의 bookInfo 메소드에서 name과 price 정보 문자열을 가져오기 위해 super.bookInfo()를 호출하여 부모가 가진 정보에서 BookShop이 가진 정보인 책 판매 서점 정보를 더해줘서 반환해주었다.
  • 동일한 결과값을 낼 수 있어서 부모 메소드 정보를 가져와서 재정의 하는 방식도 있다.
  • override 된 자식 메소드에서 this.bookInfo로 동일한 자기 자신 메소드를 호출하면 무한 재귀 호출에 빠져 에러가 발생하니 주의하자.
300x250

댓글