๐Ÿ“Œ Dart ๋ฌธ๋ฒ• ์ •๋ณต๊ธฐ 1์žฅ

11 minute read

๋‚ด๊ฐ€ Dart๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ชฉ์ ์€ Flutter๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•ด๋ณด๊ณ  ์‹ถ์€ ๋งˆ์Œ ๋•Œ๋ฌธ์ž„.

๊ธฐ๋ณธ์ ์œผ๋กœ Dart๋Š” vold main () { ... }๋กœ ์ž‘๋™ํ•˜๊ฒŒ๋จ. ๊ทธ๋ฆฌ๊ณ  ์นด๋ฉœ์ผ€์ด์Šค๋ฅผ ๋”ฐ๋ฅธ๋‹ค๊ณ  ํ•จ. ๊ทธ๋ƒฅ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” OOP๋ฅผ ๋”ฐ๋ฅด๊ณ  ๋ฌธ๋ฒ•๋„ ์–ด๋А ์ •๋„ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋Š”๊ฒŒ ์ข‹์„ ๋“ฏ. ๊ทธ๋ฆฌ๊ณ  ํ•„์ž๋Š” ์ด๋ฏธ ์—ฌ๋Ÿฌ ์–ธ์–ด๋ฅผ ๊ฒฝํ—˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, Dart๋งŒ์˜ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์ด๋‚˜ ํŠน์ง•์ด ์•„๋‹Œ ์ด์ƒ ์ปดํ“จํ„ฐ ๋ฌธ๋ฒ•์˜ ๊ณ ์œ ํ•œ ํŠน์„ฑ์€ ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž„.

Dart์˜ ๋ณ€์ˆ˜ ์„ ์–ธ์€ ๋งค์šฐ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์ด ์กด์žฌํ•จ.

var, String, bool, int, dynamic๋“ฑ๋“ฑ ๋งค์šฐ ๋งŽ์€ ๊ฒƒ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์Šต์„ ์œ„์ฃผ๋กœ ์—ฐ์Šต์„ ํ•˜๋Š”๊ฒŒ ๋น ๋ฅด๊ฒŒ ๋ฌธ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋จ.

๋น ๋ฅด๊ฒŒ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์„ ์ตํ˜€๋ณด์ž.

void main() {
  var integer = 1;
  var string = '1';
  var boolean = true;
  
  int number = 1;
  String str = '1';
  bool isTrue = true;
  
  print(string + ' ' + str);
  print($string + ' ' + $str);
  print(${string + ' ' + $str}); // string์„ ๋‹ค๋ฃจ๋Š” ๋ฒ•
}

์ผ๋‹จ var๋กœ ๋ณ€์ˆ˜ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•จ. ๊ทธ๋ฆฌ๊ณ  ๋”ฐ๋กœ int, String, bool ๋“ฑ์œผ๋กœ ํŠน์ • ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋กœ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•จ. ๋ฌผ๋ก  int, String, bool์€ ํ•œ ๋ฒˆ ํƒ€์ž…์ด ์ •ํ•ด์ง€๋ฉด ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ๋ณ€์ˆ˜ ํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•จ. var๋กœ ํ• ๋‹น ํ•  ๋•Œ์—๋„ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ณ  ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด(var integer = 1;) ํƒ€์ž… ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š”๊ฒŒ dynamic์ž„. ๋”ฐ๋ผ์„œ dynamic์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

void main() {
  dynamic name = 'Code';
  print(name); // 'Code'
  
  name = 1;
  print(name); // 1
}

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ var์˜ ๊ฒฝ์šฐ์—๋„ ๋ณ€์ˆ˜๋งŒ ์„ ์–ธํ•˜๊ณ  ํƒ€์ž…์€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ณ€์ˆ˜ ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์žฌ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•จ.

void main() {
  var data;
  data = 1;
  print(1) // 1
  data = '1';
  print('1') // '1'
}

๋‹ค์Œ์œผ๋กœ List๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Œ. ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์Œ

void main() {
  List alphabetList = [ // ์„ ์–ธํ•  ๋•Œ ๊ทธ๋ƒฅ ๋ฌธ์ž์—ด๋กœ ํ• ๋‹น ํ•œ ๊ฒƒ์ž„
    'a',
    'b',
    'c'
  ];
  // ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•˜๋ฉด ๋จ.
  List<String> numList = [ // Java, C#๊ณผ ๋น„์Šทํ•จ. ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ์•„์— ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ณ  ๋“ค์–ด๊ฐ„ ๊ฒƒ.
    '1',
    '2',
    '3'
  ];
	// ๊ธฐ๋ณธ์ ์œผ๋กœ index์˜ ๊ฒฝ์šฐ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋™์ผ ํ•ด๋‹น ์›์†Œ์— ์ง์ ‘ slicing โ†’ [idx]
  print(numList[0]); // '1'
  // ๊ธธ์ด ๋ฉ”์†Œ๋“œ length
  print(numList.length) // 3
}

์ด์ œ๋Š” Map์„ ์•Œ์•„๋ณผ ๊ฒƒ์ž„.

void main() {
  // python์˜ dictionary๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผ
  Map numList = {
    'one': '1',
    'two': '2',
    'three': '3'
  };
  // ์œ„์™€ ๊ฐ™์€ ์˜๋ฏธ์˜ ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ๋˜๋ฉด
  Map<String, String> numList2 = {
    'one': '1',
    'two': '2',
    'three': '3'
  };
  // ์ด๋ ‡๊ฒŒ ์งœ์ฃผ๋ฉด ๋จ
  
  // ๋งŒ์•ฝ์— ์—ฌ๊ธฐ์„œ ์›์†Œ๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์งœ๋ฉด ๋จ
  numList.addAll({
    'four': '4'
  });
  
  // ๋˜๋Š” ํŠน์ • key์˜ value๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋จ
  numList['one'] = 'ํ•˜๋‚˜';
  
  // ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ์— key์™€ value๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋จ
  numList.remove('one');
  
  // Key value๋ฅผ ๋”ฐ๋กœ ๋”ฐ๋กœ ๋ฐ›๊ณ  ์‹ถ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋”ฉ
  print(numList.keys.toList());
  print(numList.values.toLsit());
  // ์ฐธ๊ณ ๋กœ toList()๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ List๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž„
  // ์ด๊ฒŒ ๊ทธ๋ƒฅ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ.
}

์ด์ œ final, const๋ฅผ ์•Œ์•„๋ณผ๊ฒƒ์ž„

void main() {
  final myName1 = 'junku';
  final String myName2 = 'Devjun';
  // final์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Œ. ๊ฐ€๋ณ€์ ์ด์ง€ ์•Š์Œ
  
  const myName3 = 'Dev';
  const myName4 = 'Dart';
  // const๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Œ. ๊ฐ€๋ณ€์ ์ด์ง€ ์•Š์Œ
}

๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜์˜ ํŠน์ง•์€ final์€ build time ๊ฐ’์„ ๋ชฐ๋ผ๋„ ์„ ์–ธ ๊ฐ€๋Šฅ. ๊ทผ๋ฐ const๋Š” build time ๊ฐ’์„ ๋ชจ๋ฅด๋ฉด ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ.

void main() {
  final now1 = new DateTime.now(); // ์„ ์–ธ ๊ฐ€๋Šฅ
  
  const now2 = new DateTime.now(); // ์„ ์–ธ ๋ถˆ๊ฐ€๋Šฅ
  
  // DateTime.now()๋Š” ํ˜„์žฌ ์‹œ๊ฐ„์„ ์˜๋ฏธํ•จ.
}

์ด์ œ๋Š” enum ํƒ€์ž…์ž„

enum Status { // ์•ž์€ ํ•ญ์ƒ ๋Œ€๋ฌธ์ž
  A,
  B,
  C
}

void main() {
  Status status = Status.A;
  
  switch(status) {
    case Status.A:
      print('It is A');
      break;
      
    case Status.B:
      print('It is B');
      break;
      
    default:
      print('์ด๊ฑด ๋ญก๋‹ˆ๊นŒ?');
      break;       
  }
}

์ด์ œ if๋ฌธ์ž„

void main() {
  int num1 = 2;
  var num2 = 2;
  
	if (num1 % 2 == 0) {
    print('์ง์ˆ˜์ž„');
  } else {
    print('ํ™€์ˆ˜์ž„')
  }
  
  if (num2 % 2 == 0) {
    print('์ง์ˆ˜์ž„');
  }
  
  // switch
  switch(num1 % 2) {
    case 1:
      print('ํ™€์ˆ˜์ž„');
      break;
    case 0:
      print('์ง์ˆ˜์ž„');
      break;
    default:
      print('์ผ๋‹จ ์ž์—ฐ์ˆ˜๋Š” ์•„๋‹˜');
      break;   
  }
}

๋‹ค์Œ์€ for๋ฌธ์ž„

void main() {
  int total = 0;
  List naturalNumberList = [1, 2, 3, 4, 5];
  
  for(int i = 0; i < naturalNumberList.length; i++) {
    total += naturalNumberList[i];
  }
  print(total);
}

์œ„์˜ ์ฝ”๋“œ๋Š” index slicing์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋„ ํ•  ์ˆ˜ ์žˆ์Œ.

void main() {
  int total = 0;
  List numberList = [1, 2, 3, 4, 5];
  
  for(int number in numberList) {
    total += number;
  }
  print(total); // 15
}

๋‹ค์Œ์€ while ๋ฌธ์ž„

void main() {
  int total = 0;
  
  while(true) {
    if(total >= 10) {
      break;
    } else {
      total ++;
    }
  }
  print(total);
} // ์ด๋ ‡๊ฒŒ ์งค ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์งค ์ˆ˜๋„ ์žˆ์Œ

void main() {
  int total = 0;
  
  while(total < 10) {
    total ++;
  }
  print(total);
}

์–ด๋–ป๊ฒŒ ์งœ๋“  ๋งˆ์Œ๋Œ€๋กœ ์งœ๋Š” ๊ฒƒ์ž„. do ๊ตฌ๋ฌธ์ž„

void main() {
  int total = 0;
  
  do {
    print(total); // ๊ทธ๋ƒฅ while์˜ body ๋ถ€๋ถ„์ด ์ด ๋ถ€๋ถ„์ž„
    total ++;
  } while(total < 100);
}

์•„ ๊ทธ๋ฆฌ๊ณ  continue๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ ์ด๊ฑด ๋”ฑํžˆ ๋ง์€ ์•ˆํ•˜๊ฒ ์Œ. ๊ทธ๋ƒฅ ์จ์•ผ์ง€. ์ด์ œ ํ•จ์ˆ˜๋กœ ใ„ฑใ„ฑ

void main() {
  
  double res = linearExp(1, 2, 3);
  print(res); // 5
  
}

// ํ•จ์ˆ˜ ์„ ์–ธ ex) y = ax + b 
double linearExp(double a, double b, double x) {
  return a*x + b;
} // ์˜ต์…˜์‹์œผ๋กœ ๋„ฃ์–ด์ค„์ˆ˜๋„ ์žˆ์Œ

double linearExp(double a, double x, [double b = 0]) {
  return a*x + b; // default b๊ฐ’์ด 0์ž„.
}

์œ„ ํ•จ์ˆ˜ ์ฝ”๋“œ๋Š” ์œ„์น˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ผ ํ•จ. ๊ทธ๋ƒฅ ์œ„์น˜๋กœ ๊ฒฐ์ •๋‚˜๋Š” ๊ฒƒ์ž„. ๊ทผ๋ฐ ์ด์ œ name parameter๊ฐ€ ๋”ฐ๋กœ ์žˆ์œผ๋‹ˆ๊นŒ. ์ด๊ฒƒ๋„ ์•„๋ž˜์—์„œ ํ™•์ธ ใ„ฑ

void main() {
  double res = linearExp(1, 2, b:3);
  print(res);
}

double linearExp(double a, double x, { // ์ค‘๊ด„ํ˜ธ๋กœ ์‚ฌ์šฉํ•˜๋ฉด name parameter์ž„.
  dynamic b
}) {
  return a * x + b;
}

๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ systax ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๊ฒŒ ์žˆ์Œ. ์ง€๊ธˆ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” dartpad.dartlang.org์—์„œ dart ๋ฌธ๋ฒ•์„ ์—ฐ์Šตํ•˜๋Š” ์ค‘์ธ๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ.

void main() {
  double res = linearExp(1, 2, b:3);
  print(res);
}

double linearExp(double a, double x, {
  double b
}) {
  return a * x + b;
}

Error: The parameter 'b' can't have
a value of 'null' because of its type 'double',
but the implicit default value is 'null'.
  double b
         ^
Error: Compilation failed.

์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜ฌ ๋•Œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ ๋‚ด์—์„œ null ๊ฐ’์„ ํ•ด๊ฒฐํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ. ์‚ฌ์ดํŠธ footer์— ์ด๋Ÿฌํ•œ ์˜ต์…˜์„ ํด๋ฆญํ•ด์„œ ํ—ค์ œํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ํ•ด๋‹น ๋ถ€๋ถ„์„ ํด๋ฆญํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ์ œ๋Œ€๋กœ ๋‹ค์‹œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ. ์ฐธ๊ณ  ใ„ฑ

๊ทผ๋ฐ ์™œ dynamic์€ ์˜ค๋ฅ˜๊ฐ€ ์•ˆ๋‚ฌ๋Š”๊ฐ€? ์ƒ๊ฐํ•˜๋ฉด dynamic๊ณผ double์˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž„. dart์—์„œ๋Š” ๋ชจ๋“ ๊ฒŒ ๊ฐ์ฒด์ž„. double์€ ์‹ค์ˆ˜ํ˜•์œผ๋กœ ๊ทธ ๊ฐ์ฒด๋ฅผ ํ•œ์ •์‹œํ‚ด. ํ•˜์ง€๋งŒ dynamic์€ ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ๋ฒ”์šฉ์ ์ด๊ธฐ ๋•Œ๋ฌธ์—, null๊ฐ’์— ๋Œ€ํ•œ safety๊ฐ€ ์ž‘์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž„. ๊ทธ๋ ‡๋‹ค๊ณ  ๋ชจ๋“  ๊ฑธ dynamic์œผ๋กœ ํ• ๋‹นํ•˜์ง„ ์•Š๋Š” ๊ฑธ ์ถ”์ฒœ. ์™œ๋ƒํ•˜๋ฉด ๋‚ด ์ƒ๊ฐ์ด์ง„ ํ•˜์ง€๋งŒ, dynamic์ด ํƒ€์ž…์„ ์ง€์ •ํ•ด์„œ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋งˆ ๋” ๋งŽ์ด ๋จน์„ ๊ฒƒ์ž„. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์“ฐ๋˜ ๊ทธ๋Ÿฐ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ฉด ์ตœ๋Œ€ํ•œ ์•ˆ์“ฐ๋Š” ๊ฒƒ์„ ์ง€ํ–ฅํ•˜๋Š”๊ฒŒ ๋งž๋Š”๋“ฏ.

์ด์ œ typedef์ž„.

void main() {
  calculate(1, 2, add);
  calculate(1, 2, subtract);
}

typedef Operation(int x, int y); // Operation ์ •ํ•˜๊ธฐ

void add(int x, int y) { // ๊ฐ๊ฐ์˜ ์—ฐ์‚ฐ์„ ์ •ํ•˜๊ธฐ
  print('${x + y}');
}

void subtract(int x, int y) {
  print('${x - y}');
}

void calculate(int x, int y,  Operation oper) { // ์ด๊ฒŒ ์ž‘๋™ํ•จ์ˆ˜์ž„ Operation์€ oper๋กœ ์ž‘๋™์‹œํ‚ค๊ฒ ๋‹ค? ์ด๋Ÿฐ ์˜๋ฏธ์ž„
  oper(x, y);
}

์ด๊ฑฐ ์•ฝ๊ฐ„ ์ฝ”๋“œ๊ฐ€ cpp๊ฐ™์€ ๋А๋‚Œ์„ ๊ฐ–๊ณ  ์žˆ์Œ. cpp์€ ์•„์ง ์ž˜ ๋ชจ๋ฅด๋Š” ์–ธ์–ด๋ผ์„œ ๊นŠ๊ฒŒ ์•Œ์ง€๋Š” ๋ชปํ•˜์ง€๋งŒ, ํ•ด๋‹น ์—ฐ์‚ฐ์„ ์ •ํ•˜๊ณ  ์ด๋ฅผ ํ•จ์ˆ˜๋กœ ์‹คํ–‰ํ•˜๋Š” ๋А๋‚Œ์ž„.

์ด์ œ class์ž„. python์˜ class ๋ฌธ๋ฒ• ๋ณด๋‹ค๋Š” java์˜ class ๋А๋‚Œ์ด ๊ฐ•ํ•จ.

void main() {
  Name name = new Name();
  name.sayName();
}

class Name {
  String name ='SSAFY';
  
  void sayName() {
    print('์ €๋Š” ${this.name}์ž…๋‹ˆ๋‹ค.');
  }
}

๊ทธ๋Ÿฌ๋ฉด ์ด๋ฆ„์„ ๋„ฃ์–ด์ฃผ๋Š”๋Œ€๋กœ ํ•  ์ˆ˜๋Š” ์žˆ๋Š”๊ฐ€? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋Œ.

void main() {
  Name name = new Name('SSAFY');
  name.sayName();
}

class Name {
  final name;
  
  
  Name( // ์ด ๋ถ€๋ถ„์€ ๋‹ค์‹œ๋ณด๋ฉด์„œ ์ตํ˜€์•ผ ํ• ๋“ฏ
    String name, // String์ด๋ผ๋Š” name์ธ๋ฐ
  ) : this.name = name; // ์ด๊ฑธ ์œ„์˜ name์—๋‹ค๊ฐ€ ํ• ๋‹นํ•ด์ค˜. ์ฆ‰ ์ด ๋ถ€๋ถ„์€ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์ž„.
  
  void sayName() {
    print('์ €๋Š” ${this.name}์ž…๋‹ˆ๋‹ค.'); // ์ถœ๋ ฅ
  }
}

์กฐ๊ธˆ ๋” ํ™œ์šฉํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

void main() {
  Name name = new Name('SSAFY', 4);
  name.sayName();
  name.sayNum();
}

class Name {
  // ํด๋ž˜์Šค์—์„œ ํ™œ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฅผ final๋กœ ์„ ์–ธ. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์•ˆ๋œ๋‹ค?
  // ๊ทธ๋Ÿฐ ์ด์•ผ๊ธฐ๋Š” ๋ชป๋“ค์Œ
  // ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜์–ด ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜ ์ด์ง€๋งŒ,
  // ๋‹คํŠธ ๋‚ด์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์ง€ ์•Š์œผ๋ฏ€๋กœ this๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ทผํ•จ.
  final name; 
  final classNum;

  // class์—์„œ ๋ฐ›์€ ์• ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐํ™” ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ.
  Name(
    String name, 
    int classNum,
  )   : this.name = name,
        this.classNum = classNum;

  // ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•œ ํ•จ์ˆ˜ ๋ถ€๋ถ„
  void sayName() {
    print('์ €๋Š” ${this.name}์ž…๋‹ˆ๋‹ค.');
  }
  
  void sayNum() {
    print('์ €๋Š” ${this.classNum}์ž…๋‹ˆ๋‹ค.');
  }
}

์ข€ ๋” ๋ณต์žกํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ๋ฒ•. ์•ฝ๊ฐ„ ์ด๋•Œ๋ถ€ํ„ฐ ๋ฌธ๋ฒ•์ด ๊ผฌ์ด๊ธฐ ์‹œ์ž‘ํ•จ. (์•„๋‚˜..)

void main() {
  Name name = new Name('SSAFY', 4);
  name.sayName();
  name.sayNum();
  
  Name kimssafy = new Name.fromMap({
    'name': '๊น€์‹ธํ”ผ',
    'classNum': 4
  });
  
  kimssafy.sayName();
}

class Name {
  final name;
  final classNum;

  Name(
    String name,
    int classNum,
  )   : this.name = name,
        this.classNum = classNum;

  Name.fromMap( //  Map์„ ํ™œ์šฉํ•œ ๋ฐฉ๋ฒ•์ž„.
    Map values,
  ) : this.name = values['name'],
      this.classNum = values['classNum'];
  
  void sayName() {
    print('์ €๋Š” ${this.name}์ž…๋‹ˆ๋‹ค.');
  }
  
  void sayNum() {
    print('์ €๋Š” ${this.classNum}๋ฐ˜ ์ž…๋‹ˆ๋‹ค.');
  }
}

private ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฒ•

void main() {
  Name name = new Name('SSAFY', 4, 1000);
  name.sayName();
  name.sayNum();
  name.sayId();
  
  Name kimssafy = new Name.fromMap({
    'name': '๊น€์‹ธํ”ผ',
    'classNum': 4,
    'id': 1000,
  });
  
  kimssafy.sayName();
  kimssafy.sayNum();
  kimssafy.sayId();
}

class Name {
  final name;
  final classNum;
  final _id;
  // ์–ธ๋” ๋ฐ”๋ฅผ ์“ฐ๋ฉด _id๋Š” private variable์ž„

  Name(
    String name,
    int classNum,
    int id,
  )   : this.name = name,
        this.classNum = classNum,
        this._id = id;

  Name.fromMap(
    Map values,
  ) : this.name = values['name'],
      this.classNum = values['classNum'],
      this._id = values['id'];
  
  void sayName() {
    print('์ €๋Š” ${this.name}์ž…๋‹ˆ๋‹ค.');
  }
  
  void sayNum() {
    print('์ €๋Š” ${this.classNum}๋ฐ˜ ์ž…๋‹ˆ๋‹ค.');
  }
  
  void sayId() {
    print('์ €์˜ ๋ฒˆํ˜ธ๋Š” ${this._id}๋ฒˆ ์ž…๋‹ˆ๋‹ค.');
  }
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‹คํ–‰๋จ.. ๐Ÿคญ๐Ÿคญ๐Ÿคญ๐Ÿคญ๐Ÿคญ๐Ÿคญ๐Ÿคญ๐Ÿคญ

์›๋ž˜ ๋˜๋ฉด ์•ˆ๋จ. private ๋ณ€์ˆ˜๋Š” ์Šค์ฝ”ํ”„๊ฐ€ ์žˆ์–ด์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Œ. ๊ทผ๋ฐ ๊ฐ€์ ธ์˜ดโ€ฆ. ์™œ??

dart์—์„œ๋Š” ํ•œ ํŒŒ์ผ ๋‚ด์—์„œ ์ž‘๋™ํ•˜๋Š” class๋ฅผ ํ•œ์ •์œผ๋กœ private ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ด. ์—„์ฒญ๋‚œ ํŠน์ง•์ž„. ์ด๊ฑด ๊ธฐ์–ตํ•ด์•ผํ•จ.

๊ทธ๋‹ˆ๊นŒ ๋‹ค๋ฅธ dart ํŒŒ์ผ ๋‚ด์—์„œ ์ด๋ฅผ ์ž‘๋™์‹œํ‚ค๋ฉด _id๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•จ. ๊ธฐ์–ตํ•˜์…ˆ. ์ฆ‰ ํŒŒ์ผ ๋‹จ์œ„๋กœ private ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ค„์ง.

์ด์ œ getter์™€ setter์ž„. ์œ„์˜ ์ฝ”๋“œ์˜ class์—์„œ ์•„๋ž˜ ์ฝ”๋“œ๋งŒ ์ถ”๊ฐ€์‹œํ‚ค๋ฉด ๋จ. ๊ทผ๋ฐ final _id๋ฅผ int _id๋กœ ๋ฐ”๊พธ๋Š”๊ฑด ์„ผ์Šค์ž„ final์€ ๋ณ€์ˆ˜ ๋ชป๋ฐ”๊ฟˆ.

void main() {
 
  Name kimssafy = new Name('kimssafy', 1, 20);
  
  print(kimssafy.id);
  kimssafy.id = 100000;
  print(kimssafy.id);
  
}

class Name {
  //...
  get id {
    return this._id;
  }
  
  set id(int id) {
    this._id = id;
  }
}

extends๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

void main() {
  ClassNum kimssafy = new ClassNum('kimssafy', 1, 20);
  kimssafy.sayClassNum();
}

class Name {
  // ...
}

class ClassNum extends Name {
  ClassNum(
    String name,
    int classNum,
    int _id,
  ) : super(
          name,
          classNum,
          _id,
        );
  
  void sayClassNum() {
    print("์ €๋Š” ${this.classNum}๋ฐ˜ ์ž…๋‹ˆ๋‹ค.");
  }
}

๊ทธ ๋‹ค์Œ์€ method overriding์ž„

void main() {
  Parent parent = new Parent(3);
  
  int result = parent.square();
  
  print(result);
  
  Child child = new Child(3);
  
  int result2 = child.square();
  
  print(result2);
  
}

class Parent {
  final int number;

  Parent(
    int number,
  ) : this.number = number;
  
  int square() {
    return this.number * this.number;
  }
}

class Child extends Parent {
  Child(
    int number,
  ) : super(number);
  
  @override
  int square() {
    return this.number + this.number;
  }
}

// ์•„๋ž˜์™€ ๊ฐ™์ด ์งค์ˆ˜๋„ ์žˆ์Œ.
class Parent {
  final int number;

  Parent(
    int number,
  ) : this.number = number;
  
  int square() {
    return this.number * this.number;
  }
}

class Child extends Parent {
  Child(
    int number,
  ) : super(number);
  
  @override
  int square() {
    int result = super.square();
    
    return result + result 
  }
}
// Child child = new Child(3)์„ ๋„ฃ๊ณ 
// int result2 = child.square();
// print(result2) // 18์ž„

๋‹ค์Œ์œผ๋กœ ์Šคํƒœํ‹ฑ์ž„

void main() {
  Employee kimssafy = new Employee('๊น€์‹ธํ”ผ');
  Employee parkssafy = new Employee('๋ฐ•์‹ธํ”ผ');
  
  Employee.community = 'SSAFY';
  
  print('--๊น€์‹ธํ”ผ--');
  kimssafy.printNmaeAndBuilding();
  
  print('--๋ฐ•์‹ธํ”ผ--');
  parkssafy.printNmaeAndBuilding();
  
  Employee.community = '๋ฉ€ํ‹ฐ์บ ํผ์Šค';
  
  print('--๊น€์‹ธํ”ผ--');
  kimssafy.printNmaeAndBuilding();
  
  print('--๋ฐ•์‹ธํ”ผ--');
  parkssafy.printNmaeAndBuilding();
  
  Employee.printBuilding();
}

class Employee {
  static String community;
  String name;

  Employee(
    String name,
  ) : this.name = name;
  
  void printNmaeAndBuilding() {
    print('์ œ ์ด๋ฆ„์€ $name์ž…๋‹ˆ๋‹ค. $community ์—์„œ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.');
  }
  
  static void printBuilding() {
    print('์ €ํฌ๋Š” $community ์—์„œ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.');
  }
}

๋‹ค์Œ์€ ๋‹คํŠธ์˜ ์ธํ„ฐํŽ˜์ด์Šค์ž„. ์กฐ๊ธˆ ํŠน์ดํ•จ. ์™œ๋ƒ๋ฉด class๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

void main() {
  ClassNum kimssafy = new ClassNum(4);
  kimssafy.sayClassNum();
  
  new ClassNum(4)
  	..sayClassNum()
  	..sayGroup();
}

class ClassNumInterface {
  void sayClassNum() {}
}

class ClassNum implements ClassNumInterface {
  int classNum;
  String group = '์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””';

  ClassNum(
    int classNum,
  ) : this.classNum = classNum;

  void sayClassNum() {
    print('์ €๋Š” ${this.classNum}๋ฐ˜ ์ž…๋‹ˆ๋‹ค.');
  }
  
  void sayGroup() {
    print('์ €๋Š” ${this.group}์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.');
    
  }
}

ํด๋ž˜์Šค๋ฅผ ๊ณง๋ฐ”๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ™œ์šฉํ•จ. ์™€์šฐ,,,,

๊ทธ ๋‹ค์Œ์€ getters์ž„.

void main() {
  List ssafy = [
    1,
    2,
    3,
    4,
    5,
  ];
  
  // getters
  print(ssafy.first); // ์ฒซ์›์†Œ
  print(ssafy.isEmpty); // ๋น„์—ˆ๋Š”๊ฐ€?
  print(ssafy.isNotEmpty); // ์•ˆ ๋น„์—ˆ๋Š”๊ฐ€?
  print(ssafy.length); // ๊ธธ์ด
  print(ssafy.last); // ๋งˆ์ง€๋ง‰ ์›์†Œ
  print(ssafy.reversed); // ๋ฆฌ๋ฒ„์Šค
}
void main() {
  List ssafy = [
    1,
    2,
    3,
    4,
    5,
  ];
  
  // ์ถ”๊ฐ€
  ssafy.add(6);
  print(ssafy); // [1, 2, 3, 4 ,5 ,6]
  
  // ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€
  ssafy.addAll([7, 8, 9]);
  print(ssafy); // [1, 2, 3, 4 ,5 ,6, 7, 8]
}
void main() {
  List memberList = [
    {
      'id':1,
      'name': 'kimssafy'
    },
    {
      'id':2,
      'name': 'parkssafy'
    },
    {
      'id':3,
      'name': 'leessafy'
    }
  ];
  
  var item = memberList.firstWhere((item) => item['id'] == 1);
  print(item);
  
  var index1 = memberList.indexWhere((item) => item['id'] == 1);
  print(index1);
  
  var index2 = [10, 20, 30].indexOf(20);
  print(index2);
  
  var contains = [10, 20, 30].contains(30);
  print(contains);
}

๋ฆฌ์ŠคํŠธ์— ๊ด€ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฃจํ•‘ ๋ฒ•

void main() {
  List memberList = [
    {
      'id':1,
      'name': 'kimssafy',
      'group': 1
    },
    {
      'id':2,
      'name': 'parkssafy',
      'group': 4
    },
    {
      'id':3,
      'name': 'leessafy',
      'group': 2
    }
  ];
  
  memberList.forEach((item) { // js๋ž‘ ๊ฐ™์Œ
    print(item);
  });
  
  var newList = memberList.map((item) {
    return item['name']; // name๋งŒ ๋‹ค ๋ฝ‘๊ธฐ
  });
  
  print(newList);
  
  var fold = memberList.fold(0, (t, e) {// t์™€ e์˜ ๋ณ€์ˆ˜ ํƒ€์ž…์ด ๋˜‘๊ฐ™์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Œ
    return t + e['id']; // t๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ e์˜ id๊ฐ’์„ ๋‹ค ๋”ํ•˜๊ธฐ
  });
  
  print(fold); 
  
  var reduce = [1, 2, 3, 4, 5].reduce((t, i) => t + i); // lambda ํ•จ์ˆ˜์™€ ๋น„์Šท
  // t์™€ i์˜ ๋ณ€์ˆ˜ ํƒ€์ž…์ด ๋˜‘๊ฐ™์•„์•ผํ•จ, t์— 1, 2, 3, 4, 5 ๋‹ค ๋”ํ•˜๊ธฐ
  print(reduce); 
}

๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค

void main() {
  List numberList = [10, 20, 30, 40, 50];
  
  numberList.remove(10); // 10์„ ์ง€์›€
  print(numberList);
  
  numberList.removeAt(1); // ์ธ๋ฐ์Šค๊ฐ€ 1์ธ๊ฑธ ์ง€์›€
  print(numberList);
  
  numberList.removeWhere((e) => e == 50); // ๊ฐ’์ด 50์ด๋ฉด ์‚ญ์ œ
  print(numberList);
  
  List numberList2 = [10, 20, 30, 40, 50];
  
  numberList2.shuffle(); // ์„ž์ž„
  print(numberList2);
}