[dart 언어] flutter를 위한 Dart공부 - class

2023. 1. 14. 00:38flutter(플러터)

반응형

노마드코더님의 dart 무료강의를 공부해보자!

 

class Player {

String name =  '만수';

int age = 50;

class를 생설할 때는 타입을 꼭 명시!

 

void 안녕() {

var name = ''봉식";

print("my name is ${this.name}")

method내에 name이라는 변수가 있으면 this 써준다.

아니면 다 $변수임!

}

}

 

void main() {

  var player = Player();

  player.name = '몽진';

  name 바뀜!

player.안녕();

잘 작동함!

}

 

 

 

생성자(constructor) 함수 만들기!

class Player {

late final String name';

late int age;

late는 변수들의 값을 나중에 받아온다는 말임!!

 

Player(String name, int age){

  this.name = name;

  this.age = age;

}

 

void sayHello() {

  print ("my name is $.name") ;

}

 

 

void main() {

  var player1 = Player('만식', 30); 

  player1.sayHello();

  var player2 = Player('방식', 43);

  player2.sayHello();

}

 

 

But 이건 좀 반복적인 작업임!!!!!!!!!!!

타입을 아는데 밑에 또 타입을 적어주는 반복을 제거하자!

 

class Player {

final String name';

int age;

 

Player(this.name, this.age);

 

더 깔끔해짐!!

 

void sayHello() {

  print ("my name is $.name") ;

}

Named Constructor Parameters

class Player {

final String name';

int age;  ->  int age weight; 이렇게 같은 int라면 한번에 선언할 수 있음!

String color;

int weight;

 

 

constructor(생성자)

Player({

required this.name,

required this.age,

required this.color,

required this.weight,

});

 

함수에서 했던 방식이랑 같음!!

 

void sayHello() {

  print ("my name is $.name") ;

}

 

 

void main(){

var player = Player(

  name: '만숙',

  age: 20,

  color: 'gray',

  weight: 50

좋은 방식!!(이렇게 하면, 데이터가 많을 때도 argument의 위치를 기억하지 않아도 됨!)

);

  var player2 = Player('수박', 32, '파랑', 16);

 안 좋은 방식!

}

 

 

Named Constructors

createBluePlayer라는 새로운 메서드를 만듬

Player.createBluePlayer({

  required String name,

  required int age,

}) : this.age = age, //  : 가 player 클래스를 초기화해줌!

this.name = name,

this.team = 'blue', //고정값

this.xp = 0;  //고정값

 

 

void main(){

var player = Player.createBluePlayer(

  name: '만숙',

  age: 20,

);

void main(){

var player = Player.createRedPlayer(

  name: '만숙',

  age: 20,

);

 

Recap

api로 json format을 받으면 나는 이걸 class로 바꿔야한다.

 

 

payer 클래스의 생성과 초기화를 해줌!

class Player {

final String name';

int xp;

String team;

 

Player.fromJson(Map<String, danamic> playerJson) :

    name = playerJson['name'],

    xp= playerJson['xp'],

    team = playerJson['team'];

 

void sayHello(){

    print("HI my name is $name")

  }

}

 

void main(){

  var apiData = [

  {

    "name": "만수",

    "team": "blue",

    "xp": 0,

 },

  {

    "name": "만수",

    "team": "blue",

    "xp": 0,

 },

  {

    "name": "만수",

    "team": "blue",

    "xp": 0,

   }

  ];

 

  apiData.forEach((playerJson){

    var player = Player.fromJson(playerJson);

    player.sayHello();

});

}

 

Cascade Notation

 

void main(){

    var 수박 = Player(name: '수박', xp: 20, team: red)

    ..name = '박수'   // 수박.name ='박수'를 간소화 함!!

    ..xp = '12344'

    ..team = 'blue'

    ..sayHello(); 도 가능!

    아주 좋은 operator!

}

 

Enums

enum Team { red, blue};

enum XPLevel {beginner, medium, pro}

 

class Player {

  XPLevel xp;

 

실수를 줄여줌!

 

void main(){

  var 'man' = Player(

    xp: XPLevel.medium

    team: Team.blue

)

 

Abstract Classes(그렇게 중요하지는 않음..)

abstract class Human {

    void walk();

}

 

class Player extends Human{  //이렇게 하면 Human 클래스에 walk 메소드가 없다고 에러를 나타냄!

 

추상화 클래스는 특정 메소드를 구현하도록 강제함!

 

class Coach extends Human {

  void walk() {

    print('the coach is waling')

 }

}

Inheritance

class Human {

  final String name;

  Human(requied this.name);

  void sayHello(){

    print("hi my name is $name")

}

}

 

enum Team {blue, red}

 

class Player extends Human{   

   final Team team;

 

  Player({

    required this.team,

    required String name, //,를 적으면 잘 포맷팅해줌

}) : super(name: name); //부모 클래스의 생성자 호출!

 

@override

  void sayHello(){

    super.sayHello();  // 확장(상속)한 부모 클래스의 프로퍼티에 접근하게 하거나 메소드를 호출할 수 있게 함!

    print('and I play for ${team}');

}

 

}

 

void main() {

  var player = Player(team: Team.red);

}

 

 

 Mixins

생성자가 없는 클래스를 말함!

 

calss Strong {

  final double strenghtLevel = 134.34

Mixin의 조건은 생성자가 없는 클래스여야 함!

}

 

calss QuickRunner{

  void runQuick() {

    print("runnnnnn")

}

}

 

 

class Player with Strong, QuickRunner {

  다른 클래스의 프로퍼티와 메소드를 그냥 가저오는 것!

}

 

void main() {

  var player = Player(

    team: Team.red,

);

  player.runQuick();

}

 

extends랑 다름!

extend하면 확장한 클래스는 부모 클래스가 되고, 자식 클래스는 부모 클래스를 super를 통해서 접근 가능하며, 그 순간 부모 클래스의 인스턴스가 됨!

 

with은 단순히 내부의 프로퍼티와 메소드들을 가져오는 것임!

 

어느 소품샵에 있는 귀여운 돌맹이

 

모두 열공!

 

끝!!

반응형