Frontend ๐Ÿ“š/Flutter

[Dart] Dart ๊ธฐ๋ณธ ๋ฌธ๋ฒ•_(2)

leejaejae 2022. 2. 11. 18:27

5. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

1) ํด๋ž˜์Šค

  • ํด๋ž˜์Šค: ์ธ์Šคํ„ฐ์Šคํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„ ์—ญํ• (์ธ์Šคํ„ด์Šคํ™”: ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ)
  • ํ”„๋กœํผํ‹ฐ: ํด๋ž˜์Šค ์•ˆ์—์„œ ์†์„ฑ์„ ํ‘œํ˜„
  • ๋ฉ”์„œ๋“œ: ํด๋ž˜์Šค ์•ˆ์— ์ž‘์„ฑํ•˜๋Š” ํ•จ์ˆ˜(ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋“ฑ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ), .์—ฐ์‚ฐ์ž ๋ถ™์—ฌ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ธ์Šคํ„ด์Šค: ๋ฉ”๋ชจ๋ฆฌ์— ์ž‘์„ฑ๋œ ๊ฐ์ฒด

2) ์ ‘๊ทผ ์ง€์ •์ž

  • ๋ณ€์ˆ˜๋ช… ์•ž์— _๊ธฐํ˜ธ๋ฅผ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ, ๋ถ™์ด๋ฉด ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ
  • ํ”„๋ผ์ด๋น— ๋ณ€์ˆ˜(_๊ธฐํ˜ธ ๋ถ™): ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ
  • ๋ฉ”์„œ๋“œ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ
// person.dart
class Person{
int _age;
}
// main.dart
import "person.dart";
...
var person = Person();
person._age = 10; // error! ์ ‘๊ทผ ๋ถˆ๊ฐ€

3) ์ƒ์„ฑ์ž

  • ์ƒ์„ฑ์ž: ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ์ผ์ข…์˜ ๋ฉ”์„œ๋“œ
  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž: ํด๋ž˜์Šค๋ช…๊ณผ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ
  • ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์„ฑ์ž: ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(ex. Person()) ์‚ฌ์šฉํ•  ์ˆœ ์—†์ง€๋งŒ, ์„ ํƒ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๋ฉด Person()๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ(ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•œ ๊ฒƒ X, ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜์— null ๋Œ€์ž…ํ•œ ์ƒ์„ฑ์ž ํ˜ธ์ถœ)
class Person {
int _age;
Person({this._age}); // ์ƒ์„ฑ์ž
}
...
var person = Person();
var person2 = Person(_age : 20);

4) getter, setter: ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ํ”„๋ผ์ด๋น— ๋ณ€์ˆ˜(_๋ณ€์ˆ˜)์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

  • getter: ํ”„๋กœํผํ‹ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
  • setter: ํ”„๋กœํผํ‹ฐ ์„ค์ •ํ•˜๊ธฐ
class Rectangle() {
num left, right, top, height;
}
Rectangle(this.left, this.right, this.top, this.height);
num get right => left + width; // right ๊ฒŒํ„ฐ
set right(num value) => left = value - width; // right ์„ธํ„ฐ

5) ์ƒ์†

class Hero {
String name = '์˜์›…';
void run() {}
}

class SuperHero extends Hero { // Hero ์ƒ์†, SuperHero๋Š” Hero์— ํฌํ•จ
// ๋ถ€๋ชจ์˜ run() ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ์ •์˜(์˜ค๋ฒ„๋ผ์ด๋”ฉ)
@override
void run() {
super.run(); // ๋ถ€๋ชจ์˜ run()์„ ์‹คํ–‰, super: ์Šˆํผํด๋ž˜์Šค ์ ‘๊ทผ
this.fly(); // ์ถ”๊ฐ€๋กœ fly()๋„ ์‹คํ–‰
}
void fly() {
}
void main() {
var hero = SuperHero();
hero.run();
hero.fly();
print(hero.name); // ์˜์›…
}

6) ์ถ”์ƒ ํด๋ž˜์Šค

  • ์ถ”์ƒ ๋ฉ”์„œ๋“œ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค(์ถ”์ƒ ๋ฉ”์„œ๋“œ: ์„ ์–ธ๋งŒ ๋˜๊ณ  ์ •์˜๊ฐ€ ์—†๋Š” ๋ฉ”์„œ๋“œ)
abstract class Monster {
void attack();
}
  • ๊ทธ๋Œ€๋กœ ์ธ์Šคํ„ดํŠธํ™” ๋ถˆ๊ฐ€๋Šฅ, ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ž„ํ”Œ๋ฆฌ๋จผํŠธํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์™„์„ฑํ•˜๋Š” ์ƒ์† ์žฌ๋ฃŒ๋กœ ์‚ฌ์šฉ(๋Œ€์ƒ ํด๋ž˜์Šค: implements, ๋ฉ”์„œ๋“œ: @override)
  • ์—ฌ๋Ÿฌ ์ถ”์ƒ ํด๋ž˜์Šค ํ•œ ๋ฒˆ์— ์ž„ํ”Œ๋ฆฌ๋จผํŠธ ๋ถˆ๊ฐ€๋Šฅ! ์ถ”์ƒ ํด๋ž˜์Šค ๊ตฌํ˜•ํ•  ๋•Œ๋Š” ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜ ํ•„์š”
abstract class Flyable {
void fly();
}
class Bat implements Monster, Flyable {
@override
void attack() {
print('ํ• ํ€ด๊ธฐ');
}
@override
void fly() {
print('ํŽ„๋Ÿญ');
}
}

7) mixin(๋ฏน์Šค์ธ)

  • with: ์ƒ์†ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํด๋ž˜์Šค ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ์ˆ˜ ์žˆ์Œ (-> mixin)
class Goblin implements Monster {
@override
void attack() {
print('attack!');
}
}
class DarkGoblin extends Goblin with Hero { // DarkGoblin์€ Monster ํด๋ž˜์Šค, Gobrin ํด๋ž˜์Šค, Hero ํด๋ž˜์Šค ๊ธฐ๋Šฅ ๋ชจ๋‘ ์žˆ์Œ -> ๋‹คํ˜•์„ฑ
...
}

8) ์—ด๊ฑฐ(enum) ํƒ€์ž…

  • ์ƒ์ˆ˜ ์ •์˜ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ์˜ ํด๋ž˜์Šค, ์ƒ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • swith ๋ฌธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด enum ํƒ€์ž…์œผ๋กœ ์ •์˜๋œ ๋ชจ๋“  ์ƒ์ˆ˜๋ฅผ case๋กœ ๊ฒ€ํ† ํ•˜๊ธฐ ๋•Œ๋ญ‰์— ์—๋Ÿฌ ๋ฐฉ์ง€์— ํšจ๊ณผ์ 
enum status { login, logout }
var authStatus = status.logout;
swith(authStatus) {
case Status.login:
print('๋กœ๊ทธ์ธ');
break;
case Status.logout: // ์—†์œผ๋ฉด error
print('๋กœ๊ทธ์•„์›ƒ');
break;


6. ์ปฌ๋ ‰์…˜

  • List: ๊ฐ™์€ ํƒ€์ž…์˜ ์ž๋ฃŒ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ  ํŠน์ • ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
  • Map: ํ‚ค(key)์™€ ๊ฐ’(value)์˜ ์Œ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ , ํ‚ค๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ
  • Set: ์ค‘๋ณต์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ณ , ์ฐพ๋Š” ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋‹จํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ

1) List

  • ๋‹คํŠธ๋Š” ๋ฐฐ์—ด ์ œ๊ณต X, list ์‚ฌ์šฉ๋ฒ•์€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๋ฐฐ์—ด๊ณผ ํก์‚ฌ
List<String> items = ['lee', 'seung', 'jae']; // <String>์€ ๋ฆฌ์ŠคํŠธ์— ๋‹ด๊ธธ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ง€์ •ํ•œ ๊ฒƒ.
var itmes = ['lee', 'seung', 'jae']; // ํƒ€์ž… ์ถ”๋ก  ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋ก  var ์„ ์–ธ
  • dynamic

- ๋ชจ๋“  ํƒ€์ž… ๋Œ€๋ณ€
- ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ํ•œ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ฑฐ๋‚˜ ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋„ ์‚ฌ์šฉ

List<dynamic> list = [1, 2, 4, 'jae'];
var list = [1, 2, 4, 'jae']; // ๋ช…์‹œ์ ์œผ๋กœ List<dynamic> ์“ฐ๋Š” ๋Œ€์‹  var ์‚ฌ์šฉ ๊ฐ€๋Šฅ

2) ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž(...)

  • ...: ์ปฌ๋ ‰์…˜์„ ํŽผ์ณ์ฃผ๋Š” ์—ฐ์‚ฐ์ž
  • ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์•ˆ์— ์ปฌ๋ ‰์…˜ ์‚ฝ์ž…ํ•  ๋•Œ ์‚ฌ์šฉ
// List<String> items = ['lee', 'seung', 'jae'];
var items = ['lee', 'seung', 'jae'];
var items2 = ['jaejaejae', ...items, 'jaejae'];

3) Map

  • ์ˆœ์„œ๊ฐ€ ์—†๊ณ  ํƒ์ƒ‰์ด ๋น ๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ ์ปฌ๋ ‰์…˜, ํ‚ค(key)-์Œ(value) ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ
  • ํ‚ค๋ฅผ ์ด์šฉํ•ด ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ(์š”์ฒญ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ์—†์œผ๋ฉด null ๋ฐ˜ํ™˜)
// Map<String, String> cityMap = { ...์ƒ๋žต...}; ์™€ ๊ฐ™์Œ
var cityMap = {
'ํ•œ๊ตญ': '๋ถ€์‚ฐ';
'์ผ๋ณธ': '๋„์ฟ„';
'์ค‘๊ตญ': '๋ถ๊ฒฝ';
};
print(cityMap.length); // 3
print(cityMap['์ค‘๊ตญ']); // ๋ถ๊ฒฝ
print(cityMap['๋ฏธ๊ตญ']); // null

cityMap['๋ฏธ๊ตญ'] = '์›Œ์‹ฑํ„ด'; // ์ƒˆ๋กœ์šด ๊ฐ’ ์ถ”๊ฐ€
pirnt(cityMap['๋ฏธ๊ตญ']); // ์›Œ์‹ฑํ„ด

4) Set

  • ์ค‘๋ณต ํ—ˆ์šฉX
  • ์ฃผ์˜! ๊ฐ’ ์—†์ด ๊ทธ๋ƒฅ {}๋งŒ ์ž‘์„ฑํ•˜๋ฉด Set์ด ์•„๋‹Œ Map์œผ๋กœ ์ธ์‹
// Set<String> citySet = {...์ƒ๋žต...};๊ณผ ๊ฐ™์Œ
var citySet = {'์„œ์šธ', '์ˆ˜์›', '์˜ค์‚ฐ', '๋ถ€์‚ฐ'};

citySet.add('์•ˆ์–‘'); // ์ถ”๊ฐ€
citySet.remove('์ˆ˜์›'); // ์‚ญ์ œ
print(citySet.contains('๋„์ฟ„')); // ์ž๋ฃŒ๊ฐ€ ์ง‘ํ•ฉ์— ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ bool ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜