본문 바로가기

Flutter/Dart

Dart 클래스 classes (2)

 

🎯 1. Cascade Notation (.. 연산자)

✅ 같은 객체에 대해 여러 개의 프로퍼티를 연속으로 변경할 때 사용
✅ ..을 이용하면 객체를 계속 참조하면서 값을 변경할 수 있음

예제 코드

class Player {
  String name;
  int age;
  String description;

  Player({
    required this.name,
    required this.age,
    required this.description,
  });

  void showInfo() {
    print("이름: $name, 나이: $age, 설명: $description");
  }
}

void main() {
  var jisoung = Player(name: "jisoung", age: 17, description: "Happy code is end coding");

  // ❌ 기존 방식 (매번 객체를 호출해야 함)
  jisoung.name = "nico";
  jisoung.age = 20;
  jisoung.description = "Best Project is End Project";

  // ✅ `..` 연산자를 사용한 간결한 방식
  var sushi = jisoung
    ..name = "sushi"
    ..age = 12
    ..description = "Love sushi!";

  sushi.showInfo();
}

실행 결과

이름: sushi, 나이: 12, 설명: Love sushi!

 

📌 정리

  • .. 연산자를 사용하면 객체를 계속 참조하면서 프로퍼티를 변경 가능
  • 코드를 짧고 가독성 좋게 만들 수 있음

🎯 2. Enum (열거형)

✅ 여러 개의 고정된 값들을 관리할 때 사용
✅ 실수를 줄이고, 가독성을 높이는 역할

예제 코드

enum Team {
  red,
  blue,
}

class Player {
  String name;
  int age;
  Team team;

  Player({
    required this.name,
    required this.age,
    required this.team,
  });

  void showInfo() {
    print("이름: $name, 나이: $age, 팀: $team");
  }
}

void main() {
  var jisoung = Player(name: "jisoung", age: 17, team: Team.red);

  // ✅ `..` 연산자 활용하여 값 변경
  var sushi = jisoung
    ..name = "sushi"
    ..age = 12
    ..team = Team.blue;

  sushi.showInfo();
}

실행 결과

이름: sushi, 나이: 12, 팀: Team.blue

 

📌 정리

  • enum을 사용하면 특정 값들만 선택 가능 (Team.red, Team.blue 등)
  • 실수를 줄이고, 코드의 가독성 및 안정성을 높여줌

🎯 3. 추상 클래스 (abstract)

직접 인스턴스화할 수 없고, 반드시 자식 클래스에서 구현해야 하는 메서드를 정의
✅ 일종의 설계도 역할을 함

예제 코드

// ✅ 추상 클래스
abstract class Human {
  void walk(); // 자식 클래스에서 반드시 구현해야 함
}

// ✅ 상속받은 클래스
class Player extends Human {
  @override
  void walk() {
    print("플레이어가 걷고 있습니다!");
  }
}

void main() {
  var player = Player();
  player.walk();
}

실행 결과

플레이어가 걷고 있습니다!
 
 

📌 정리

  • abstract 키워드를 사용하면 직접 인스턴스를 생성할 수 없음
  • 반드시 자식 클래스에서 구현해야 하는 메서드를 정의 가능
  • 공통된 기능을 여러 클래스에서 재사용할 때 유용

🎯 4. 상속 (extends) & 부모 클래스 접근 (super)

✅ extends를 사용하면 부모 클래스의 속성과 메서드를 물려받을 수 있음
✅ super 키워드를 사용하면 부모 클래스의 생성자를 호출할 수 있음

예제 코드

// ✅ 부모 클래스 (Super Class)
class Human {
  final String name;

  Human(this.name);

  void sayHello() {
    print("Hello! 내 이름은 $name");
  }
}

// ✅ 자식 클래스 (Sub Class)
class Player extends Human {
  String team;

  // ✅ 부모 클래스 생성자 호출
  Player({required this.team, required String name}) : super(name);

  @override
  void sayHello() {
    super.sayHello(); // 부모 클래스 메서드 호출
    print("나는 $team 팀 소속입니다!");
  }
}

void main() {
  var player = Player(name: "jisoung", team: "red");
  player.sayHello();
}

실행 결과

Hello! 내 이름은 jisoung
나는 red 팀 소속입니다!
 

📌 정리

  • extends를 사용하면 부모 클래스의 기능을 물려받음
  • super 키워드를 사용하면 부모 클래스의 생성자 및 메서드 호출 가능
  • @override를 사용하면 부모 메서드를 재정의 가능

 

궁금증  !

여기서 만약 :super(name)을 하지 않으면 어떻게 될까가 궁금했는데 초기화 되지 않아 null이 된다고 한다 ~


🎯 5. Mixin (with)

다중 상속이 불가능한 Dart에서, 여러 기능을 추가할 때 사용
✅ 생성자가 없는 클래스로, 재사용 가능한 기능을 모아놓은 것

예제 코드

// ✅ Mixin 정의 (생성자 없음!)
mixin Tall {
  final double height = 190.0;

  void showHeight() {
    print("내 키는 $height cm 입니다!");
  }
}

// ✅ Mixin을 사용한 클래스
class Human with Tall {
  final String name;

  Human(this.name);

  void sayHello() {
    print("안녕하세요! 저는 $name 입니다.");
  }
}

void main() {
  var person = Human("jisoung");
  person.sayHello();
  person.showHeight();
}
 

실행 결과

복사편집
안녕하세요! 저는 jisoung 입니다.
내 키는 190.0 cm 입니다!
 

📌 정리

  • mixin은 with 키워드를 사용하여 여러 클래스에 기능을 추가 가능
  • 생성자가 없으며, 프로퍼티나 메서드를 제공하는 역할
  • 다중 상속이 안 되는 Dart에서 재사용 가능한 코드 작성 시 유용

🎯 최종 요약

Cascade Notation (..) 같은 객체에 대해 연속적인 작업 수행 player..name = "sushi"..age = 12
Enum (열거형) 제한된 값 목록을 정의 enum Team { red, blue }
추상 클래스 (abstract) 공통 기능 정의, 직접 인스턴스화 불가 abstract class Human { void walk(); }
상속 (extends) 부모 클래스의 기능을 자식 클래스에서 상속받음 class Player extends Human {}
부모 클래스 접근 (super) 부모 클래스 생성자 및 메서드 호출 super.sayHello();
Mixin (with) 다중 기능을 추가할 때 사용 class Human with Tall {}

 

 

반응형