04. class

mhlee·2023년 11월 10일

dart

목록 보기
4/4

1. class 선언

  • class 키워드를 이용해서 선언한다.

  • 문법은 java와 거의 동일하다.

  • 생성자는 클래스명과 동일한 메소드를 통해 선언한다.

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

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

  void sayHello() {
    print('Hello $name');
  }
}

void main() {
  var player = Player('Ronaldo', 36, 100, 'Juventus');
  print(player.name);
}

2. class 생성자 선언 축약

  • 아래와 같이 축약된 생성자 문법을 이용할 수 있다.

  • 기본 예제와 다르게 프로퍼티 선언부에 late 키워드가 필요 없다.

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

  Player(this.name, this.age, this.xp, this.team);

  void sayHello() {
    print('Hello $name');
  }
}

void main() {
  var player = Player('Ronaldo', 36, 100, 'Juventus');
  print(player.name);
}

3. class 생성자 named parameter

  • function의 named parameter와 동일하게 생성자에도 적용 가능하다.
class Player {
  final String name;
  int age, xp;
  String team;

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

  void sayHello() {
    print('Hello $name');
  }
}

void main() {
  var player = Player(
    name: 'Ronaldo',
    age: 36,
    xp: 100,
    team: 'Juventus',
  );
  print(player.name);
}

4. class 생성자 named constructor

  • java나 kotlin의 정적 생성자와 비슷한 개념이다.

  • 클래스명.메소드명 형태로 named constructor 생성이 가능하다.

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

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

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

  void sayHello() {
    print('Hello $name');
  }
}

void main() {
  var player = Player.createRedTeam(
    name: 'Ronaldo',
    age: 36,
    xp: 100,
  );
  print(player.name);
}

5. json 파싱 named constructor

  • 실제 업무에서는 json을 파싱하여 class로 변환하는 경우가 많다.

  • 클래스명.fromJson 형태로 named constructor를 생성하여 사용하는 경우가 많이 있다.

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

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

  void sayHello() {
    print('Hello $name');
  }
}

void main() {
  var players = [
    {
        "name": "lee",
        "age": 47,
        "xp": 0,
        "team": "red"
    },
    {
        "name": "ho",
        "age": 11,
        "xp": 0,
        "team": "blue"
    },    
  ];
  
  players.forEach((p) {
    var player = Player.fromJson(p);
    player.sayHello();
  });
}

6. cascade notation

  • java나 kotlin의 chaning 같은 개념이다.

  • .. 연산자를 이용해 객체의 메소드를 연속으로 호출할 수 있는 문법이다.

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

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

  void sayHello() {
    print('Hello $name');
  }
}

void main() {
  var players = [
    {
        "name": "lee",
        "age": 47,
        "xp": 0,
        "team": "red"
    },
    {
        "name": "ho",
        "age": 11,
        "xp": 0,
        "team": "blue"
    },    
  ];
  
  players.forEach((p) {
    var player = Player.fromJson(p)
    
    player.sayHello();
  });
}

7. mixin

  • 상속과 다르게 mixin은 해당 클래스의 프로퍼티, 메소드를 가져온다.

  • 당연히 상속관계는 성립되지 않는다.

  • with라는 키워드를 이용하며, 생성자가 없는 클래스에 한정해서 mixin이 가능하다.

profile
삽질하는 개발자

0개의 댓글