[노마드코더] Dart 시작하기 #4 CLASSES 정리

레일리·2024년 11월 1일
0
post-thumbnail

DartPad에서 설치 없이 연습 가능
노마드코더 Dart 시작하기에서 무료 수강 가능

#4.0 Your First Dart Class

  • Class에서 property를 선언할때는 타입을 사용해 정의
  • Dart의 클래스에서는 this를 사용할 필요가 없음
  • Class method 내에서의 this는 사용하지 않는것이 권고되고 있음
    • method 내에서 같은 이름의 variable가 있는 경우는 제외
class Player {
  final String name = 'nico';
  int xp = 1500;

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

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

#4.1 Constructors

  • constructor(생성사) method의 이름은 class의 이름과 같아야 함
  • 생성자 개선전
class Player {
  late final String name;
  late int xp;

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

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

void main() {
  var player = Player("nico", 1500);
  player.sayHello();
  var player2 = Player("lynn", 2500);
  player2.sayHello();
}
  • 생성자 개선후 (파라미터 위치가 중요)
class Player {
  late final String name;
  late int xp;

  Player(this.name, this.xp);

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

#4.2 Named Constructor Parameters

  • 생성자에서 positional argument가 많으면 가독성/사용성이 떨어짐
    • named argument를 가진 constructor가 필요
    • 중괄호({})로 감싸기
    • Flutter엔 전적으로 named argument 방식이 많음
  • 생성자 argument에 required 또는 default value를 설정해야 함
class Player {
  late final String name;
  late int xp;
  String team;
  int age;

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

void main() {
  var player = Player(
    name: "nico",
    xp: 1500,
    team: 'blue',
    age: 21,
  );
  var player2 = Player(
    name: "lynn",
    xp: 2500,
    team: 'blue',
    age: 12,
  );
}

#4.3 Named Constructors

  • 생성자에 이름을 붙여 서로 다른 생성자로 사용 가능
  • 콜론(:)을 넣음으로써 Dart에게 Player 객체를 초기화하겠다고 명령
class Player {
  late final String name;
  late int xp;
  String team;
  int age;

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

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

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

void main() {
  var player = Player.createBluePlayer(
    name: "nico",
    age: 21,
  );
  var redPlayer = Player.createRedPlayer("lynn", 12);
}

#4.4 Recap

  • API 데이터를 객체로 만드는 방법
class Player {
  late final String name;
  late 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": "nico",
      "team": "red",
      "xp": 0,
    },
    {
      "name": "lynn",
      "team": "red",
      "xp": 0,
    },
    {
      "name": "dal",
      "team": "red",
      "xp": 0,
    },
  ];

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

#4.5 Cascade Notation

  • 반복되는 인스턴스(객체)의 접근을 ..으로 대체할 수 있음
  • ..은 바로 앞의 인스턴스(객체)를 가르킴
  • 세미콜론은 마지막에만 붙여주면 됨
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 nico = Player(name: 'nico', xp: 1200, team: 'red');
  var potato = nico
    ..name = 'las'
    ..xp = 120000
    ..team = 'blue'
    ..sayHello();
}

#4.6 Enums

  • Enums는 선택의 폭을 좁혀주는 역할을 함
  • 미리 정의된 상수들의 집합을 뜻 함
enum Team { red, blue }

enum XPLevel { beginner, 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 nico = Player(name: 'nico', xp: XPLevel.medium, team: Team.red);
  var potato = nico
    ..name = 'las'
    ..xp = XPLevel.pro
    ..team = Team.blue
    ..sayHello();
}

#4.7 Abstract Classes

  • 추상화 메소드, 클래스
  • 추상화 클래스로는 객체를 생성할 수 없음
  • 추상화 클래스는 다른 클래스들이 직접 구현 해야하는 메소드들을 모아 놓은 일정의 청사진
  • 사용하고 싶은 Class에서 extends라는 키워드와 함께 추상클래스 붙이기
  • Flutter를 사용할 때에는 그다지 많이 사용하게 되진 않을 것임
  • 추상화 클래스는 특정 메소드를 구현하도록 강제함
abstract class Human {
  void walk();
}

enum Team { red, blue }

enum XPLevel { beginner, medium, pro }

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

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

  void walk() {
    print('im walking');
  }

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

void main() {
  var nico = Player(name: 'nico', xp: XPLevel.medium, team: Team.red);
  nico.walk();
}

#4.8 Inheritance

  • 상속, Flutter에선 가끔씩만 사용하게 되겠지만 꼭 알아둬야하는 중요한 개념
  • 자식 클래스는 부모의 생성자(프러퍼티)도 채워줘야 함
  • super라는 키워드를 통해 부모 클래스와 상호작용할 수 있게 해줌
  • 콜론을 적고 그 뒤에 super 생성자를 호출
  • 부모 메소드를 재정의 할 수 있음
class Human {
  final String name;
  Human({required this.name});
  void sayHello() {
    print("Hi my name is $name");
  }
}

enum Team { blue, red }

class Player extends Human {
  final Team team;

  Player({
    required this.team,
    required String name,
  }) : super(name: name);

  
  void sayHello() {
    super.sayHello();
    print('and I play for ${team}');
  }
}

void main() {
  var player = Player(team: Team.red, name: 'nico');
  player.sayHello();
}

#4.9 Mixins

  • Mixin은 생성자가 없는 클래스를 의미 함
  • 클래스에 프로퍼티들을 추가하거나 할 때 사용
  • 다른 클래스의 프로퍼티와 메소드를 그냥 긁어다 오는 것 뿐
  • Mixin의 핵심은 여러 클래스에 재사용이 가능하다는 점
  • Mixin의 조건은 생성자가 없는 클래스여야 함
mixin class Strong {
  final double strenghtLevel = 1500.99;
}

mixin class QuickRunner {
  void runQuick() {
    print("ruuuuuun!");
  }
}

mixin class Tall {
  final double height = 1.99;
}

enum Team { blue, red }

class Player with Strong, QuickRunner, Tall {
  final Team team;

  Player({required this.team});
}

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

#4.10 Conclusions

profile
나야, 개발자
post-custom-banner

0개의 댓글