dart 클래스, Abstract, interface, Mixin

jokil·2023년 11월 29일
0

플러터

목록 보기
1/15
post-thumbnail

■Class

class Person {
  String name;
  int age;
  
  void greet() {
    print('안녕하세요, 저는 $name이고 $age살입니다.');
  }
}

void main() {
  var person1 = Person();  // Person 클래스의 인스턴스 생성
  person1.name = 'Alice';  // 인스턴스의 속성 설정
  person1.age = 25;
  
  person1.greet();  // 인스턴스의 메서드 호출
  
  var person2 = Person();  // 또 다른 Person 클래스의 인스턴스 생성
  person2.name = 'Bob';
  person2.age = 30;
  
  person2.greet();
}

인스턴스를 만들 설계도가 필요한데 그게 클래스다.

클래스 안에는 속성을 표현할 수 있는데 프로퍼티라고 한다.

person1.toString 이렇게 작성하면 toString이 프로퍼티다.

근데 toString은 사실 프로퍼티가 아니다. 메서드다.

hashCode는 프로퍼티가 맞다.

이 코드를 다시 보자

코드에는 이미 object의 존재가 있다.

class Person은 object의 클래스를 상속 받았다.

object는 객체의 일부 공통 기능과 메서드를 제공한다.

-toString : 객체의 문자열 표현을 반환

-hashCode : 객체의 해시코드를 반환(객체 저장되어있는 주소 출력하면 123124121 이런 모습으로 출력됨)

-operator : 객체의 메모리 주소 비교

-runtimeType : 객체의 실제 타입 반환

■추상클래스(인터페이스 사용)

추상 클래스는 추상 메서드를 포함하는 클래스다. 추상 메서드 -> 선언만 되고 정의가 없는 메서드.

추상 클래스는 그냥은 인스턴스화 못한다.

다른 클래스에서 implement를 하여 기능을 완성하는 상속 재료로 사용된다.

내가 추상 메서드를 가져올 그 대상이 되는 클래스는 implement로 가져오고

그 클래스를 쓸 장소에서는 @Override 키워드를 사용해야한다.

*오준석의플러터생존코딩 책에서 발췌한 내용

코드를 보자

abstract Interface class VehicleInterface { // 추상 클래스는 abstract로 시작함 
  void honk(); // honk뜻은 경적 울릴 때 울리다 뜻임. 아무 기능도 안넣었기 때문에 추상메서드임 
}

class Vehicle implements VehicleInterface { // implements를 사용해서 VehicleInterface를 추상클래스랑 도킹
  String color;

  Vehicle(this.color);

   // 오버라이드를 사용함으로서 추상메서드를 가져옴
  void honk() {
    print("경적 빠앙");
  }

  void drive() {
    print("드라이브하고 있는 차 색깔은 $color");
  }
}

class Car extends Vehicle {
  int carNumber;

  Car(String color, this.carNumber) : super(color);

  
  void drive() {
    print("자동차로 드라이브");
  }

  
  void honk() {
    print("경적을 울렸다");
  }
}

void main() {
  Vehicle myVehicle = Vehicle('blue'); // 부모 클래스에 있는 생성자
  myVehicle.drive(); // 부모 클래스에 있는 Vehicle(this.color)에 blue를 전달.

  Car myCar = Car('green', 486); // Car생성자로 green와 486를 넘김
  myCar.drive(); // 인스턴스 호출
  myCar.honk();
  print("내 차 넘버는 ${myCar.carNumber}"); // 결과: 내 차 넘버는 8282
}
이런식으로 쓰면 된다.

■Mixin

mixin Flyable on Animal {
  void fly() {
    print('I am flying!');
  }
}

class Animal {
  String name;

  Animal(this.name);
}

class Bird extends Animal with Flyable {
  Bird(String name) : super(name);
}

void main() {
  var bird = Bird('Bird');
  bird.fly();
}

예제는 객체 지향 프로그래밍의 개념 중 하나인 "mixin"을 보여줍니다. 이해를 돕기 위해 코드를 단계별로 설명하겠습니다.

Flyable mixin 정의:
Flyable은 Animal 클래스에 적용할 수 있는 mixin입니다. Mixin은 다른 클래스에 일련의 메소드나 속성을 추가하기 위해 사용됩니다.

Animal 클래스 정의:

Animal 클래스는 동물의 이름을 저장하기 위한 속성 name을 가지고 있습니다.

Bird 클래스 정의:
Bird 클래스는 Animal 클래스를 확장하고(extends) Flyable mixin을 포함합니다. 이것은 Bird가 Animal 클래스의 모든 속성과 메소드를 상속받을 뿐만 아니라 Flyable mixin에서 제공하는 fly() 메소드도 가지게 됨을 의미합니다.

main 함수:
main 함수에서는 Bird 클래스의 인스턴스인 bird를 생성합니다. 이때 "Bird"라는 이름을 가진 새로운 동물 객체가 만들어집니다.
그리고 bird.fly()를 호출하여 새가 날아다니는 동작을 수행하고 "I am flying!"을 출력합니다.
이 코드를 사용하면 새로운 동물 종류를 정의하고, 필요한 경우에만 Flyable mixin을 사용하여 날기 기능을 추가할 수 있습니다. 이것이 객체 지향 프로그래밍의 장점 중 하나인 코드 재사용성을 강화하는 방법 중 하나입니다.

profile
주니어 개발자에서 점핑점핑

0개의 댓글