Languages/Dart

[노마드코더] #5 Classes

성중 2023. 1. 12. 14:55

Your First Dart Class

class Player {
  final String name = "yee";
  int age = 23;
  
  void sayHi() {
    print("Hi my name is $name");
  }
}

void main() {
  var player = Player();
  
  player.sayHi();
}
  • class에서 property는 var 키워드가 아닌 타입 지정으로 선언 (final 가능)
  • 인스턴스 생성시 new 키워드 생략 가능, var 키워드 변수에 대입
  • class method에서 property 접근 시 this는 기본적으로 생략 가능

 

Constructors

class Player {
  /* late final String name;
  late int age;
  
  Player(String name, int age) {
    this.name = name;
    this.age = age;
  } */
  
  final String name;
  int age;
  
  Player(this.name, this.age);
  
  void sayHi() {
    print("Hi my name is $name");
  }
}

void main() {
  var player1 = Player("yee", 23);
  var player2 = Player("봙봙", 3);
  
  player1.sayHi();
  player2.sayHi();
}
  • constructor method(생성자 함수)의 이름은 class 이름과 같아야 함
  • 원래 필드를 late로 선언해야 하지만 생성자 축약형 사용 시 생략 가능

 

Named Constructor Parameters

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

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

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

void main() {
  var player1 = Player(
    name: "yee",
    age: 23,
    team: "blue",
    xp: 1200,
  );
  var player2 = Player(
    name: "봙봙",
    age: 3,
    team: "red",
    xp: 150,
  );

  player1.sayHi();
  player2.sayHi();
}
  • 생성자 함수도 positional parameter를 named parameter로 변환 가능
  • 마찬가지로 null safety를 위해 초기값을 지정하거나 required 붙이기

 

Named Constructors

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

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

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

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

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

void main() {
  var player1 = Player.createBluePlayer(
    name: "yee",
    age: 23,
  );
  var player2 = Player.createRedPlayer("봙봙", 3);

  player1.sayHi();
  player2.sayHi();
}
  • Flutter에서 constructor를 여러 개 만들 때 많이 사용하는 패턴
  • 콜론(:) 이후 원하는 매개변수만 할당 및 기본 값 초기화

 

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 sayHi() {
    print("Hi my name is $name from $team team");
  }
}

void main() {
  var apiData = [
    {
      "name": "A",
      "team": "blue",
      "xp": 0,
    },
    {
      "name": "B",
      "team": "red",
      "xp": 0,
    },
    {
      "name": "C",
      "team": "blue",
      "xp": 0,
    },
  ];

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

    player.sayHi();
  });
}
  • API fetching에서 주로 사용되는 fromJson named constructor 패턴

 

Cascade Notation

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

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

  void sayHi() {
    print("Hi my name is $name from $team team (age: $age, xp: $xp)");
  }
}

void main() {
  /* var yee = Player(
    name: "yee",
    age: 23,
    team: "blue",
    xp: 1200,
  );

  yee.name = "봙봙";
  yee.age = 3;
  yee.team = "red";
  yee.xp = 150; */

  var yee = Player(
    name: "yee",
    age: 23,
    team: "blue",
    xp: 1200,
  )
    ..age = 3
    ..team = "red"
    ..xp = 150;

  yee..name = "봙봙";

  yee.sayHi();
}
  • 프로퍼티 변경을 ..(cascade notation)으로 축약해 표현 가능
  • 인스턴스 자체를 변경하기 때문에 할당과 관계없이 원본 수정

 

Enums

enum Team {blue, red}

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

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

  void sayHi() {
    String team = this.team.name;
    
    print("Hi my name is $name from $team team (age: $age, xp: $xp)");
  }
}

void main() {
  var yee = Player(
    name: "yee",
    age: 23,
    team: Team.blue,
    xp: 1200,
  );

  yee.sayHi();
}
  • Dart의 Enums는 개발자가 그냥 넘어가기 쉬운 오타 방지에 유용
  • {}(중괄호) 안에 문자열이 아닌 형태 그대로 넣어 새로운 타입을 생성
  • enum 타입을 변수 선언에 활용해 선택의 폭을 제한 및 자동 완성
  • 문자열로 활용하려면 enum의 name property를 String 변수에 대입
  • Flutter의 Color 시스템 등도 enum으로 구성

 

Abstract Classes

enum Team {blue, red}

abstract class Human {
  void walk();
}

class Player extends Human {
  String name;
  int age, xp;
  Team team;

  Player({
    required this.name,
    required this.age,
    required this.team,
    required this.xp,
  });
  
  void walk() {
    print("I'm walking");
  }

  void sayHi() {
    String team = this.team.name;
    
    print("Hi my name is $name from $team team (age: $age, xp: $xp)");
  }
}

void main() {
  var yee = Player(
    name: "yee",
    age: 23,
    team: Team.blue,
    xp: 1200,
  );

  yee.sayHi();
  yee.walk();
}
  • 추상 클래스에 메소드 이름과 타입만 정의해 상속받은 클래스에게 구현 강제
  • 각각의 클래스에 새로 정의된 추상 메소드는 서로 내용이 다를 수 있는 다형성을 가짐
  • Flutter에서 자주 사용되는 개념은 아님

 

Inheritance

enum Team { blue, red }

class Human {
  final String name;

  Human({required this.name});

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

class Player extends Human {
  Team team;

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

  @override
  void sayHi() {
    String team = this.team.name;

    super.sayHi();
    print("I'm from $team team");
  }
}

void main() {
  var yee = Player(
    name: "yee",
    team: Team.blue,
  );

  yee.sayHi();
}
  • super 키워드와 (:)로 상위 클래스 생성자 접근 가능
  • (parameter 수가 적어도 positional or named 선택은 자유)
  • super 키워드로 상위 클래스 함수 접근 가능 (+ method override 가능)
  • Flutter에서 자주 사용되는 개념은 아님

 

Mixins

class Strong {
  final double strengthLevel = 1500.99;
}

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

enum Team { blue, red }


class Player with Strong, QuickRunner {
  Team team;

  Player({
    required this.team,
  });

  void sayHi() {
    String team = this.team.name;

    print("I'm from $team team (strength: $strengthLevel)");
  }
}

class Horse with QuickRunner {}

void main() {
  var yee = Player(
    team: Team.blue,
  );  
  var horse = Horse();

  yee.sayHi();
  yee.runQuick();
  horse.runQuick();
}
  • Flutter에서 자주 사용되는 개념이며, 생성자가 없는 클래스를 의미
  • 클래스 상속과 달리 extends 키워드가 아닌 with 키워드로 구현
  • 프로퍼티나 메소드 모음을 여러 클래스에 전달해 재사용하려는 목적

 

본 내용은 노마드코더의 'Dart 시작하기'를 바탕으로 작성되었습니다

'Languages > Dart' 카테고리의 다른 글

[글또] JavaScript 개발자와 Dart 찍먹하기  (0) 2023.02.11
[노마드코더] #4 Functions  (0) 2023.01.09
[노마드코더] #3 Data Types  (0) 2023.01.09
[노마드코더] #2 Variables  (0) 2023.01.08
[노마드코더] #1 Introduction  (0) 2023.01.04