Flutter/Dart

Dart Class 클래스

임공부중 2023. 2. 9. 19:05
반응형

#  Class 클래스 생성

class Player {

 String name = '공부중';    // 타입을 꼭 명시해 주어야함  

 int xp = 1500;                      // 타입을 꼭 명시해 주어야함

void sayHello(){

  var name = '121';

  print("Hi my name is ${this.name}");    //  변수와 class 내 property의 이름이 겹칠 때만 this 사용 그 외에는 $name 사용

}

}

void main() {

  var player = Player();            // 클래스로 객체 생성

  print(player.name);

  player.name = 'asdkfj';     // 바꾸고 싶지 않다면 class 내에서 final로 선언

  print(player.name);

  player.sayHello();      // 결과: Hi my name is asdkfj

}

 

 

#  Constructors 생성자

생성자 함수의 이름은 클래스의 이름과 같아야한다

1.

class Player {

 late String name;    

 late int xp;       

 Player(String name, int xp){          // Positional Paramters 위치를 기억해야함

   this.name = name;

   this.xp = xp;

 }

}

void main() {

  var player = Player('공부',1500);

  var player2 = Player('중임',2500);

}

2. 생성자 함수 더 나은 방법

Player(this.name, this.xp);               // Positional Paramters 위치를 기억해야함

 

 

#  Named Constructor Parameters

클래스 내 생성자 메소드

Player({required this.name, required this.xp});                     //  null 오류 발생가능 하므로 required 필수값으로 만들어주기

 

void main() {

  var player = Player(name: '공부', xp: 1500,);    // 순서가 상관없어짐, 위치를 기억할 필요가 없음.

}

 

 

#  Named Constructors 명명된 생성자

class Player {

 late String name, team;    

 late int xp,age ;       

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

Player.createBluePlayer({required String name, required int age           //  Player 클래스를 초기화 하는 메소드

 }) : this.age = age, this.name = name, this.team = 'blue', this. xp = 0;

Player.createRedPlayer({required String name, required int age

 })   this.age = age, this.name = name, this.team = 'red', this. xp = 0;

}

void main() {

  var player = Player.createBluePlayer(name: '공부', xp: 1500,);    

  var redplayer = Player.createRedPlayer(name: '공부', xp: 1500,);    

}

 

#  Cascade Notation 케스케이드 표기법(..)

객체를  반환하는 함수에 한해서만 사용가능

케스케이드 표기법 사용 안 한 버전

void main() {

  var studying = Player(name: 'studying', xp: 1200, team: 'blue'); 

  studying.name = 'hi';

  studying.xp = 1200000;

  studying.team = 'red';

}

케스케이드 표기법 사용한 버전

void main() {

  var studying = Player(name: 'studying', xp: 1200, team: 'blue'); 

    ..name = 'hi'                        // ..은 앞에 studying을 가리킨다.

    ..xp = 1200000

    ..team = 'red'

    ..sayHello();                       // 마지막에만 세미콜론 붙여주기

}

 

 

#  Enums  열거형 (실수를 줄여줌)

enum 생성

enum Team  { red, blue }    // 텍스트 따옴표 쓸필요 없음

enum XPLevel {beginner, medium, pro}

class Player {

String name;

XPLevel  xp;

Team team;

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

}

void main(){ 

  var studying = Player(name: 'studying', xp: XPLevel.beginner, team: Team.blue);   // String 의 형식으로 쓰지 않는다.

    ..name = 'hi'                      

    ..xp = XPLevel.medium

    ..team = Team.red

    ..sayHello(); 

}

 

#  Abstract Classes 추상화 클래스  -  다른 클래스들이 어떤 청사진을 가지고 있어야 하는지 정의해줌

메소드와 반환타입만 표시

abstract class Human {

  void walk();

}

class Player extends Human {             //  Human안에 있는 모든 메소드가 상속받는 Player에도 있어야한다. 

void walk (){

 print('I\'m am walking');

}

}

 

#  Inheritance  상속

class Human {

 final String name;

 Human(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);                  //  super 생성자는 name을 Human클래스에 보내준다. named parameters 으로도 가능

  @override                              // 부모 클래스의 메소드 코드 추가 및 수정

  void sayHello(){

   super.sayHello();         // 부모 클래스의 메소드 호출. 이어서 쓰고 싶은 것이 아닌 전체 수정일때는 안써도 됨

   print("And I play for $team");

  }

}

void main(){

var studying = Player(

name: 'studying',

team: Team.red,

)

studying.sayHello();           //  결과:  Hi, my name is studying  And I play for red

}

 

 

#  Mixins  생성자가 없는 클래스  - 여러 클래스에 재사용이 가능하다는 점이 핵심

class Strong{

  final double strenghtLevel = 1500.99;

}

class QuickRunner {

  void runQuick(){

    print("Ruuuun");

  }

}

class Player with Strong, QuickRunner{       //  extend가 아닌 with 사용   단순히 Mixin 내부의 메소드와 프로퍼티를 가져옴  부모 클래스가 되지 않음. 

}

 

 

 

반응형