brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Mar 13. 2020

다트 추상 클래스 (Abstract Class)

플러터를 위한 다트 프로그래밍

다트의 추상 클래스

추상 클래스추상 메서드를 가질 수 있는 클래스이다. 필수적으로 포함해야 하는 것은 아니다. 일반 클래스에는 추상 메서드를 가지고 싶어도 선언할 수 없다. 그럼 추상 메서드는 뭘까? 미완성된 메서드라고 생각하면 된다. 다시 말하면 메서드 선언은 되어 있지만 바디가 정의되지 않은 형태이다.


추상 클래스는 기존 클래스 앞에 추상이란 뜻을 가진 abstract 키워드를 붙여서 표현한다. 추상 클래스와 추상 메서드의 간단한 예는 다음과 같다.


abstract class Person {

 eat();

}


추상 클래스는 미완성 클래스이기 때문에 객체를 생성할 수 없다. 하지만 참조형 변수의 타입으로는 사용이 가능하다. 추상 클래스를 사용하기 위해서는 일반 클래스에서 implements 키워드로 임플리먼트 한 후에 반드시 추상 메서드를 오버라이딩 해야 한다.


어떤 의미인지 다음 예제를 보자.

Developer 클래스는 추상 클래스인 Person를 임플리먼트 했다. 이때 반드시 추상 클래스 Person의 추상 메서드인 eat()를 오버라이딩 해야 한다. 꼭 다른 기능으로 사용하기 위한 재정의가 아니더라도 반드시 Developer 클래스 내에 선언되어 있어야 한다.


main() 함수를 보면 person 객체의 타입으로 추상 클래스인 Person을 사용했다. 다만 실제 생성되는 객체는 Developer이다. 이것이 참조형 변수 person의 타입으로 추상 클래스가 사용 가능한 예이다. 다만 다음과 같이 추상 클래스로 객체를 생성하려고 하면 에러가 발생한다.


Person person = Person(); // error



다트에서는 추상 클래스에 반드시 추상 메서드만 존재해야 하는 것은 아니다. 앞서 말했듯이 추상 메서드가 존재할 수도 있을 뿐이다. 따라서 일반 메서드를 정의할 수도 있고 일반 메서드만 존재할 수도 있다. 일반 메서드도 반드시 임플리먼트 하는 클래스에서 재정의 되어야 한다. 그리고 추상 메서드든 일반 메서드든 임플리먼트 하는 클래스에서 @override 어노테이션 생략이 가능하다.

위 예제를 보면 추상 클래스 Person에 일반 메서드인 sleep()이 추가되어 있다. 또한 Developer 클래스에서 재정의할 때 @override 어노테이션을 생략한 것을 볼 수 있다. 이때 예제처럼 일반 메서드인 sleep()도 반드시 Developer 클래스에서 재정의 해야 한다는 점은 다시 한번 강조한다. 안 하면 에러가 발생한다.


extends 키워드를 사용해서 상속받는 일반 클래스의 경우에는 단 하나의 클래스만 상속이 가능하다. 하지만 추상 클래스는 일반 클래스와 다르게 여러 개를 임플리먼트 할 수 있다.

추상 클래스인 Junior를 추가하고 Developer 클래스에서 Person과 함께 임플리먼트 했다. 이때도 반드시 Junior의 메서드를 오버라이딩 해야 한다.


위 예제에서는 이전에 사용하던 Person을 참조형 변수의 타입으로 계속 사용할 수 없다. 왜냐하면 Junior의 메서드인 work()를 참조하려면 Person 타입으로는 불가능하기 때문이다. 만약 person.work()를 주석 처리하면 Person 타입으로 사용할 수는 있다. 그러나 추상 클래스를 타입으로 지정하는 것은 일반적이지 않다.


따라서 Developer 객체를 생성할 때는 타입도 Developer로 지정하도록 한다.


[요약]
- 추상 클래스와 추상 메서드는 abstract 키워드를 사용한다.
- 추상 클래스는 참조형 변수의 타입으로 사용할 수 있다.
- 추상 클래스를 임플리먼트 할 때 반드시 메서드를 오버라이딩 해야 한다.
- 추상 클래스에 추상 메서드만 존재하는 것은 아니다.
- 메서드 오버라이딩 시 @override 어노테이션은 생략 가능하다.
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari