Dart Class 클래스
# 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 내부의 메소드와 프로퍼티를 가져옴 부모 클래스가 되지 않음.
}