티스토리 뷰
Class
Dart는 class와 mixin 기반 상속을 지원하는 객체지향언어
모든 객체는 class의 인스턴스이고 null을 제외한 class는 모두 Object에서 비롯한다.
🐾 property 선언
class에서 property를 선언할 때 타입을 사용한다.
class 메소드 안에서는 this를 쓰지 않는 것을 권장하기 때문에 변수를 바로 사용한다.
class Player {
final String name = 'kiji'; // final을 붙이면 변수 수정 불가능
int xp = 1500;
void sayHello() {
// print('Hi my name is ${this.name}'); 권장하지❌
print('Hi my name is $name');
}
}
void main() {
var player = Player(); // new 연산자 없이 인스턴스 생성 가능
// player.name = 'jiwon'; -> 수정 불가능
print(player.name);
player.sayHello();
}
🐾 Constructor
dart에서 생성자 함수는 클래스 이름과 같아야 한다.
방법 1. 파라미터를 받아와 할당하기
class Player {
// 변수 선언은 했지만 값은 나중에 받아오기
late final String name;
late int xp;
// dart에서 생성자 함수는 클래스 이름과 같아야함
Player(String name, int xp) {
this.name = name;
this.xp = xp;
}
void sayHello() {
print('Hi my name is $name');
}
}
void main() {
// Player의 name과 xp를 전달해 새로운 player를 생성
var player = Player('kiji', 1500);
player.sayHello();
var player2 = Player('tom', 2000);
player2.sayHello();
}
방법 2. 받아온 파라미터를 각각 this로 바로 받기
class Player {
final String name;
int xp;
Player(this.name, this.xp);
}
+ named constructor parameter 적용하기
함수의 매개변수를 중괄호로 묶어주면 함수를 호출할 때 매개변수의 이름과 값을 함께 요소들의 순서는 지키지 않아도 된다.
class Player {
final String name;
int xp, age; // 동일한 타입의 변수는 묶어서 선언 가능
String team;
}
Player({
required this.name,
required this.xp,
required this.team,
required this.age,
});
void main() {
// Player의 name과 xp를 전달해 새로운 player를 생성
var player = Player('kiji', 1500);
var player = Player(
name: 'kiji',
xp: 1500,
team: 'red',
age: 12,
);
player.sayHello();
var player2 = Player('tom', 2000);
var player2 = Player(
name: 'tom',
xp: 2000,
team: 'blue',
age: 12,
);
player2.sayHello();
}
파라미터의 수가 많아질수록 순서를 외우기 힘들고 직관적으로 알기 어렵기 때문에 named parameter를 사용하는 것이 좋다!
🐾 Named Constructor
하나의 클래스에서 여러개의 생성자를 정의할 수 있게 하는 생성자
:를 사용하면 특별한 생성자 함수를 만들 수 있다.
→ 콜론을 넣음으로써 dart에 여기서 객체를 초기화하라고 명령할 수 있음
1. named parameter
Player.createRedPlayer({
required String name,
required int age,
}) : this.age = age, // 전달된 인자로 할당
this.name = name, // 전달된 인자로 할당
this.team = 'red', // 기본값
this.xp = 0; // 기본값
void main(){
var redPlayer = Player.createRedPlayer(
name: 'kiji',
age: 20,
);
}
2. positional parameter
Player.createBluePlayer(String name, int age)
: this.age = age,
this.name = name,
this.team = 'blue',
this.xp = 0;
void main(){
var bluePlayer = Player.createBluePlayer(
name: 'jiwon',
age: 10,
);
}
🐾 Cascade notation
...을 사용해 변수 또는 class를 가르킨다.
void main(){
var kiji = Player(name: 'kiji', xp: 1200, team: 'red', age: 20)
..name = 'jiwon'
..age = 25; // .. -> kiji
}
🐾 Abstract class
추상화 클래스
다른 클래스들이 직접 구현해야하는 메소드들을 모아놓은 일종의 청사진으로 추상화 클래스에서는 기능을 구현하지 않는다.
단, 특정 메소드를 구현하도록 강제한다.
abstract class Human {
// 메소드의 시그니쳐가 무엇인지 정의 -> 메소드의 이름과 반환 타입
void walk();
}
class Player extends Human { // Human class를 확장
void walk(){
print('Im walking');
}
}
🐾 inheritance
extends를 사용해 상속을 구현한다.
super를 통해 부모 클래스와의 상호작용을 할 수 있다.
class Human {
final String name;
Human({required 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: name); // super를 사용해 부모 클래스의 생성자를 호출한 후 name을 전달
}
+ enum
열거형 타입
서로 연관된 상수를 모아 놓은 집합으로 개발 중 실수를 하지 않도록 도와줌
enum Team { red, blue }
enum XPLevel { beginner, medium, pro }
class Player {
XPLevel xp;
int age;
Team team;
}
Player.createRedPlayer({
required String name,
required int age,
}) : this.age = age, // 전달된 인자로 할당
this.name = name, // 전달된 인자로 할당
this.team = Team.red, // 기본값
this.xp = XPLevel.medium; // 기본값
Player.createBluePlayer(String name, int age)
: this.age = age,
this.name = name,
this.team = Team.blue,
this.xp = XPLevel.beginner;
void main(){
var kiji = Player(name: 'kiji', xp: XPLevel.medium, team: Team.red, age: 20)
}
또는 @override를 사용해 부모 클래스의 객체를 받아올 수 있다.
class Player extends Human {
final Team team;
Player({
required this.team,
required String name,
}) : super(name: name);
// @override를 사용해 부모 클래스의 객체를 받아올 수 있음
@override
void sayHello() {
// super로 부모 클래스에 접근
super.sayHello();
// 직접 만든 메소드 추가하기
print('and I play for $team');
}
}
void main() {
var player = Player(team: Team.red, name: 'kiji');
player.sayHello();
}
🐾 Mixin
생성자가 없는 클래스
💜 mixin vs extends 💜
- extends -> 확장한 클래스는 부모 클래스가 됨
- mixin -> 부모의 인스턴스 관계가 됨. 내부의 프로퍼티를 갖고 오는 것!
mixin 클래스는 상속을 할 때 extends를 하지 않고 with를 사용한다.
mixin의 핵심은 여러 클래스에 재사용이 가능하다는 점!
mixin class Strong {
final double strengthLevel = 1500.99;
}
mixin class QuickRunner {
void runQuick() {
print('ruuuuuuuuun!');
}
}
mixin class Tall {
final double height = 1.99;
}
class Player with Strong, QuickRunner, Tall {}
class Horse with Strong, QuickRunner, Tall {}
class Kid with QuickRunner {}
'코딩 > Dart' 카테고리의 다른 글
dart - 자료형 정리 (0) | 2024.08.20 |
---|---|
dart - 변수 선언 정리 (0) | 2024.08.19 |