Dart 04

rO_Or·2024년 3월 10일

Dart 그리고 Flutter

목록 보기
4/19

클래스

class Player {
  final String  name = 'name';
  final int age = 17;
  
  String sayHello() {
    return 'My name is $name';
  }
  
}

void main() {
  var player1 = Player();
  print(player1.sayHello());
}
  1. 인스턴스를 생성할 때 new 키워드를 작성하지 않아도 된다.
  2. 클래스 내부에서 변수를 호출할 때 this 키워드를 작성하지 않아도 된다.
    => 같은 변수 이름일 경우 구분하기 위해 this를 작성하는 경우도 있다.
    => 클래스 내 메소드에서는 this를 쓰지 않는 것을 권고한다고 한다.

생성자

class Player {
  final String name;
  final int age;
  
  Player(this.name, this.age);
  
//   Player(String name, int age) {
//     this.name = name;
//     this.age = age;
//	   이 방식으로 생성할 경우, 변수에 late를 작성해야 된다.
//   }
  
  String sayHello() {
    return 'My name is $name';
  }
  
}

void main() {
  var player1 = Player('name', 17);
  print(player1.sayHello()); // My name is name
  
  var player2 = Player('name2', 18);
  print(player2.sayHello()); // My name is name2
}

네임 생성자

class Player {
  final String name;
  final int age;
  final String team;
  final int height;
  
  Player({
    required this.name,
    required this.age,
    required this.team,
    required this.height
  });
  
  
  String sayHello() {
    return 'My name is $name';
  }
  
}

void main() {
  var player1 = Player(
    name: 'name',
    age: 17,
    team: 'red',
    height: 180,
  ); 
  print(player1.sayHello());
  
  var player2 = Player(
    name: 'name2',
    age: 18,
    team: 'puprle',
    height: 181,
  ); 
  print(player2.sayHello());
}
  1. 함수처럼 인자에 네임을 넣어서 생성할 수 있다.
  2. 기본 값을 줄 수도 있고, required를 쓸 수도 있다.

일부만 받아와서 초기화

class Player {
  final String name, team;
  final int age, height;
  // 같은 타입일 경우 한 줄에 선언할 수 있다.
  
  String sayHello() {
    return 'My name is $name';
  }
  
  Player.createRedPlayer({
    required String name,
    required int age,
  }) : this.age = age,this.name = name, this.team = 'red', this.height = 180;
  
  Player.createPurplePlayer(
    String name, int age
  ) : this.age = age, this.name = name, this.team = 'purple', this.height = 180;
  
}

void main() {
  var redPlayer = Player.createRedPlayer(name: 'name', age: 17);
  var purplePlayer = Player.createPurplePlayer('nmae2', 18);
}
  1. :를 사용하여 클래스의 변수들을 초기화할 수 있다.

반복

class Player {
  final String name;
  int age;
  String team;
  
  Player.fromJson(Map<String, dynamic> data) :
  name = data['name'],
  age = data['age'],
  team = data['team'];
  
  void sayHello() {
    print('My name is $name');
  }
}


void main() {
  var playerDatas = [
    {
      'name': 'name',
      'team': 'red',
      'age': 17
    },
    {
      'name': 'name2',
      'team': 'red',
      'age': 18
    }
  ];
  playerDatas.forEach((data) {
    var player = Player.fromJson(data);
    player.sayHello();
  });
}

Cascade

class Player {
  String name;
  int age;
  String team;
  int height;
  
  Player({
    required this.name,
    required this.age,
    required this.team,
    required this.height
  });
  
  
  void sayHello() {
    print('My name is $name');
  }
  
}

void main() {
  var player1 = Player(
    name: 'name',
    age: 17,
    team: 'red',
    height: 180,
  )
  ..name = 'name2'
  .. age = 18
  ..sayHello();
}
  1. 체이닝처럼 연속해서 작성할 수 있다.

enum

>> enum Team { red, blue }

class Player {
  String name;
  int age;
  Team team;
  int height;
  
  Player({
    required this.name,
    required this.age,
    required this.team,
    required this.height
  });
  
  
  void sayHello() {
    print('My name is $name');
  }
  
}

void main() {
  var player1 = Player(
    name: 'name',
    age: 17,
    >> team: Team.red,
    height: 180,
  )
  ..name = 'name2'
  .. age = 18
  ..sayHello();
}
  1. 열거형으로, 선택의 폭을 좁혀주는 역할을 한다.

추상화

>> abstract class Human {
  void walk();
}

enum Team { red, blue }

class Player extends Human {
  String name;
  int age;
  Team team;
  int height;
  
  Player({
    required this.name,
    required this.age,
    required this.team,
    required this.height
  });
  
  void sayHello() {
    print('My name is $name');
  }
  >> void walk() {
    print('$name walking');
  }
  
}

void main() {
  var player1 = Player(
    name: 'name',
    age: 17,
    team: Team.red,
    height: 180,
  );
}
  1. 구현해야 할 메소드들을 작성하여, 실제 쓸 클래스에서 상속받아 쓸 수 있음.

상속

class Human {
  final String name;
  
  Human({ required this.name});
  
  void sayHello() {
    print('My name is $name');
  }
}

enum Team { red, purple }

class Player extends Human {
  final Team team;
  
  Player({
    required this.team,
    required String name
  }) : super(name: name);
  
  
  void sayHello() {
    super.sayHello();
    String myTeam = team.toString().split('.').last;
    print('and $myTeam');
  }
}

void main() {
  var player1 = Player(team: Team.purple, name: 'name');
  player1.sayHello();
}
  1. 부모 클래스를 호출할 때는 super 키워드를 사용하면 된다.
  2. @override 데코레이터를 작성하고 부모에서 정의된 함수를 재정의할 수 있다.

mixin

class Human {
  final String name;
  
  Human({ required this.name});
  
  void sayHello() {
    print('My name is $name');
  }
}


mixin Strong {
  final double score = 17.71;
}
mixin Hit {
  void punch() {
    print('punch');
  }
}

enum Team { red, purple }

class Player with Strong, Hit {
  final Team team;
  
  Player({
    required this.team,
  });
  
}

void main() {
  var player1 = Player(team: Team.purple);
  player1.punch(); // punch
  print(player1.score); // 17.71
}
  1. 상속과는 다르게 안에 선언돼 있는 것들을 그대로 가져오는 역할
profile
즐거워지고 싶다.

0개의 댓글