거의 2주만에 올리는 Dart에 발 들이기 시리즈이다.
클래스 객체를 생성한 후, 객체의 필드 값 접근 방식이다.
기존에는 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
개발자에게 선택의 폭을 줄여주는 역할을 한다.
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안에 정의하는 방식이라 생각하면 된다.
추상화 클래스는 다른 클래스들이 어떤 청사진을 가지고 있어야 하는지 정의한다
메소드의 이름과 반환 타입만 정해서 정의할 수 있다.
다른 클래스에서 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");
}
}
:(콜론)을 적고 그 뒤에 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)
생성자가 없는 클래스여야 함.
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);
}