class Player{
  final String name;
  int? xp, age;
  String? team;
  
  Player({required this.name, this.xp, this.team, this.age}); //constructor
  
  //Player.createBluePlayer는 메서드가 아니라 Named Constructor (이름있는 생성자)
  // ':' :  Player를 초기화하는 역할
  Player.createBluePlayer({required String name, required int age})
    : this.age = age,
      this.name = name,
      this.team = "blue",
      this.xp = 0;
  
  void display(){
    print("Hi My name is $name");
  }
}


void main(){
  Player p = Player(name:"asd",xp: 21);
  print(p.name);
  p.display();
  
  
}

 

 

그냥 생성자만 하면되는데 왜 이름있는 생성자를 쓸까?

 

같은 클래스에서 목적에 따라 다양한 방식으로 객체를 생성할 수 있어서입니다.

// 일반 생성자
Player p1 = Player(name: "asd", xp: 21);

// 블루팀 전용 생성자
Player p2 = Player.createBluePlayer(name: "nico", age: 20);

// 레드팀 전용 생성자
Player p3 = Player.createRedPlayer(name: "lynn", age: 25);

일반 생성자만 쓰면 매번 이렇게 해야 하죠.

Player p = Player(name: "nico", age: 20, team: "blue", xp: 0);

팀 색깔별, 역할별로 객체를 자주 만들어야 할 때 named constructor를 쓰면 코드 가독성 실수 방지 측면에서 유리합니다. 블루팀 생성자를 쓰면 team이나 xp를 빠뜨릴 일이 없으니까요.

 

 

class Player{
  final String name;
  int? xp, age;
  String? team;
  
  Player({required this.name, this.xp, this.team, this.age}); //constructor
  
  //Player.createBluePlayer는 메서드가 아니라 Named Constructor (이름있는 생성자)
  // ':' :  Player를 초기화하는 역할
  Player.createBluePlayer({required String name, required int age})
    : this.age = age,
      this.name = name,
      this.team = "blue",
      this.xp = 0;
  Player.createRedPlayer({required String name, required int age})
    : this.name= name,
      this.age = age,
      this.team = "red",
      this.xp = 0;
  void display(){
    print("Hi My name is $name");
  }
}


void main(){
  Player p = Player(name:"asd",xp: 21);
  p.display();

  Player pred = Player.createBluePlayer(name: "red",age: 23);
  Player pblue = Player.createBluePlayer(name: "blue",age: 25);
  pred.display();
  pblue.display();
  
}


#출력
Hi My name is asd
Hi My name is red
Hi My name is blue

 

 

활용

Json 형태의 api를 받아서 객체 생성

class Player{
  final String name;
  int? xp, age;
  String? team;
  
  Player.fromJson(Map<String, dynamic> playerJson):
      name = playerJson["name"],
      xp = playerJson["xp"],
      team = playerJson["team"];

  void display(){
    print("Hi My name is $name");
  }
}


void main(){
  var apiData = [
  {
    "name":"aaa",
    "team":"red",
    "xp":0,
  },
  {
    "name":"bbb",
    "team":"blue",
    "xp":0,
  },
  {
    "name":"ccc",
    "team":"blue",
    "xp":0,
  }
];
  apiData.forEach((playerJson){
    var player = Player.fromJson(playerJson);
    player.display();
  });
  
}


#출력
Hi My name is aaa
Hi My name is bbb
Hi My name is ccc

 

여기서 forEach 문법도 유념하자. foreach((playerJson) { ...은 apiData json의 원소

 

namedConstructor는 많이 사용할 것이니 잘 익혀두자.

'DART&Flutter' 카테고리의 다른 글

Dart) 오버라이딩  (0) 2026.05.19
Dart) Cascade operator  (0) 2026.05.19
Dart) 클래스 생성자 및 Named Parameters  (0) 2026.05.18
Dart) final vs const  (2) 2026.05.15
Dart) late 관련 코드  (0) 2026.05.15

+ Recent posts