Dart 언어 오답노트 : 17. named constructor

샤워실의 바보·2023년 10월 25일
0
post-thumbnail

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

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

  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)
      : name = name,
        age = age,
        team = 'red',
        xp = 50;
}

void main() {
  var player = Player.createBluePlayer(
    name: 'nico',
    age: 12,
  );

  print(player.name); // nico
  print(player.age); // 12

  var player2 = Player.createRedPlayer('joe', 200);

  print(player2.name); // joe
  print(player2.age); // 200
}

version 1.

이 코드는 Dart 언어에서 클래스와 생성자를 사용하는 방법을 보여줍니다. 특히, Named Constructor (이름이 있는 생성자)와 this 키워드의 사용에 초점을 맞추고 있습니다.

클래스와 필드

Player라는 클래스가 정의되어 있고, name, xp, age, team이라는 네 개의 필드가 있습니다.

기본 생성자

Player 클래스에는 필드를 초기화하는 기본 생성자가 있습니다. 이 생성자는 이름이 없고, {} 안에 required 키워드와 함께 필드 이름을 정의하여, 이 필드들이 반드시 제공되어야 함을 나타냅니다.

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

Named Constructor (이름이 있는 생성자)

Player 클래스에는 두 개의 이름이 있는 생성자, createBluePlayercreateRedPlayer가 있습니다.

createBluePlayer 생성자

Player.createBluePlayer({
  required String name,
  required int age,
})  : this.name = name,
      this.age = age,
      this.team = 'blue',
      this.xp = 0;
  • createBluePlayer 생성자는 nameage를 매개변수로 받아오며, team은 'blue'로, xp는 0으로 고정입니다.
  • Dart에서는 이런 방식으로 고정된 값을 가진 필드를 초기화 할 수 있습니다.

createRedPlayer 생성자

Player.createRedPlayer(String name, int age)
    : name = name,
      age = age,
      team = 'red',
      xp = 50;
  • createRedPlayer 생성자는 nameage를 매개변수로 받아오며, team은 'red'로, xp는 50으로 고정입니다.

main 함수

main 함수에서는 이 두 개의 이름이 있는 생성자를 사용하여 두 개의 Player 객체를 생성합니다.

var player = Player.createBluePlayer(
  name: 'nico',
  age: 12,
);
  • createBluePlayer 생성자를 사용하여 name은 'nico', age는 12로 설정한 Player 객체를 생성합니다. team은 'blue', xp는 0으로 고정됩니다.
var player2 = Player.createRedPlayer('joe', 200);
  • createRedPlayer 생성자를 사용하여 name은 'joe', age는 200으로 설정한 Player 객체를 생성합니다. team은 'red', xp는 50으로 고정됩니다.

출력

생성된 두 객체의 nameage 필드를 출력합니다.

print(player.name); // nico
print(player.age); // 12

print(player2.name); // joe
print(player2.age); // 200

이 예제를 통해 Dart에서 클래스, 필드, 기본 생성자, 이름이 있는 생성자를 어떻게 정의하고 사용하는지 이해할 수 있습니다.

version 2.

Dart 언어에서는 생성자를 다양한 방법으로 정의할 수 있으며, 명명된 생성자(named constructor)를 통해 특정 목적에 맞게 여러 개의 생성자를 제공할 수 있습니다.

기본 생성자

Player 클래스에는 기본 생성자가 하나 있으며, 이 생성자는 name, xp, team, age 네 개의 필드를 초기화합니다. Dart 언어에서는 생성자의 매개변수 앞에 this 키워드를 사용하면, 매개변수 이름과 동일한 이름의 인스턴스 변수를 직접 초기화할 수 있습니다.

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

명명된 생성자: createBluePlayer

createBluePlayer는 명명된 생성자로, nameage만 매개변수로 받습니다. team은 'blue'로, xp는 0으로 초기화됩니다. 여기서도 this.namethis.age를 사용하여 인스턴스 변수를 직접 초기화하고 있습니다.

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

명명된 생성자: createRedPlayer

createRedPlayer 역시 명명된 생성자로, nameage를 매개변수로 받습니다. 그러나 이 생성자에서는 초기화 리스트를 사용하여 team을 'red'로, xp를 50으로 초기화합니다.

Player.createRedPlayer(this.name, this.age)
    : team = 'red',
      xp = 50;

main 함수

main 함수에서는 createBluePlayercreateRedPlayer 생성자를 사용하여 두 개의 Player 객체를 생성하고, 각각의 속성을 출력합니다.

var player = Player.createBluePlayer(
  name: 'nico',
  age: 12,
);

print(player.name); // nico
print(player.age); // 12

var player2 = Player.createRedPlayer('joe', 200);

print(player2.name); // joe
print(player2.age); // 200

이 코드는 Dart의 생성자 초기화와 명명된 생성자 사용을 보여주는 좋은 예입니다. Dart 언어는 이러한 기능을 통해 더 유연하고 표현력 있는 코드 작성을 가능하게 합니다.

version 3.

이 코드는 Dart 프로그래밍 언어를 사용한 간단한 예시로, Idol이라는 클래스를 정의하고, 이 클래스를 사용하여 K-Pop 아이돌 그룹에 대한 정보를 나타내는 객체를 생성하는 방법을 보여줍니다.

Idol 클래스

Idol 클래스는 두 개의 필드, namemembers를 가지고 있으며, 이들은 각각 아이돌 그룹의 이름과 멤버들의 이름을 저장합니다. 이 클래스에는 두 개의 생성자와 두 개의 메서드가 정의되어 있습니다.

  1. 기본 생성자: namemembers를 직접 전달받아 초기화합니다.

    Idol(this.name, this.members);
  2. 명명된 생성자 (fromList): 리스트를 전달받아 membersname을 초기화합니다. 이 때, 리스트의 첫 번째 요소는 멤버들의 이름을 담은 리스트여야 하고, 두 번째 요소는 그룹의 이름이어야 합니다.

    Idol.fromList(List values)
       : this.members = List<String>.from(values[0]),
         this.name = values[1];
    
  3. sayHello 메서드: 그룹의 이름을 출력하는 메서드입니다.

    void sayHello() {
      print('안녕하세요, 우리는 $name입니다.');
    }
  4. introduce 메서드: 그룹의 이름과 멤버들의 이름을 출력하는 메서드입니다.

    void introduce() {
      print('$name는 $members로 구성되어 있습니다.');
    }

main 함수

main 함수에서는 Idol.fromList 생성자를 사용하여 BTS라는 Idol 객체를 생성하고, 그 객체의 sayHellointroduce 메서드를 호출하여 정보를 출력합니다.

void main() {
  var BTS = Idol.fromList([
    ['뷔', '정국', 'RM', '진', '제이홉', '슈가', '지민'],
    'BTS'
  ]);
  BTS.sayHello();
  BTS.introduce();
}

출력 결과

안녕하세요, 우리는 BTS입니다.
BTS는 [뷔, 정국, RM, 진, 제이홉, 슈가, 지민]로 구성되어 있습니다.
profile
공부하는 개발자

0개의 댓글