mansoorrr 2023. 12. 7. 22:57
  • function에서 property를 정의할때는 var만 사용해도 무관
  • class에서 property를 정의할때는 type을 명시하여 정의
# 예제 클래스 생성
class Player {
  String name = "mansoor"; #property 초기화
  int age = 20;
}

void main() {
  var player = Player();
  print(player.name);
  print(player.age);
  
  # property update
  player.name = "roosnam";
  print(player.name);
}

 

  • class의 property를 변경하게 하지 못하게 하려면 final 추가
#final타입 추가
class Player {
  final String name = "mansoor"; #final 추가
  int age = 20;
}

void main() {
  var player = Player();
  print(player.name);
  print(player.age);
  
  #update 불가
  #player.name = "roosnam";
  #print(player.name);
}

 

  • class내에 method 정의
  • 아무것도 return하지 않을 것이기 때문에 void로 정의
  • 클래스 내 property와 var(변수)가 이름이 겹치지 않는 이상 this.property라고 사용하지 않음
class Player {
  String name = "mansoor";
  int age = 20;
  
  #${this.name}이 아니라 $name이라고 씀
  void myInfo() {
    print("My name is $name");
  }
}

void main() {
  var player = Player();
  print(player.name);
  print(player.age);
  player.myInfo();
}

 

Constructor Method

  • class에 parameter를 넘기는 방법
  • parameter로 들어온 값으로 property의 값을 업데이트
  • class의 이름과 같아야 함
  • Constructor Method에 인자로 property를 넣어주고 method안에는 this.property = property 형식으로 입력
class Player {
  late final String name;
  late int age;
  
  #class의 이름과 동일하게 Constructor Method작성
  Player(String name, int age) {
    this.name = name;
    this.age = age;
  }
  
  void myInfo() {
    print("my name is $name");
  }
}

void main() {
  var player1 = Player("mansoor", 20);
  print(player1.name);
  player1.myInfo();
  
  var player2 = Player("sley", 18);
  player2.myInfo(); 
  
  var player3 = Player("arigato", 30);
  print(player3.age);
  player3.myInfo(); 
}

 

  • 기본에서 조금 더 간결하게 쓰기 위한 방법이 있음
  • Constructor Method의 인자로 들어가는 곳에 바로 this.property를 작성해줌
  • class에서는 late타입을 지워줌
class Player {
  # late타입 삭제
  final String name;
  int age;
  
  # 인자로 바로 this.property 넘기기
  Player(this.name, this.age);
  
  void myInfo() {
    print("my name is $name");
  }
}

void main() {
  var player1 = Player("mansoor", 20);
  print(player1.name);
  player1.myInfo();
  
  var player2 = Player("sley", 18);
  player2.myInfo(); 
  
  var player3 = Player("arigato", 30);
  print(player3.age);
  player3.myInfo(); 
}

 

Named Constructor Parameter

  • 일반 Constructor Method를 쓸 경우 position을 기억해야만 함
  • 이것은 property의 위치를 기억해서 써야 하는 번거로움이 있음
  • 그리고 property가 많아지면 기억하기가 어려움
  • 따라서 property를 명시하고 쓰는 Named Constructor Parameter방식이 주로 사용됨
class Player {
  final String name;
  final int age;
  final String country; #property 추가
  
  # {}와 required를 이용해 named parameter 적용
  Player({
    required this.name,
    required this.age,
    required this.country,
  });
  
  void myInfo() {
    print("my name is $name");
  }
}

void main() {
  # property들의 위치를 변경해서 써도 실행됨
  var player1 = Player(
    age: 20,
    name: "mansoor",
    country: "America"
  );
  print(player1.name);
  player1.myInfo();
  
  var player2 = Player(
    country: "Africa",
    name: "slie",
    age: 44
  );
  player2.myInfo();
}

 

Named Constructor

  • class에 속하지만 새로운 형식으로 class를 사용하고 싶을때 사용
  • 원래 class의 property를 받지만 초기화된 property로 사용됨
class Player {
  # 초기 property 설정
  final String name, country; #이렇게도 쓸 수 있음
  int age;
  
  #constructor 
  Player({
    required this.name,
    required this.country,
    required this.age,
  });
  
  #named constructor
  Player.createAfrica({
    required String name, #named constructor에서 사용할 property 넣어줌
    required String country,
  }) : this.name = name, #property 초기화
  this.country = country,
  this.age = 20; # 상위 클래스에서 사용한 property이므로 이와같이 초기화 가능
}

void main() {
  var player1 = Player(
    name: "mansoor",
    age: 25,
    country: "America"
  );
  print(player1.name);
  
  # named constructor 사용
  var player2 = Player.createAfrica(
    name: "named mansoor",
    country: "Africa",
  );
  print(player2.name);
  print(player2.country);
  print(player2.age);
}