카테고리 없음

dart 문법 4

sping2 2025. 1. 15. 21:33

class

  • clas를 생성할 때는 타입을 꼭 명시해야 한다.
String name = 'nico'; // O
var name = 'nico';  // X 
class Player{
	String name = 'nico';
	int xp = 1500;
}

void main() {
	var player = Player();
	print(player.name);  // nico
	player.name = 'lalala';
	print(player.name);  // lalala
}

class Player{
	final String name = 'nico';
	int xp = 1500;
}

final로 선언해서 name을 클래스 밖에서 수정하지 못하게 만듦.


  • method 정의하기
class Player {
	final String name = 'nico';
	int xp = 1500;
	
	void sayHello() {
		print("Hi my name is $name.");
	}
}

void main() {
	var player = Player();
	player.sayHello();
}

 

constructors

생성자 만들기

class Player {
	late final String name;
	late int xp;
	
	Player(String name, int xp) {
		this.name = name;
		this.xp = xp;
	}

	void sayHello() {
		print("Hi my name is $name.");
	}
}

void main() {
	var player = Player("abc", 1500);
	player.sayHello();
	var player2 = Player("def", 2500);
	player2.sayHello();
}

late는 클래스에서 유용하게 사용


생성자 부분 짧게 바꾸기

class Player {
	final String name;
	int xp;

	Player(this.name, this.xp);  // 이렇게 쓸 수 있다!

	void sayHello() {
		print("Hi my name is $name.");
	}
}

 

named constructor parameters

class Player {
	final String name;
	int xp, age;
	String team;

	Player(this.name, this.xp, this.team, this.age);

	void sayHello() {
		print("Hi my name is $name.");
	}
}

void main() {
	var player = Player("abc", 1500, 'red', 12);
	player.sayHello();
	var player2 = Player("def", 2500, 'blue', 12);
	player2.sayHello();
}

클래스의 프로퍼티가 많아질 때는 argument의 위치를 기억하기 힘들다. 또 각각의 argument가 뭘 의미하는지 파악하기 어렵다.

→ named argument로 만들기 전에 함수에서 했던 것과 같음.

class Player {
	final String name;
	int xp, age;
	String team;
	int age;

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

	void sayHello() {
		print("Hi my name is $name.");
	}
}

void main() {
	var player = Player(
		name: "abc",
		xp: 1500,
		team: 'red',
		age: 12,
);

	var player2 = Player(
		name: "def",
		xp: 2500,
		team: 'blue',
		age: 12,
	);
}

named constructor parameter를 사용하면,

argument들의 위치를 기억하지 않아도 된다. key-value 쌍으로 기억하면 된다.

 

named constructors

class Player {
	final String name;
	int xp, age;
	String team;

	Player(
		{required this.name,
		required this.xp,
		required this.team,
		required this.age});
	
	Player.createBluePlayer({
		required String name,
		required int age,
		})  : this.age = age,
					this.name = name,
					this.team = 'blue',
					this.xp = 0;
	
	Player.createRedPlayer(String name, int age)
		: this.age = age,
			this.name = name,
			this.team = 'red',
			this.xp = 0;
	
	void sayHello() {
		print("Hi my name is $name.");
	}
}

void main() {
	var player = Player.createBluePlayer(
		name: "abc",
		age: 12,
	);
	
	var redplayer = Player.createRedPlayer("def", 12);
}

 

*

class Player {
	final String name;
	int xp;
	String team;
	
	Player.fromJson(Map<String, dynamic> playerJson)
		: name = playerJson['name'],
			xp = playerJson['xp'],
			team = playerJson['team'];
	
	void sayHello() {
		print("Hi my name is $name.");
	}
}

void main() {
	var apiData = [
		{
			"name": "A",
			"team": "red",
			"xp": 0,
		},
		{
			"name": "B",
			"team": "red",
			"xp": 0,
		},
		{
			"name": "C",
			"team": "red",
			"xp": 0,
		}
	];

	apiData.forEach((playerJson){
		var player = Player.fromJson(playerJson);
		player.sayHello();
	});
}

 

cascade notation

void main() {
	var nico = Player(name: 'nico', xp: 1200, team: 'red');
	[nico.name](<http://nico.name/>) = 'las';
	nico.xp = 1200000;
	nico.team = 'blue';
}

프로퍼티를 하나하나 바꾸는 대신에

void main() {
	var nico = Player(name: 'nico', xp: 1200, team: 'red')
		..name = 'las'
		..xp = 1200000
		..team = 'blue'
		..sayHello();
}

이렇게 간단하게 쓸 수 있다.

 

enums

enum Team { red, blue }

enum XPLevel { beginner, medium, pro }

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

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

	void sayHello() {
		print("Hi my name is $name.");
	}
}

void main() {
	var nico = Player(
		name: 'nico',
		xp: XPLevel.medium,
		team: Team.red,
	)
		..name = 'las'
		..xp = XPLevel.pro
		..team = Team.blue;
}

enum을 사용하면 실수를 줄일 수 있다.

 

abstract classes

추상화 메소드

  • 객체를 생성할 수 없다.
  • 상속받는 모든 클래스가 가지고 있어야 하는 메소드를 정의한다.
  • 상속받는 클래스가 특정 메소드를 구현하도록 강제한다.
  • 상속받은 클래스에서는 클래스의 내용이 달라도 된다.
abstract class Human {
	void walk();
}
enum Team { red, blue }

enum XPLevel { beginner, medium, pro }

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

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

	void walk() {
		print("I'm walking.");
	}
	
	void sayHello() {
		print("Hi my name is $name.");
	}
}

class Coach extends Human {
	void walk() {
		print('the coach is 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);
	
	@override
	void sayHello() {
		super.sayHello();
		print('and I play for ${team}.');
	}
}

void main() {
	var player = Player(
		team: Team.red,
		name: 'nico',
	);
	player.sayHello();
}

extends로 상속

 

mixins

mixin: 생성자가 없는 클래스

mixin class Strong {
	final double strengthLevel = 1500.99;
}

mixin class QuickRunner {
	void runQuick() {
		print("runnnnnnn!");
	}
}

mixin class Tall {
	final double height = 1.99;
}

enum Team { blue, red }

class Player with Strong, QuickRunner, Tall {
	final Team team;

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

class Horse with Strong, QuickRunner {}

class Kid with QuickRunner {}

void main() {
	var player = Player(
		team: Team.red,
	);
	player.runQuick();
}

with로 클래스의 프로퍼티와 메소드를 가져와서 사용할 수 있음 다른 클래스에 여러 번 재사용할 수 있다.