Dart는 객체지향 언어이다. 모든 객체는 Class의 Instance이다.
Class는 Member를 가진다. Member 안에는 Member Method(멤버 함수)과 Member Variable(멤버 변수, 인스턴스 변수)를 가진다.
🔥 참고 :
- 클래스 밖에서 하나의 기능을 하는 것은
Function
이라고 하고, 클래스 내부에 있는 함수는Method
라고 한다.- 멤버 변수는 객체가 생성되면
인스턴스 변수
라고한다.
class 클래스명 {
멤버변수
멤버함수
}
예시
class Player {
// 멤버변수
final String name; // final은 수정할 수 없음
int xp, age;
String team;
// 멤버함수
void sayHello() {
print("hi my name is $name $age $team $xp");
}
}
Class 객체를 생성하여 인스턴스를 생성할 때 사용하는 것이다.
선언된 멤버변수에 어떻게 값을 대입할지에 대해 선언하는 함수이다.
생성자 Method의 이름은 Class의 이름과 같아야한다.
기본적인 Dart의 생성자를 살펴보자.
class Player {
// 멤버변수
late String name; // final은 수정할 수 없음
late xp,;
// 생성자(Constructor)
Player(String name, int xp) {
this.name = name;
this.xp = xp;
};
}
void main () {
print player = Player("hee", 15000);
}
late
선언을 통해 객체가 생성되면서 값을 할당 할 수 있도록 한다.new
를 통해 생성하지만, dart는 그냥 해당 클래스를 호출하면서 생성자에 값을 담아주면 된다.Positioning Constructor는 생성자를 호출할 때 선언해 놓은 순서대로 변수를 할당하는 생성자이다.
class Player {
final String name; // final은 수정할 수 없음
int xp, age;
String team;
// positioning parameter
Player.createRedPlayer(String name, int age) :
this.age = age,
this.name = name,
this.team = 'grey',
this.xp = 0;
}
void main () {
print player = Player("hee", 26);
}
생성자를 key값인 변수 이름을 가지고 해당 멤버변수에 값을 대입하는 방법이다.
멤버 변수가 많아질 경우 생성자에 값을 하나 하나 담아서 호출해야 하므로 dart 언어는 named constructor를 지원한다.
class Player {
final String name; // final은 수정할 수 없음
int xp, age;
String team;
// named parameter
Player.createBluePlayer({
required String name,
required int age,
}) : this.age = age,
this.name = name,
this.xp = 0,
this.team = 'grey';
}
void main () {
print player = Player("hee", 26);
}
required
를 사용하여 값이 비어있다면 호출하지 못하도록 막고, 필수값이 아니어도 되는 변수의 경우 :
(콜론)을 사용하여 값을 할당받지 못했을 때 default 값을 설정할 수 있다.
Map타입의 생성자를 만들어서 Json 파일에 담긴 데이터를 멤버변수에 담으면 된다.
class Player {
final String name; // final은 수정할 수 없음
int xp, age;
String team;
Player.formJson(Map<String, dynamic> playerJson)
: name = playerJson['name'],
age = playerJson['age'],
xp = playerJson['xp'],
team = playerJson['team'];
void sayHello() {
print("hi my name is $name $age $team $xp"); // $name = ${this.name}
}
}
main() {
/* API */
var apiData = [
{
'name' : 'heera',
'team' : 'red',
'xp' : 12000,
'age' : 15,
},
{
'name' : 'amily',
'team' : 'red',
'xp' : 15000,
'age' : 20,
},
{
'name' : 'juno',
'team' : 'red',
'xp' : 16000,
'age' : 18,
},
];
apiData.forEach((playerJson){
var player = Player.formJson(playerJson);
player.sayHello();
});
}
객체를 생성할 때 basic 하게는 아래와 같은 방식으로 호출한다.
var duck = Member(name: 'duck', age: 26);
하지만 Cascade Notation[..]
을 사용하면 하나의 오브젝트에 함수호출, 필드접근을 순차적으로 할 수 있다. 자바의 build()와 유사하다.
var duck = Member
..name = 'duck_ach'
..age = 26
..phoneNum = '010-0000-0000'
..getUserInfo();
Abstract Class(추상클래스)는 이를 상속받는 모든 클래스가 가지고 있어야 할 메소드를 정의한 클래스이다. (구현 X)
abstract class Human {
void walk();
}
class Duck extends Human {
void walk() {
print('Duck is walk');
}
}
상속은 super
라는 선언을 통해 부모클래스의 생성자를 호출할 수 있다.
Human 클래스를 부모클래스로 선언하고, Player 클래스에서 extends를 사용하여 상속받는 코드이다.
필요한 개별부분들은 자식클래스에서 선언하고, 공통적인 요소나 메소드는 부모클래스에서 상속받아 코드를 좀 더 통일성 있게 짤 수 있다.
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);
// 부모클래스가 정의한 메소드말고 커스텀하고싶을 때
void sayHello() {
//print('Hi. my name is $name 1111');
super.sayHello();
print('and I play for ${team}');
}
}
void main() {
var player = Player(
team: Team.red,
name : 'heera',
);
player.sayHello();
}
Mixin는 생성자가 없는 클래스를 의미한다.
클래스에 필터나 메소드를 뺏어올 때 사용한다.
Inheritance(상속) 이랑은 개념이 다른게, 상속은 super
를 통해 접근해서 부모가 가진것을 자식이 물려받아 사용한다는 개념이지만, mixin은 그저 with
으로 class를 생성할 때 선언을 함께 해주며, 그 안에 있는 필드값이나 메소드를 공유하며 사용한다.
생성자가 없는 것이 가장 큰 특징이다.
mixin을 생성할 땐 mixin
을 사용한다. (원래는 class 의 한 형태여서 class를 사용하여 만들었지만 최근에 업데이트가 된 모양이다.)
// mixin타입으로 선언해줌 필드 가지고 있고, 생성자 안가지고 있음
mixin Strong {
final double strengthLevel = 1500.99;
}
// 클래스고, 메소드 가지고 있고, 생성자 안가지고 있음
mixin PlayBaseball {
void runQuick() {
print("homer!!");
}
}
mixin Tall {
final double height = 162.49;
}
enum Team {blue, red}
class Player with Strong, PlayBaseball, Tall {
final Team team;
Player({
required this.team,
required String name
});
}
void main() {
var player = Player(
team: Team.red,
name : 'heera',
);
player.runQuick();
}