나만의 개발노트

[Dart] Class 1 - Class / Constructor / Named Constructor 본문

[Flutter]/[Dart]

[Dart] Class 1 - Class / Constructor / Named Constructor

노트포미 2024. 7. 15. 22:06

1. Class 

  • class 내부의 property는 타입을 반드시 선언해야 한다.
  • 외부에서 객체의 변수를 변경하지 못하게 하려면 final을 붙여준다
  • class method안에 동일한 이름의 변수가 있는게 아니면 this 는 쓰지 않는 것 권장
  • 객체를 생성할 때, new 사용하지 않아도 됨
class Player{
	//외부에서 변경할 수 없게 final
	final String name = "mokjak";
    final int age = 20;
    
    void sayHello(){
    	//class method 안에서 this를 쓰지 않는다(권장)
        print("Hi my name is $name");
    }
}

void main(){
	//선언할 때, new를 붙이지 않아도 된다.
    var player1 = Player();
    print(player1.name); //output : mokjak
    player1.sayHello(); //output : Hi my name is mokjak
}

2. Constructors(생성자)

: 객체(object, instance)를 생성할 때, 초기화하는 메서드

  • class이름과 동일하게 정의해야 함.
  • parameter로 데이터를 전달 받아 설정하려면, late 키워드 필요
class Player{
	late final String name;
    late int age;
    
    //class이름과 동일한 이름의 constructor(생성자)
    Player(String name, int age){
    	//this(이 객체)의 name에 전달받은 name할당
    	this.name = name;
        this.age = age;
    }
}
    
void main(){
    var player1 = Player("mokjak",20);
}

 

*조금 더 간단하게 표기하기

//기존 코드
class Player{
	late final String name;
    late int age;
    
    Player(String name,int age){
    	this.name = name;
        this.age = age;
    }
}

//더 간편한 코드
class Player{
	//late 표기 안해도 됨
	final String name;
    int age;
    //parameter(arguments)의 순서는 유지
    //첫번째 파라미터를 this.name에, 두번째 파라미터를 this.age에 할당한다.
    Player(this.name,this.age);
}

2. Named Constructor Parameter

: 생성자에 parameter를 전달할 때, 순서 상관 없이 더 가독성 있게 전달하는 방법

*function Parameter방법과 동일

  Positional constructor parameter named constructor parameter
특징 순서가 맞아야 함
-> 3개 미만의 parameter에서 적합
property이름을 명시하고, 순서가 달라도 됨 
-> 3개 이상의 parameter를 요구하는 경우 적합
사용 중괄호 x { } (중괄호) 필요
required 필요 x default 설정을 하거나, required 키워드 사용해야 함
예시 코드 Player(String name, int age){ ... }; Player({required String name, int age = 99}){...};

 

/*positional constructor parameter*/
Player(String name, int age, int xp, String team){
    this.name = name;
    ...
}
//호출 시 순서 필요, 무엇인지 파악 어려움
var player = Player('abc', 12, 0, 'red');



/*named constructor parameter*/
//required 작성해야 함
Player({required String name, required int age, required int xp, required String team}){
    ...
}
//호출시 속성(property)알 수 있음. 순서 필요x
var player = Player(
name: 'abc',
xp: 0,
age: 12,
team: 'red',
);

3. Named Constructors

:  생성자를 여러개 만드는 방법 (parameter의 종류,개수도 다를 수 있음)

  기본 방법 inital list 사용
요구사항 기본 생성자 이외에 name, age만 입력받고 team = 'red', xp = 0으로 초기화 하는 생성자
기본 코드 Player.createRedPlayer( ... ) ...
사용법 { } 사용 : 사용
특징 기본적인 방법. 복잡한 초기화에 적합 생성자 본문이 실행되기 전에 초기화하여 속도 빠름. 간단한 초기화에 적합

 

class Player{
	late final String name;
    late int age, xp;
    late String team;
    
    //기본 생성자
    Player(...){...};
    
    //Named Constructor1 - 기본 
    Player.createRedPlayer({required String name, required int age}){
    	this.name = name;
        this.age = age;
        this.team = 'red';
        this.xp = 0;
    }
    
    //Named Constructor2 - :(initial list)사용
    Player.createRedPlayer({required String name, required int age}) :
    	//, 로 연결 후 마지막만 ;
    	this.name = name,
        this.age = age,
        this.team = 'red',
        this.xp = 0;
        
    //Named Constructor2 - 간소화
    Player.createRedPlayer({required this.name, required this.age}) :
    	this.team = 'red',
        this.xp = 0;
}

5. Named Constructor 코딩해보기

미션)

- 구조화 되지 않은 player list를 받아서, Player객체를 만들어 출력하는 코드를 완성해라

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

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

  //여기에 Json으로부터 입력받은 구조화 되지 않은 player를 초기화하는 Named Constructor 구현
  Player.fromJson(...)

  void printInfo() {
    print("Hello, my name is $name and I'm in $team team. xp : $xp");
  }
}

void main() {
  var apiData = [
    {
      'name': 'A',
      'team': 'red',
      'xp': 12,
    },
    {
      'name': 'B',
      'team': 'red',
      'xp': 15,
    },
    {
      'name': 'C',
      'team': 'blue',
      'xp': 20,
    },
  ];

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

 


정답)

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

 

output)

 

'[Flutter] > [Dart]' 카테고리의 다른 글

[Dart] class2 - Cascade Notation / Enums  (0) 2024.07.16
[Dart] Functions (함수)  (0) 2024.07.13
[Dart] data type(데이터 타입)  (0) 2024.07.13
[Dart] Variables(변수)  (1) 2024.07.12