Dart에 발 들이기 6

바람찬허파·2023년 8월 24일
0

사람책 개발 공부

목록 보기
6/6
post-thumbnail

거의 2주만에 올리는 Dart에 발 들이기 시리즈이다.

cascade notation

클래스 객체를 생성한 후, 객체의 필드 값 접근 방식이다.
기존에는 jisoo라는 객체를 생성한 후, jisoo. 을 통해 메소드 호출, 필드 접근이 가능하다.

jisoo.name = 'jiyeon';
jisoo.xp = 2000;
jisoo.team = 'yellow';
해당 코드로 필드 값을 수정할 수 있었다.

Dart에서는 cascade notation, 객체 뒤에 .. 를 사용하여 보다 간결하게 접근 가능하다.
방법은 jisoo. 대신 .. 을 사용하며, 끝 부분에만 ;를 작성한다.

//객체 생성자 뒤에 사용
var jisoo = Player(name: "jisoo", xp : 2000, team:"red")
	..name = '' 
    ..xp = 20 ;
    
//객체 뒤에 사용
var hemi = jisoo
	..name = 'hemi'
    ..xp = 200
    ..sayHello(); //클래스의 메소드를 사용할 수 있다. 

. 이 객체를 가르킨다고 생각하면 된다.

class Player {
  String name, team;
  int xp;

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


  void sayHello() {
    print("hello my name is $name, xp $xp, team $team");
  }
}

void main() {
  var jisoo = Player(name: "jisoo", xp: 20000, team: "red")
    ..name = "jiyeon"
    ..xp = 100
    ..team = 'black'
    ..sayHello();
  jisoo.sayHello();
}
class Player {
  String name, team;
  int xp;

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

  void sayHello() {
    print("hello my name is $name, xp $xp, team $team");
  }
}

void main() {
  var jisoo = Player(name: "jisoo", xp: 20000, team: "red");
  
  var example = jisoo
    ..name = 'jiyeon'
    ..xp = 100
    ..team = 'yellow'
    ..sayHello();
}
//hello my name is jiyeon, xp 100, team yellow

Enums

개발자에게 선택의 폭을 줄여주는 역할을 한다.

  • enum Team {blue, red}
  • 코드의 최상단에 enum 이름 { 요소들 } 적어주면 되며, 요소들은 따움표를 씌우지 않는다.
  • 해당 enum이 사용되는 필드의 타입 => enum의 이름으로 바꾸어준다. (Team team;)
  • 필드 값 변경시에는 enum이름.요소를 넣어준다. (..team = Team.red)
enum Team { blue, red }

enum XPLevel { beginner, medium, pro }

class Player {
  String name;
  Team team;
  XPLevel xp;

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

  void sayHello() {
    print("hello my name is $name, xp $xp, team $team");
  }
}

void main() {
  var jisoo = Player(name: "jisoo", xp: XPLevel.beginner, team: Team.red)
    ..name = "jiyeon"
    ..xp = XPLevel.pro
    ..team = Team.blue
    ..sayHello();
}
//hello my name is jiyeon, xp XPLevel.pro, team Team.blue

해당 enum은 이후 flutter에서 색을 변경할 때 활용된다. Color: 'red'가 아니라 Color enum안에 정의하는 방식이라 생각하면 된다.

Abstract Class

추상화 클래스는 다른 클래스들이 어떤 청사진을 가지고 있어야 하는지 정의한다
메소드의 이름과 반환 타입만 정해서 정의할 수 있다.
다른 클래스에서 extends 할 수 있음
특정 메소드를 구현하도록 강제하는 역할을 함 -> Player class, Coach class가 해당 walk 메소드를 가지고 있다고 확신할 수 있음 -> 각 클래스의 walk의 형태는 다름.

abstract class Human {
  void walk();
}

...
class Player extends Human {
  ...

  void walk() {
    print("player is walking");
  }
}

class Coach extends Human {
  void walk() {
    print("the Coach is walking");
  }
}

Inheritance

:(콜론)을 적고 그 뒤에 super() 생성자 호출
super 클래스는 확장한 부모 클래스를 의미 함.

해당 클래스를 다른 곳에서 사용하려면 -> 부모의 생성자를 호출 + 필요한 값 전달
확장한 부모 클래스의 생성자를 호출할 때 super로 할 수 있음
@override 때에도 기존 부모 클래스의 메소드를 가져오고자 한다면 super.method() 로 가져올 수 있음

 Player({
    required this.team,
    required String name,
  }) : super(name: name);

Player 자체에 있는 team은 놔두고 name은 super 클래스(Human)에 전달

class Human {
  String name;
  int age;
  Human(this.name, this.age);
  void introduce() {
    print("my name is ${name}, im ${age} years old");
  }
}

enum Grade { A, B, C, D }

class Student extends Human {
  Grade grade;
  Student(
    this.grade,
    String name,
    int age,
  ) : super(name, age); 
  // name, age의 경우, Human에서 생성자를 통해 값이 들어가야 함.
}

void main() {
  Student s1 = Student(Grade.B, "jisoo", 13); 
  s1.introduce();
}
class Human {
  final String name;
  void sayHello() {
    print("hi my name is ${name}");
  }

  Human({required this.name});
}

enum Team { red, blue }

class Player extends Human {
  final Team team;
  Player({
    required this.team,
    required String name,
  }) : super(name: name);
  @override
  void sayHello() {
    super.sayHello();
    print("and im in team ${team}");
  }
}

void main() {
  var jisoo = Player(
    team: Team.blue,
    name: "jisoo",
  );
  jisoo.sayHello();
}

무조건 super를 사용해 부모 클래스의 생성자를 호출해야 하는가?

class Human {
  String name = "jisoo";
  int age = 13;
  Human(this.name, this.age);
  void introduce() {
    print("my name is ${name}, im ${age} years old");
  }
}

enum Grade { A, B, C, D }

class Student extends Human {
  Grade grade;
  Student(this.grade); //error
}


Student(this.grade) 에서 해당 에러 메시지 발생.

부모 클래스 (Human)의 생성자에서 Human(this.name, this.age)로 정의하였으므로 -> 자식 클래스의 생성자에서 name과 age를 넘겨주어야 함 -> super를 사용!

Student(this.grade, String name, int age) :super (name, age)

Mixin

생성자가 없는 클래스여야 함.

extends가 아닌 with를 사용 -> 다른 클래스의 프로퍼티와 메소드를 긁어옴
=> 상속과는 다름 (부모 클래스가 되지 않음, super를 통해 부모 클래스에 접근하지 않음)

flutter, flutter 플러그인을 사용할 시에 활용

현재 mixin, mixin class로 선언해야 함 (생성자가 없어야 함!)

class Student with IQ, tall, career {} -> with를 통해 클래스의 속성과 메소드를 가져 옴

다양한 클래스에서 mixin 클래스로부터 프로퍼티, 메소드를 긁어옴

enum Grade { A, B, C, D }

mixin IQ {
  final double IQScore = 191.11;
}

mixin career {
  final String job = "doctor";
  void announcement() {
    print("i wanna be a ${job}");
  }
}

mixin class tall {
  final int height = 180;
}

class Student with IQ, career, tall {
  Grade grade;
  Student(this.grade);
}

class Kids with IQ {}

class Seinor with IQ, tall {}

void main() {
  Student s1 = Student(Grade.A);
  print(s1.IQScore);

  Seinor s2 = Seinor();
  print(s2.height);
}

0개의 댓글