클래스 상속 Extend a class
extends 키워드를 사용해 부모 클래스(상위 클래스)로부터 자식 클래스(하위 클래스)를 파생합니다.
super 키워드를 이용하면 자식 클래스 안에서 부모 클래스의 멤버(메서드, 생성자 등)를 호출할 수 있습니다.
class Television {
void turnOn() {
...
//부모 클래스 메서드 내 실행 코드
}
}
// SmartTelevision은 자식 클래스, Television은 부모 클래스
class SmartTelevision extends Television {
@override
void turnOn() {
super.turnOn(); // 부모 클래스 turnOn 메서드 호출
//자식 클래스 고유 코드
...
}
}Code language: Dart (dart)
예를 들어 일반 텔레비전이 부모 클래스이고 스마트 텔레비전은 자식 클래스입니다. 스마트 텔레비전은 텔레비전의 기능을 상속받습니다.
extends는 다른 사용 사례도 존재합니다. 제네릭 장에서 다루는 매개변수화 타입 관련 내용입니다.
실제 예시
class Television {
void turnOn() {
print("텔레비전 전원을 켜고 기본 화면 출력");
}
}
// SmartTelevision은 자식 클래스, Television은 부모 클래스
class SmartTelevision extends Television {
@override
void turnOn() {
super.turnOn(); // 부모 클래스 turnOn 메서드 호출
//자식 클래스 고유 코드
print("스마트 TV: 네트워크 모듈 실행, 스마트 시스템 메인 화면 불러오기");
}
}
void main() {
// 일반 텔레비전 인스턴스
Television normalTv = Television();
print("===== 일반 TV 켜기 =====");
normalTv.turnOn();
// 스마트 텔레비전 인스턴스
SmartTelevision smartTv = SmartTelevision();
print("\n===== 스마트 TV 켜기 =====");
smartTv.turnOn();
}Code language: Dart (dart)
실행 결과
D:\dartdemo\firstdart>dart run
Building package executable... (1.4s)
Built firstdart:firstdart.
===== 일반 TV 켜기 =====
텔레비전 전원을 켜고 기본 화면 출력
===== 스마트 TV 켜기 =====
텔레비전 전원을 켜고 기본 화면 출력
멤버 재정의 Overriding members
1. 재정의 가능한 요소
자식 클래스가 재정의할 수 있는 대상:인스턴스 메서드(연산자 포함), getter, setter 입니다.
2. @override 어노테이션
역할: 해당 메서드가 부모 클래스의 멤버를 명시적으로 재정의함을 선언하고 컴파일러가 문법 검사를 진행하도록 합니다.
class Television {
set contrast(int value) {}
}
class SmartTelevision extends Television {
@override //컴파일러에 자식 클래스에서 부모 메서드를 재정의한다고 알림
set contrast(num value) {}
}
Code language: JavaScript (javascript)
3. 재정의 준수 규칙
- 반환 타입:재정의 메서드의 반환 타입은 부모 메서드와 같거나 부모 반환 타입의 하위 타입이어야 합니다.
- 매개변수 타입:재정의 메서드 매개변수 타입은 부모 메서드와 동일하거나 부모 매개변수 타입의 상위 타입이어야 합니다.(예시
int→num, num은 int의 상위 타입이므로 유효) - 위치 매개변수 개수:원본 메서드에 n개의 위치 매개변수가 있다면 재정의 메서드 역시 n개를 선언해야 합니다.
- 제네릭 제약:제네릭 메서드는 비제네릭 메서드를 재정의할 수 없고 비제네릭 메서드도 제네릭 메서드를 재정의 불가능합니다.
4. covariant 키워드(타입 축소 특수 상황)
기본 규칙에서는 매개변수 타입을 좁히는 행위를 허용하지 않습니다(하향 형변환 시 런타임 오류가 발생할 수 있음);
개발자가 런타임 오류가 발생하지 않음을 보장할 수 있다면 매개변수에 covariant를 표시하여 매개변수 타입 축소를 구현할 수 있습니다.
연산자 ==를 재정의한다면, 반드시 Object의 hashCode getter도 함께 재정의해야 합니다.
noSuchMethod ()
1. 기능
존재하지 않는인스턴스 메서드 / 인스턴스 변수를 호출하려고 할 때 noSuchMethod()를 재정의하여 호출을 가로채고 사용자 정의 로직을 처리할 수 있습니다.
재정의하지 않으면 존재하지 않는 멤버 접근 시 NoSuchMethodError가 즉시 발생합니다.
class A {
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ${invocation.memberName}');
}
}
Code language: JavaScript (javascript)
Invocation객체: 호출 관련 정보(멤버 이름, 매개변수 등)를 저장
2. 구현되지 않은 메서드 호출이 작동하는 두 가지 전제 조건(하나만 만족하면 됨)
- 호출 수신 객체의 정적 타입이
dynamic; - 수신 객체 정적 타입에 해당 미구현 메서드(추상 메서드 가능)가 선언되어 있고, 수신 객체의 동적 타입이
Object기본 구현과 다른noSuchMethod()를 구현하고 있어야 합니다.
예시
class A {
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ${invocation.memberName}');
// 호출 매개변수, 호출 타입을 추가로 출력하여 전체 호출 정보 표시
print('호출 매개변수:${invocation.arguments}');
print('호출 타입:${invocation.runtimeType}');
}
}
void main() {
A obj = A();
// 존재하지 않는 메서드 호출, noSuchMethod 실행
obj.hello("test", 123);
// 존재하지 않는 속성 접근
obj.unknownValue;
}Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:6:30: Error: The getter 'arguments' isn't defined for the type 'Invocation'.
- 'Invocation' is from 'dart:core'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'arguments'.
print('cal:${invocation.arguments}');
^^^^^^^^^
bin/firstdart.dart:14:7: Error: The method 'hello' isn't defined for the type 'A'.
- 'A' is from 'bin/firstdart.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'hello'.
obj.hello("test", 123);
^^^^^
bin/firstdart.dart:16:7: Error: The getter 'unknownValue' isn't defined for the type 'A'.
- 'A' is from 'bin/firstdart.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'unknownValue'.
obj.unknownValue;Code language: PHP (php)
클래스 상속과 멤버 재정의