[Dart] Class 총 정리 (상속 / 재정의 / 추상화)

Tyger·2023년 1월 27일
4

Class 총 정리 (상속 / 재정의 / 추상화)

이번 글에서는 Flutter의 채택 언어인 Dart에 대해서 작성하고자 한다.
사실 Dart언어는 이미 오래전에 구글이 개발한 언어였지만, 한 때 가장 배우지 말아야할 언어 순위에도 들었을 정도로 사용성이 좋지 않았다. 하지만 Flutter 프레임 워크에 적용되면서 현재는 많은 사람이 Dart언어를 사용하고 있다.

Dart 언어도 OOP(Object Oriented Programming), 즉 객체지향 프로그래밍 이다.

객체지향 언어에 대한 설명은 다른 블로그에서 자세히 설명한 글이 있으니 여기서는 설명하지 않겠다.

간단한 예제를 통해서 Dart가 사용하는 class, override, super, this, extends, implements, with, getter, setter 등에 대해서 알아보도록 하겠다.

Dart언어의 개념에 관한 글이기에 dartpad를 사용하여 코드를 작성하였다.

class

class의 기본 형태이다. 여기서는 Person이라는 class를 생성하였고, 문자열 타입의 name, 숫자형 타입의 age 변수를 선언하여 생성한 class 이다.

Dart의 시작은 main() 함수로 부터 시작된다.

person1, person2를 각각 Person class로 생성하여 결과를 출력하고 있다.

이름은 홍길동1이고, 나이는30살 이다 !
이름은 홍길동2이고, 나이는31살 이다 !

private / public

Dart 언어도 다른 언어와 마찬가지로 변수를 선언할 때 public, private으로 생성할 수 있는데, Dart는 이를 언더바로 구분하고 있다.

언더바로 생성되는 변수, 함수 등은 해당 하는 class내에서만 사용이 가능하는데, Dart는 같은 파일안에 있다면 접근이 가능하다.

아래 name은 private, age는 public으로 사용한 것이다.

getter

위에서 private, public에 대해서 알아보았는데, class의 private은 같은 파일에 있다면 사용이 가능하지만 원칙적으로는 접근이 안된다.
이럴 때 접근을 가능하게 해주는 기능이 바로 getter라는 기능이다.

아래 예시문을 보면 Product라는 상품 정보를 가지고 있는 class를 생성한 뒤 Order 클래스에서 Product를 하나 생성한다. 이 때 private으로 생성을 하면 이제 다른 클래스에서 Order class의 product에는 접근이 불가능 하다.

아래 보면 get이라고 해서 코드가 적혀있는데, 이 부분이 바로 getter를 만들어 주는 기능이다. 이렇게 getter를 만들어 주면 이제 다른 클래스에서도 접근이 가능하게 된다.

getter는 아래와 같이 $classType get $접근할변수 => $private변수 형태로 만들어 주면 된다.

Coffee를 1개 주문함

setter

아래는 setter에 대한 내용인데, 예제가 적절한지는 모르겠다...

사실 setter는 잘 안쓰는 것 같아 오랜만에 예제 찾아보면서 작성하였다.

Order 클래스가 생성될 때마다 다른 작업을 하고 싶을 때 유용하다고 하는데, 나는 잘 안쓰는 편이다.

extends

상속에 대해서 알아보겠다. 상속은 말그대로 현실 세계에서 부모의 재산을 자식에개 상속하면 자식이 상속받은 재산을 소유하게 되듯이 부모 class를 상속하면 상속받은 class에서는 부모 class의 기능을 그대로 사용할 수 있게된다.

아래 예제를 보면 Hero class 안에 name 변수에 "Hero"라는 값을 넣어서 클래스를 생성하였고 Marvel class는 Hero class를 상속받았다.

class 상속 방법은 extends를 사용하여 상속받을 수 있다.

Marvel class에는 name 이라는 변수가 없는데 여기서 name이 바로 부모 클래스에 해당되는 Hero 클래스의 name이다.

Iron Man

with

이번엔 class 하나만 상속하는 것이 아니라 여러 class를 상속하는 방법이다.
아래의 예제 처럼 with 키워드를 사용하여 상속 받을 class를 넣어주면 된다.

Marvel Studio에서 제작한 히어로 영화 Iron Man의 배우는 Robert John Downey Jr이다.

mixin

이번엔 mixin에 대해서 알아보겠다. mixin은 여러 클래스의 계층에서 클래스 코드를 재사용한다고 정의하고 있다.

이렇게 정의만 보고 이해하기는 역시 어렵니다. 예제를 통해서 알아보자.

Mixin도 위에서 살펴본 with 키워드를 사용하여야 한다.

OOP에서는 죽음의 다이아몬드 문제로 다중 상속이 불가능 한데, 이럴 때 mixin을 사용하면 된다.

아래와 같이 mixin 으로 생성해 준다. mixin에는 생성자를 넣을 수 없다.

아래와 같이 슈퍼히어로에 대해서 필요한 mixin만 넣어서 사용하면 코드의 재사용성이 좋아진다.

this

이번엔 class에서 중요한 개념인 this에 대해서 알아보겠다. this는 해당 클래스 내의 자기자신이라고 생각하면 된다.

this.name은 Person 클래스의 name을 가리키는 것이다.

super

위에서 살펴본 this가 자기자신이라면 부모 클래스를 지칭하는 키워드는 바로 super이다.

아래 예제를 보면 Car class는 Factory라는 공장 정보가 있는 class를 상속 받았는데, 아래 Car의 정보를 출력하는 information() 함수를 보면 super.locate라고 사용된 부분이 있는데, 바로 부모 클래스에 접근하기 위해서 사용한 것이라고 본다.

G70은 Ulsan 공장에서 생산한 5000만원대 차야 !

override

이번엔 override라는 annotation에 대해서 알아보겠다. annotation은 주석문이라는 뜻인데 Dart/Flutter에서는 @로 사용되는 것이 annotation을 지칭하는 키워드라고 생각하면 된다.

override는 재정의라는 뜻으로 바로 부모 class를 재정의 한다는 뜻이다.
이게 무슨 말이냐면 만약 class를 상속받은 자식 class에서 부모 class와 똑같은 메소드가 사용된다면 어떤 일이 일어나냐면 바로.. 아무런 일도 일어나지는 않는다.
같은 메소드를 사용한다고 해서 에러가 발생하지는 않는다. 알아서 잘 작동시켜준다. 하지만 @override 키워드를 작성하여 주석문을 추가해 주어야 디버깅이나 문법 구조를 원활하게 이해하고 작성할 수 있다.

아래 예제를 보면서 가볍게 살펴보자.

먼저 CarBrand라는 자동차 브랜드에 대한 정보를 가지고 있는 class를 하나 만들어 주고 infromation()이라는 함수를 만들어 준다.

이번엔 CarFactory라는 자동차 공장의 주문을 넣는 class를 생성하고 CarBrand 객체를 상속 받아보자.

여기도 똑같이 infromation()이라는 함수를 만들어 주는데, @override 주석문을 넣어 부모 클래스의 information()을 재정의한다고 하자.

여기서 information()은 자식 클래스에서 재정의한 information()이다.

----- Car Informaion -----
Brand : Hyndai
Rank : 1
Name : Sonata
Price : 3500
----- Car Informaion -----
Brand : Kia
Rank : 2
Name : K5
Price : 3500

abstract

abstract라는 추상 클래스에 대해서도 알아보자. 추상 클래스는 class랑은 다르게 선언만 되고 정의는 하지 않은 것이다.
정의만 되어있기에 바로 인스턴스 할 수 없다.

아래와 같이 추상 클래스를 생성하면 된다.

implements

마지막으로 implements에 대해서 알아보도록 하겠다. extends와 같이 상속이라는 뜻으로 사용되지만, 둘의 사용 법에는 차이가 있다.

먼저 정확히 말하면 extends는 class를 상속 받지만 implements에서는 interface를 상속 받을 때 사용된다.

extends와는 다르게 implements로 interface를 상속하면 추상 클래스에서 선언된 메소드, 생성자 등을 전부 정의하여야 한다.

위의 예제로 사용된 추상 클래스를 World라는 class에서 implements로 상속 받으면 Asia 추상 클래스에서 선언된 전부를 override하여 재정의 해주어야 한다.

여기서도 다중 상속을 할 수 있다.

마무리

Dart 언어의 class 개념과 문법에 대해서 알아보았다. 간단한 예제를 통해서 작성하였기에 직접 변형하면서 사용해보길 추천한다.

실제 개발을 하는데 있어서 어떻게 사용하는지에 대해서도 작성해 보면 좋을 것 같다 추가적으로 글을 게시하도록 할 예정이다.

profile
Flutter Developer

0개의 댓글