Created at : 2025-01-10 02:47
Auther: Soo.Y


๐Ÿ“๋ฉ”๋ชจ

1. class ์„ ์–ธ

dart์—์„œ๋Š” class ์„ ์–ธ์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  class์˜ ์ด๋ฆ„์€ ์ฃผ๋กœ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค. void main๊ณผ ๊ฐ™์ด ์ค‘๊ด„ํ˜ธ {}๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  class์—์„œ ์„ ์–ธ๋˜๋Š” ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ํƒ€์ž…์„ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค. var ์„ ์–ธ์ด ์•ˆ๋œ๋‹ค๋Š” ๋œป์ž„.

class ๋‚ด๋ถ€์—์„œ this.name๊ณผ ๊ฐ™์ด this๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ class์˜ ์†์„ฑ์ž„์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋‹จ, class๋‚ด ํ•จ์ˆ˜์—์„œ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ช…์ด ์žˆ๋‹ค๋ฉด ์„œ๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ this.name์€ class์˜ ์†์„ฑ ๋ณ€์ˆ˜์ด๊ณ  name์€ ํ•จ์ˆ˜ ๋‚ด์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ž„์„ ์˜๋ฏธํ•œ๋‹ค.

  • property
  • method
class Player {
	// ๋ณ€์ˆ˜๋Š” ํƒ€์ž…์„ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. class์—์„œ var ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
	fianl String name = "Sooyoung";
	int xp = 1500;
 
	void sayHeelo() {
		print("Hi my name is $name");
		// print("Hi my name is $this.name");
	}
}

2. Constructors

์ƒ์„ฑ์ž(Constructors)๋ฅผ ์‚ฌ์šฉํ•ด์„œ class์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ž…๋ ฅ ๋ฐ›์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. Dart์—์„œ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์„ฑ์ž๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒ์„ฑ์ž๋Š” ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๋™์ผํ•˜๊ฒŒ ์ •์˜๋œ๋‹ค.

class Player{
	// late๋ฅผ ์‚ฌ์šฉํ•ด์„œ final์ด์ง€๋งŒ, ๋‚˜์ค‘์— ์ž…๋ ฅ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•จ
	late final String name;
	late int xp;
 
	Player(String name, int xp) {
		this.name = name;
		this.xp = xp;
	}
}
 
void main() {
	var player = Player('Sooyoung', 1500);
	print("${player.name}, ${player.xp}");
}

์ด์ œ ์ƒ์„ฑ์ž๋ฅผ ์ข€ ๋” ์‹ฌํ”Œํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณด์ž.

class Player{
	final String name;
	int xp;
 
	Player(this.name, this.xp); // ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ์ž๋ฅผ ํ•œ์ค„๋กœ ๊ฐ€๋Šฅํ•จ
	// ๋‹จ, ์ง€๊ธˆ์€ positional parameters์ด๋‹ค. 
}

3. Named Constructor Parameters

Named constructor parameters๋Š” ์ƒ์„ฑ์ž์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•  ํ•„์š” ์—†์ด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์ค‘๊ด„ํ˜ธ{}๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด named constructor parameters๋กœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ๋ฒ•๊ณผ ๋™์ผํ•จ.

class Player{
	final String name;
	int xp;
 
	// ๊ธฐ๋ณธ๊ฐ’์„ ์ฃผ๋˜์ง€ required๋ฅผ ์ฃผ๋˜์ง€...
	Player({required this.name, required this.xp});
}
 
void main() {
	var player = Player(
		name: "Sooyoung",
		xp: 1500,
	);
	print("${player.name}, ${player.xp}");
}

์‹ค์Šต ๋ฌธ์ œ 1 : Book ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฆ„ ์žˆ๋Š” ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ title๊ณผ author ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜์„ธ์š”.

class Book {
  String title;
  String author;
 
  Book({required this.title, required this.author});
}
 
void main() {
  var book = Book(title: '1984', author: 'George Orwell');
  print('Title: ${book.title}, Author: ${book.author}');
}
 

4. Named Constructor

Named constructor๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ์—ฌ๋Ÿฌ ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณตํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Š” Classname.ConstructorName ํ˜•์‹์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํŠน์ • ๋ชฉ์ ์— ๋งž๋Š” ์ƒ์„ฑ์ž๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

์˜ˆ์‹œ)

class Player{
	final String name;
	int xp;
	String team;
 
	Player({required this.name, required this.xp, required this.team});
 
	Player.createBluePlayer({required String name, required int xp}) :
	this.xp = xp,
	this.name = name,
	this.team = 'Blue';
}
 
void main() {
	var player = Player.createBluePlayer(
		name: "Sooyoung",
		xp: 1500,
	);
	print("${player.name}, ${player.xp}, ${player.team}");
}

5. Cascade Notation

Cascade notation(..)์€ ๊ฐ™์€ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด๋‚˜ ์†์„ฑ ์„ค์ •์„ ๊ฐ„๋‹จํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด user์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ ์†์„ฑ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด user.name, user.email์™€ ๊ฐ™์ด ์ผ์ผ์ด ์ธ์Šคํ„ด์Šค์˜ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์†์„ฑ์„ ์ž‘์„ฑํ•ด ์ค˜์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, cascade notation์„ ์‚ฌ์šฉํ•˜๋ฉด user๋ผ๋Š” ์ค‘๋ณต๋˜๋Š” ๋‹จ์–ด๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

class User {
  String name = '';
  String email = '';
 
  void printUser() {
    print('Name: $name, Email: $email');
  }
}
 
void main() {
  var user = User();
  user.name = 'Alice';
  user.email = 'alice@example.com';
  user.printUser();
}
 

๋จผ์ € var user = User();๋’ค์— ์„ธ๋ฏธ์ฝœ๋ก ์„ ์‚ญ์ œํ•˜๊ณ  user๋ฅผ ์ „๋ถ€๋‹ค .๋กœ ํ‘œํ˜„ํ•˜๋ฉฐ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ”๊พธ๋Š” ์†์„ฑ๋งŒ ์ œ์™ธํ•˜๊ณ  ๋งจ ๋’ค์— ;์„ ์ „๋ถ€ ๋‹ค ์‚ญ์ œํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() {
  var user = User()
    ..name = 'Alice'
    ..email = 'alice@example.com'
    ..printUser(); // ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋„ ๊ฐ€๋Šฅํ•จ
}

6. Enums

Enum์€ ์ •ํ•ด์ง„ ๊ฐ’ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ ์”จ ์ƒํƒœ๋ฅผ sunny, rainy, cloudy์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
Enum์€ enum ํ‚ค์›Œ๋“œ๋กœ ์ •์˜ํ•˜๋ฉฐ, switch ๋ฌธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์‹ค์Šต ๋ฌธ์ œ 1 Weather enum์„ ์ƒ์„ฑํ•˜๊ณ , sunny, rainy, cloudy ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

enum Weather { sunny, rainy, cloudly }
 
void main() {
	var today = Weather.sunny;
 
	switch (today) {
		case Weather.sunny:
			print('It is sunny!');
			break;
		case Weather.rainy:
			print('It is rainy!');
			break;
		case Weather.cloudly:
			print('It is cloudly!');
			break;
	}
}

7. Abstract Classes

์ถ”์ƒํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค์ด๋‹ค. ์ถ”์ƒํด๋ž˜์Šค๋Š” ์ž์‹ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ์ƒ์†์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์ž์‹ํด๋ž˜์Šค์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ํ•„์ˆ˜์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ•์ œ๋กœ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

abstract class Shape {
  double area();
}
 
class Circle extends Shape {
  double radius;
 
  Circle(this.radius);
 
  @override
  double area() => 3.14 * radius * radius;
}

8. Inheritance(์ƒ์†)

์ƒ์†์€ ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค. Dart์—์„œ ์ƒน์†์€ extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ž์‹ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ชจ๋“  ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ super ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋„ override๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจํด๋ž˜์Šค์—์„œ ์ •์˜๋œ honk๋ฅผ ๋ณ€ํ˜•ํ–ˆ๋‹ค. ๋‹จ, super.honk()๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์งˆ์ ์œผ๋กœ ๋ฎ์–ด์“ฐ๋Š” ํ–‰์œ„๊ฐ€ ์•„๋‹ˆ๊ณ  ๋ฉ”์„œ๋“œ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋‹ค๊ณ  ๋ณด๋Š” ๊ฒƒ์ด ์ข€ ๋” ์ •ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๊ณณ์— ์ €์žฅ๋˜๋ฏ€๋กœ override์˜ ์ง์—ญ์ธ ๋ฎ์–ด์“ฐ๊ธฐ๋Š” ๋ถ€์ ์ ˆํ•œ ๋ฒˆ์—ญ์ด๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

class Vehicle {
  String brand;
 
  Vehicle(this.brand);
 
  void honk() {
    print('Beep!');
  }
}
 
class Car extends Vehicle {
  String model;
 
  Car(String brand, this.model) : super(brand); // super(brand)๋กœ ๋ถ€๋ชจํด๋ž˜์Šค์— ์ „๋‹ฌ
 
  void showDetails() {
    print('Brand: $brand, Model: $model');
  }
 
  @override
  void honk() {
    super.honk();
    print("This is Car!");
  }
}
 
void main() {
  var car = Car('Toyota', 'Camry');
  car.honk();
  car.showDetails();
}
 

9. Mixins

Mixin์€ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. Mixin์€ with ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์˜ ์ง‘ํ•ฉ์„ ์ •์˜ํ•œ๋‹ค. Dart์—์„œ Mixin์€ ์ถ”์ƒ ํด๋ž˜์Šค์™€ ๋‹ฌ๋ฆฌ ๋‹ค์ค‘ ์ƒ์†์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์Šต ๋ฌธ์ œ 1

  • Flyable ๋ฏน์Šค์ธ์„ ์ƒ์„ฑํ•˜๊ณ , Bird ํด๋ž˜์Šค์— ์ ์šฉํ•˜์„ธ์š”.
  • Bird ํด๋ž˜์Šค์—์„œ ๋‚  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์„œ๋“œ์™€ ์ƒˆ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
mixin Flyable {
  void fly() {
    print('Flying...');
  }
}
 
class Bird with Flyable {
  String name;
 
  Bird(this.name);
 
  void chirp() {
    print('$name is chirping!');
  }
}
 
void main() {
  var bird = Bird('Sparrow');
  bird.chirp();
  bird.fly();
}

10. fromJson

์™ธ๋ถ€ API๋ฅผ ํ†ตํ•ด์„œ Json ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ณ  ์ด๋ฅผ dart์˜ class๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ํ•ธ๋“ค๋งํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ๊ธฐ์ดˆ์ ์ธ ํ•™์Šต์„ ํ•ด๋ณด์ž. named constructor๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

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": "Sooyoung",
			"team": "red",
			"xp": 0,
		},
		{
			"name": "Mike",
			"team": "blue",
			"xp": 0,
		},
		{
			"name": "Darn",
			"team": "red",
			"xp": 0,
		},
	];
 
	apiData.forEach((playerJson) {
		var player = Player.fromJson(playerJson);
		player.sayHello();
	});
}

11. ์ข…ํ•ฉํ‰๊ฐ€

์‹ค์Šต ๋ฌธ์ œ

  1. ๋™๋ฌผ์ด๋ผ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ณตํ†ต ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์„ธ์š”.(์˜ˆ ์ด๋ฆ„, ์†Œ๋ฆฌ)
  2. ์ด๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ๋ฏน์Šค์ธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์„ธ์š”.(๋Œ๊ณ ๋ž˜, swimmingโ€ฆ)
abstract class Animal {
  String name;
 
  Animal(this.name);
 
  void sound();
}
 
mixin Swim {
  void swim() {
    print('Swimming...');
  }
}
 
class Dolphin extends Animal with Swim {
  Dolphin(String name) : super(name);
 
  @override
  void sound() {
    print('$name makes a clicking sound!');
  }
}
 
void main() {
  var dolphin = Dolphin('Dolly');
  dolphin.sound();
  dolphin.swim();
}

๐Ÿ“œ์ถœ์ฒ˜(์ฐธ๊ณ  ๋ฌธํ—Œ)


๐Ÿ”—์—ฐ๊ฒฐ ๋ฌธ์„œ

2์ผ์ฐจ 3์ผ์ฐจ 4์ผ์ฐจ Code review