[Flutter] Dart - 4. Class

2024. 8. 25. 00:55Study

Dart의 메인디쉬~ 집중해야댄다구~


1. Your First Dart Class

class Player {
  String name = "miri"; // 만약 name의 값을 바꾸지 못하게 할거라면 final을 사용하면 됨
  int age = 30;
  
  void sayHello() {
  // class method에서는 this.name과 같이 this를 사용하지 않는것을 권고
  print("Hi, my name is $name");

  // 단, method내에서 name이라는 variable이 있는데 Player class의 name을 불러오고 싶다면 this를 사용
  // var name = "122";
  // print("Hi, my name is $this.name"); 
  }
}

void main() {
  var player = Player();
  print(player.name); // miri
  player.sayHello(); // Hi, my name is miri
}

2. Constructors

  • constructors method의 이름은 class 이름과 같아야 함
class Player {
  late final String name; // name의 값을 바꾸지 못하게 하려면 final을 사용하면 됨
  late int age;

  Player(String name, int age) {
    this.name = name;
    this.age = age;
  }

  void sayHello() {
    print("Hi, my name is $name");
  }
}

void main() {
  var player = Player('miri', 30);
  player.sayHello();
  var player1 = Player('mirimi', 30);
  player1.sayHello();
}

=

class Player {
  final String name;
  int age;

  Player(this.name, this.age);

  void sayHello() {
    print("Hi, my name is $name");
  }
}

void main() {
  var player = Player('miri', 30);
  player.sayHello();
  var player1 = Player('mirimi', 30);
  player1.sayHello();
}

3. Named Constructor Parameters

class Player {
  final String name;
  int age;
  String team;
  int xp;

  Player({
    required this.name, // default value 보다는 required를 주는게 좋은것 같음(둘다 사용 가능)
    required this.age,
    required this.team,
    required this.xp,
  });

  void sayHello() {
    print("Hi, my name is $name");
  }
}

void main() {
  var player = Player(
    name: 'miri',
    age: 30,
    team: 'red',
    xp: 1500,
  );
  player.sayHello();

  var player1 = Player(
    name: 'coco',
    age: 14,
    team: 'white',
    xp: 2500,
  );
  player1.sayHello();
}

4. Named Constructors

  • Flutter에서 constructor를 만들때 많이 사용하는 패턴
  • : (콜론)을 사용하면 argument와 property를 일대일 초기화하는 생성자를 만들 수 있음
class Player {
  final String name;
  int age, xp;
  String team;

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

  Player.createRedPlayer({
    required String name,
    required int age,
  })  : this.name = name,
        this.age = age,
        this.team = 'red',
        this.xp = 0;

  Player.createBluePlayer(String name, int age)
      : this.name = name,
        this.age = age,
        this.team = 'blue',
        this.xp = 0;

  void sayHello() {
    print("Hi, my name is $name");
  }
}

void main() {
  var redPlayer = Player.createRedPlayer(
    name: 'miri',
    age: 30,
  );

  var bluePlayer = Player.createBluePlayer('coco', 14);
}
  • API 호출해서 Data 가져와서 사용한다고 가정 했을 때,
class Player {
  final String name;
  int xp;
  String team;

  Player.fromJson(Map<String, dynamic> playerJson)
      : name = playerJson['name'],
        xp = playerJson['xp'],
        team = playerJson['team'];

  void sayHello() {
    print("Hi, my name is $name");
  }
}

void main() {
  var apiData = [
    {
      'name': "miri",
      "team": "red",
      "xp": 0,
    },
    {
      'name': "coco",
      "team": "blue",
      "xp": 0,
    },
    {
      'name': "janggoon",
      "team": "red",
      "xp": 0,
    },
  ];

  apiData.forEach((playerJson) {
    var player = Player.fromJson(playerJson);
    player.sayHello();
  });
}

5. Cascade Notation

  • 앞에 class가 있다면 ..을 사용해서 property를 더 짧은 코드로 수정가능함
class Player {
  String name;
  int xp;
  String team;

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

  void sayHello() {
    print("Hi, my name is $name");
  }
}

void main() {
  var miri = Player(name: 'miri', xp: 0, team: "red");
    ..name = 'mirin'
    ..xp = 1200
    ..team = 'blue'
    ..sayHello();
}

==

void main() {
  var miri = Player(name: 'miri', xp: 0, team: "red");
  miri.name = 'mirigu';
  miri.xp = 1200;
  miri.team = 'blue';
  miri.sayHello();
}

6. Enums

  • flutter에서 굉장히 자주 사용하게 될 것
  • enum 타입은 실수를 하지 않게끔 도와줌(선택의 폭을 좁혀주는 역할을 함)
  • enum 타입의 변수들은 해당 enum 타입에 생성된 값들 중에서만 값이 할당할 수 있음
enum Team { red, blue } //  텍스트 형태로 쓸 필요 없음

enum XPLevel { biginner, medium, pro }

class Player {
  String name;
  XPLevel xp;
  Team team;

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

  void sayHello() {
    print("Hi, my name is $name");
  }
}

void main() {
  var miri = Player(name: 'miri', xp: XPLevel.biginner, team: Team.red)
    ..name = 'mirigu'
    ..xp = XPLevel.medium
    ..team = Team.blue
    ..sayHello();
}

7. Abstract Classes

  • 추상화 클래스로는 객체를 생성할 수 없음
  • 다른 클래스들이 직접 구현해야하는 메소드들을 모아놓은 청사진?
  • 추상화 클래스는 특정 메소드를 구현하도록 강제함
// 추상화 클래스
// Human 클래스는 이를 상속받는 모든 클래스가 가지고 있어야 하는 메소드를 정의함
abstract class Human {
  void walk(); // 메소드의 반환값만 설정
}

enum Team { red, blue } //  텍스트 형태로 쓸 필요 없음

enum XPLevel { biginner, medium, pro }

class Coach extends Human {
  void walk() {
    print("the coach is walking");
  }
}

class Player extends Human {
  String name;
  XPLevel xp;
  Team team;

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

  void walk() {
    print("i'am walking");
  }

  void sayHello() {
    print("Hi, my name is $name");
  }
}

void main() {
  var miri = Player(name: 'miri', xp: XPLevel.biginner, team: Team.red)
    ..name = 'mirigu'
    ..xp = XPLevel.medium
    ..team = Team.blue
    ..sayHello();
}

8. Inheritance(상속)

  • flutter에서는 가끔씩만 사용하지만, 꼭 알아둬야하는 중요한 개념
class Human {
  final String name;

  Human(this.name);

  void sayHello() {
    print("Hi, my name is $name");
  }
}

enum Team { red, blue }

class Player extends Human {
  final Team team;

  Player({
    required this.team,
    required String name,
  }) : super(name);
  // super라는 키워드를 통해 (확장한) 부모 클래스와 상호작용할 수 있게 해줌
  // super에 name을 전달하면 이 클래스를 전달한 name과 함께 호출됨

  @override
  void sayHello() {
    super.sayHello(); // Human의 print("Hy my name is $name");을 불러옴
    print("and I play for $team");
  }
}

void main() {
  var player = Player(team: Team.blue, name: 'miri');
  player.sayHello(); // Human에 sayHello 메서드가 구현되어 있고, Player는 Human을 상속받음
}

9. Mixins

  • flutter에서 꽤나 자주 사용함
  • 생성자가 없는 클래스를 의미함
  • 클래스에 프로퍼티를 추가할 때 사용함
  • 다른 클래스에 여러번 재사용이 가능함
  • extend는 확장한 그 클래스는 부모클래스가 되고, 자식클래스는 부모클래스를 super를 통해 접근할 수 있고,
  • Mixin의 with는 내부의 프로퍼티와 메소드를 가져오는 역할
class Strong {
  final double strengthLevel = 1500.99;
}

class QuickRunner {
  void runQuick() {
    print('ruuuuuuuuun!');
  }
}

class Tall {
  final double height = 1.99;
}

enum Team { red, blue }

class Player with Strong, QuickRunner, Tall { 
	// with를 사용해서 다른 클래스의 프로퍼티와 메소드를 긁어옴
  final Team team;

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

class Horse with Strong, QuickRunner {}

class Kid with QuickRunner {}

void main() {
  var player = Player(team: Team.blue);
  player.runQuick();
}

'Study' 카테고리의 다른 글

Flutter에서 위젯(Widget)이란?  (0) 2024.08.29
Flutter vs React Native, 어떤 걸 선택할까? 🤔  (0) 2024.08.26
[Flutter] Dart - 3. Function  (0) 2024.08.25
[Flutter] Dart - 2. Data Type  (0) 2024.08.25
[Flutter] Dart - 1. Variables  (0) 2024.08.25