KoreaMango 나무

Flutter - Class의 확장 방법 본문

Flutter

Flutter - Class의 확장 방법

KoreaMango 2024. 11. 11. 23:27

Flutter를 개발할 때는 Dart를 사용합니다.

 

iOS 개발을 오래 했던 저는 Swift가 익숙합니다.

 

이번에는 Dart와 Swift를 비교하면서 Class의 확장 방법들을 한번 알아보도록 할게요.

 

Dart에 Class 확장하는 방법 중 abstract, extends, Implements, with 에 대해 알아보도록 하겠습니다.

 

abstract

abstract는 Swift의 Protocol 과 비슷한 것 같습니다. 

 

인터페이스를 잡아주고, 구체적인 구현은 하지 않는 모습이 비슷하다고 생각했습니다.

Dart

abstract class Vehicle {
  void moveForward(int meters);
}

 

Swift 

protocol Vehicle {
    func moveForward(meters: Int)
}

 

https://dart.dev/language/class-modifiers

 

Class modifiers

Modifier keywords for class declarations to control external library access.

dart.dev

를 보면 interface가 있는데, 무엇이 다른지는 다음에 한번 알아보도록 하겠습니다 :)

(dart 3.5에 나온건가?)

 

extends

extends 는 상위 클래스를 상속합니다.

 

Swift에서는 상속할 때 딱히 키워드가 필요 없이, 타입처럼 사용한다고 느꼈었는데요.

이러한 점이 차이가 있는 것 같습니다. 

 

Dart

class Television {
  void turnOn() {
    _illuminateDisplay();
    _activateIrSensor();
  }
  // ···
}

class SmartTelevision extends Television {
  void turnOn() {
    super.turnOn();
    _bootNetworkInterface();
    _initializeMemory();
    _upgradeApps();
  }
  // ···
}

 

Swift

class Television {
    func turnOn() {
        illuminateDisplay()
        activateIrSensor()
    }
    
    private func illuminateDisplay() {
        print("Display illuminated")
    }
    
    private func activateIrSensor() {
        print("IR sensor activated")
    }
    // ···
}

class SmartTelevision: Television {
    override func turnOn() {
        super.turnOn()            
        bootNetworkInterface()
        initializeMemory()
        upgradeApps()
    }

    // ···
}

 

https://dart.dev/language/extend

 

Extend a class

Learn how to create subclasses from a superclass.

dart.dev

 

implements

implements는 특정 클래스나 인터페이스의 메서드와 속성을 강제로 재정의 하도록 합니다.

 

그런데 이러면 extends랑 뭐가 다른가? 라고 생각하실 수 있는데요.

extends는 상속, implements는 인터페이스 라고 생각하시면 될 것 같아요.

 

추가적으로 extends는 다중 상속이 안되는데 implements는 다중 인터페이스가 됩니다.

 

abstract 보다 implements를 사용하는 방식이 더 protocol에 가깝다는 생각도 듭니다.

 

 

요약하자면 

추상 클래스, 상속을 할 때는 공통된 동작을 구현할 때 사용하는게 좋습니다.

 

인터페이스는 다양한 동작을 정의하고, 다중 구현을 허용할 때 좋습니다.