[25.06.17 TIL] Dart ๋ฌธ๋ฒ•

๊น€์˜๋ฏผยท2025๋…„ 6์›” 17์ผ

[Flutter 7๊ธฐ] ์˜จ๋ณด๋”ฉ

๋ชฉ๋ก ๋ณด๊ธฐ
2/5

๐ŸŽฏ ์˜ค๋Š˜์€ ์–ด๋ ต๊ฒŒ ๋А๊ปด์ง€๋Š” Dart ๋ฌธ๋ฒ•์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๋ถ€ํ–ˆ๋‹ค.
๊ธฐ์กด์— ๋“ค์—ˆ๋˜ ๊ฐ•์˜๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ํ•™์Šต์ด ํ•„์š”ํ•ด์„œ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ์ฐพ์•„๋ณด๊ณ  ์„œ์นญ๋„ ํ–ˆ๋‹ค.


๐Ÿ’ฌ Dart ๊ธฐ์ดˆ ๊ฐ•์˜

Dart ๊ธฐ์ดˆ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ๊ฐ•์˜์ธ๋ฐ, ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ผ์„œ ๊ทธ๋Ÿฐ์ง€ ๋˜๋‹ค๋ฅธ ๋А๋‚Œ์ด๋‹ค.
๋ณ€์ˆ˜, List, Map, ํ•จ์ˆ˜, return, imports, class ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ์ดˆ ์ง€์‹์„ ์Œ“์•˜๋‹ค.

๋‹ค๋งŒ, ์•ž์—์„œ ๋ฐฐ์›Œ์„œ ์•„๋Š” ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๋Š” ๋А๋‚Œ์ด๋ผ์„œ, ๋”ฐ๋กœ TIL์„ ์ž‘์„ฑํ•  ๋‚ด์šฉ์€ ๋ณ„๋กœ ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
์ด๋ก ์€ ๊ฐ™๊ณ , ํ™œ์šฉ๋ฒ•๋„ ๋น„์Šทํ•œ ๋А๋‚Œ์ด๋ผ ํ•œ๋ฒˆ์”ฉ ์ญ‰ ๋ณด๊ณ  ์ž์„ธํžˆ ์ดํ•ดํ•˜๊ฑฐ๋‚˜, ๋ฆฌ๋งˆ์ธ๋“œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ•™์Šตํ–ˆ๋‹ค.
์‹ค์Šต์ด๋‚˜ ์‹ค์ „๋ณด๋‹ค ์˜ˆ์ œ๋ฅผ ๋‹ค๋ฃจ๋‹ค๋ณด๋‹ˆ ๋” ์ดํ•ดํ•˜๊ธฐ ํŽธํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

โšก List, Map

void main(){
	var fruits = [๋”ธ๊ธฐ, ๋ฐ”๋‚˜๋‚˜, ์ˆ˜๋ฐ•];
    var fruitsNum = {"๋”ธ๊ธฐ: 5", "๋ฐ”๋‚˜๋‚˜: 3", "์ˆ˜๋ฐ•:1"};
    var total = 0;
    for(var i = 0; i<fruits.length; i++) {
    	final name = fruits[i];
        final cnt = fruitsNum["ํฌ๋„"]; // = null
        if(cnt != null) { //cnt๊ฐ€ null์ด ์•„๋‹ ๋•Œ
        	total = total + cnt;
        } else {
        	total = total + 0;
        }
    }
    print("๊ฐฏ์ˆ˜ ${total}");
}

ย 
์ด๋Ÿฐ ์‹์œผ๋กœ length๋ฅผ ์‚ฌ์šฉํ•œ for๋ฌธ์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด ์„ค๋ช…ํ–ˆ๋‹ค.
๋ณดํ†ต var์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ž๋™์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜ํƒ€์ž…์ด ์•„๋‹Œ var๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ ๊ฐ™๋‹ค.


โšก import

โœ๏ธ math ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๐Ÿ“Œ pow ์˜ˆ์ œ

import "dart:math" as math;
//
num numPow(int numA) {
	return math.pow(numA, 3);
}
//
void main() {
	int numA = 3;
    num total = numPow(numA);
    print("numA : $numA, total : $total");
} // ์ถœ๋ ฅ = numA : 3, total : 27

โœ” pow ๋Š” ์ œ๊ณฑ์œผ๋กœ numA : 3, total : 27 ์ด ์ถœ๋ ฅ๋œ๋‹ค.

๐Ÿ’ก import "dart:math ๋’ค์— as math๋ฅผ ๋ถ™์ด๋Š” ์ด์œ ๋Š” math.pow์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌ ๋ฐ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๐ŸŽ“ ๊ฐœ์ธ ํ•™์Šต

ํ•™์Šตํ•˜๋ฉด์„œ "์™€ ', ,์™€ ;, !=์™€ == ์ด๋Ÿฐ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒƒ๋“ค์ด๋‚˜ ๊ถ๊ธˆํ•œ ๊ฒƒ๋“ค์„ ์ž์„ธํ•˜๊ฒŒ ์ฐพ์•„๋ดค๋‹ค.

๐Ÿ”ฅ "", $ - print

โœ… print("๊ฐฏ์ˆ˜ $total");
โœ… print("๊ฐฏ์ˆ˜ ${total}");
โŒ print("๊ฐฏ์ˆ˜" $total);
โŒ print("๊ฐฏ์ˆ˜" ${total});

ย 
โœ” ๋ฌธ์ž์—ด์€ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๋ฉฐ, {}๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ’ก ๋‹จ, total.length ๋ผ๋˜๊ฐ€, .์ด ๋ถ™๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ, print("๊ฐฏ์ˆ˜ $getTotal()");๋Š” ๋™์ž‘์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ {}๋กœ ๊ฐ์‹ธ์•ผํ•œ๋‹ค.


๐Ÿ”ฅ ==, !=

if๋ฌธ, for๋ฌธ, while๋ฌธ, ํ•จ์ˆ˜ ์•ˆ ์กฐ๊ฑด, ํ‘œํ˜„์‹์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ… if โ€“ ๊ฐ€์žฅ ํ”ํ•œ ์‚ฌ์šฉ์ฒ˜

if (a == 10) {
  print("a๋Š” 10์ž…๋‹ˆ๋‹ค.");
}
if (a != 0) {
  print("a๋Š” 0์ด ์•„๋‹™๋‹ˆ๋‹ค.");
}

โœ… for โ€“ ์กฐ๊ฑด์—์„œ ์‚ฌ์šฉ

for (int i = 0; i != 5; i++) {
  print(i);  // i๊ฐ€ 0๋ถ€ํ„ฐ 4๊นŒ์ง€ ์ถœ๋ ฅ๋จ
}

โœ” ๋ณดํ†ต์€ i < 5 ๋กœ ์“ฐ์ง€๋งŒ i != 5๋„ ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.


โœ… while โ€“ ๋ฐ˜๋ณต ์กฐ๊ฑด์—์„œ ์‚ฌ์šฉ

while (input != "exit") {
  // ๊ณ„์† ์ž…๋ ฅ ๋ฐ›๊ธฐ
}

โœ… ์‚ผํ•ญ ์—ฐ์‚ฐ์ž โ€“ ์กฐ๊ฑด์‹ ์•ˆ์—์„œ

String result = (score == 100) ? "Perfect!" : "Try again!";

โœ… ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜๋„ ์ž์ฃผ ์‚ฌ์šฉ

if (x != 0 && y == 3) {
  print("์กฐ๊ฑด ์ถฉ์กฑ!");
}

โœ๏ธ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž(Ternary Operator)

โœ… ๊ธฐ๋ณธ ๊ตฌ์กฐ

์กฐ๊ฑด์‹ ? ์ฐธ์ผ ๋•Œ ๊ฐ’ : ๊ฑฐ์ง“์ผ ๋•Œ ๊ฐ’;
int score = 90; //์˜ˆ์‹œ
String result = (score >= 90) ? "ํ•ฉ๊ฒฉ" : "๋ถˆํ•ฉ๊ฒฉ";
print(result); // ์ถœ๋ ฅ: ํ•ฉ๊ฒฉ

โœ” (score >= 90)๊ฐ€ true โ†’ "ํ•ฉ๊ฒฉ"
โœ” score๊ฐ€ 80์ด์—ˆ๋‹ค๋ฉด โ†’ "๋ถˆํ•ฉ๊ฒฉ"์ด ์ถœ๋ ฅ๋œ๋‹ค.


โšก if-else, ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ๋น„๊ต

// ์ผ๋ฐ˜ if-else
if (score >= 90) {
  result = "ํ•ฉ๊ฒฉ";
} else {
  result = "๋ถˆํ•ฉ๊ฒฉ";
}
// ์‚ผํ•ญ ์—ฐ์‚ฐ์ž
result = (score >= 90) ? "ํ•ฉ๊ฒฉ" : "๋ถˆํ•ฉ๊ฒฉ";

โœ” ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ„๋‹จํ•œ ์กฐ๊ฑด ์ฒ˜๋ฆฌ์— ์œ ์šฉํ•˜๋‹ค.


โœ๏ธ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž(Logical Operators)

๐Ÿ“Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์กฐ๊ฑด์„ ๋™์‹œ์— ์ฒดํฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž


โœ… && - AND ์—ฐ์‚ฐ์ž(๋‘˜ ๋‹ค ์ฐธ์ด์–ด์•ผ ํ•จ)

int age = 25;
bool hasID = true;
//
if (age >= 20 && hasID) {
  print("์ž…์žฅ ๊ฐ€๋Šฅ");
}

โœ” age 20 ์ด์ƒ + ID๋„ ์žˆ์œผ๋ฉด โ†’ "์ž…์žฅ ๊ฐ€๋Šฅ"
โœ” ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด โŒ


โœ… || - ๋˜๋Š”

bool isAdmin = false;
bool isOwner = true;
//
if (isAdmin || isOwner) {
  print("์ ‘๊ทผ ํ—ˆ์šฉ");
}

โœ” ๊ด€๋ฆฌ์ž์ด๊ฑฐ๋‚˜ ์†Œ์œ ์ž๋ฉด โ†’ "์ ‘๊ทผ ํ—ˆ์šฉ"
โœ” ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์ฐธ์ด์–ด๋„ โญ•


โœ… ! - NOT ์—ฐ์‚ฐ์ž(๋ฐ˜๋Œ€๊ฐ’์œผ๋กœ ๋ฐ”๊ฟˆ)

bool isLoggedIn = false;
//
if (!isLoggedIn) {
  print("๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค");
}

โœ” !isLoggedIn โ†’ false์˜ ๋ฐ˜๋Œ€ โ†’ true
โœ” ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค ์ถœ๋ ฅ


โšก !
! ๋ถ€์ •์ด ํ—ท๊ฐˆ๋ ค์„œ ์กฐ๊ธˆ ๋” ์˜ˆ์‹œ๋ž‘ ์„ค๋ช…์„ ์‚ดํŽด๋ณด์•˜๋‹ค.

๐Ÿ• ์˜ˆ์‹œ: ๋ฐฐ๊ณ ํ”” isHungry

bool isHungry = true;
//
if (isHungry) {
  print("๋ฐฅ ๋จน์ž!");
}
if (!isHungry) {
  print("๋ฐฐ ์•ˆ ๊ณ ํŒŒ์š”");
}
๋ณ€์ˆ˜๊ฐ’isHungry!isHungry์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
true (๋ฐฐ๊ณ ํ””)truefalse"๋ฐฅ ๋จน์ž!" ์ถœ๋ ฅ
false (์•ˆ ๊ณ ํ””)falsetrue"๋ฐฐ ์•ˆ ๊ณ ํŒŒ์š”" ์ถœ๋ ฅ

โœ” isHungry๋Š” "๋ฐฐ๊ณ ํ”ˆ ์ƒํƒœ์ธ๊ฐ€?"
โœ” !isHungry๋Š” "๋ฐฐ ์•ˆ ๊ณ ํ”ˆ๊ฐ€?"

์—ฌ๊ธฐ๊นŒ์ง€๋Š” ์‰ฝ๊ฒŒ ์ดํ•ด๋ฅผ ํ–ˆ๋Š”๋ฐ...


๐ŸŽฎ ์˜ˆ์‹œ: ๊ฒŒ์ž„ ์‹œ์ž‘ ์—ฌ๋ถ€ isGameStarted

bool isGameStarted = false;
//
if (!isGameStarted) {
  print("๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜์„ธ์š”");
} else {
  print("๊ฒŒ์ž„ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค");
}

โœ” isGameStarted๋Š” false
ย ย  โ†’ !isGameStarted๋Š” true
ย ย  โ†’ ์ถœ๋ ฅ: ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜์„ธ์š”

๐Ÿ’ก isGameStarted = ๊ฒŒ์ž„์‹œ์ž‘์ƒํƒœ
ย ย  !isGameStarted = ๊ฒŒ์ž„์ข…๋ฃŒ์ƒํƒœ
ย ย  ์ด๋Ÿฐ์‹์œผ๋กœ ๋™์‚ฌ๊ฐ€ ์•„๋‹Œ ์ƒํƒœ์— true/false ๊ฐ’์„ ์ค€ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

isLoggedIn ์ด๋ž‘ ์ด ์˜ˆ์‹œ๊ฐ€ ๋ถ€์ •์— ๋ถ€์ •์ด๋ผ์„œ ๋™์‚ฌ์— ๋™์‚ฌ๋กœ ์ƒ๊ฐ์„ ํ•ด์„œ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ์—ˆ๋‹ค.


โœ๏ธ ? / ?. / ?? / ??=

โœ… 1. ์‚ผํ•ญ ์—ฐ์‚ฐ์ž์—์„œ ?
โ†’ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’์„ ์„ ํƒํ•  ๋•Œ ์‚ฌ์šฉ

int score = 85;
String result = (score >= 90) ? "A" : "B";
print(result); // "B"

โœ” ๊ตฌ์กฐ : ์กฐ๊ฑด์‹ ? ์ฐธ์ผ ๋•Œ ๊ฐ’ : ๊ฑฐ์ง“์ผ ๋•Œ ๊ฐ’

โœ” ์—ฌ๊ธฐ์„œ ?๋Š” "์ด ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด?" ์ด๋ž€ ๋œป


โœ… 2. nullable ๋ณ€์ˆ˜ ์„ ์–ธ์—์„œ์˜ ?
โ†’ ์ด ๋ณ€์ˆ˜์— null์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ‘œ์‹œํ•  ๋•Œ

String? name; // name์€ null์ด ๋  ์ˆ˜ ์žˆ์Œ
name = null;     // ๊ฐ€๋Šฅ
name = "ํ™๊ธธ๋™"; // ๊ฐ€๋Šฅ

โœ” String? name โ†’ null ๊ฐ€๋Šฅโญ•
โœ” String name โ†’ null โŒ

โœ” Dart์˜ null safety ๊ธฐ๋Šฅ


โœ… 3. null-aware ์—ฐ์‚ฐ์ž(?., ??, ??= ๋“ฑ)
๐Ÿ“Œ ?. โ†’ null์ด๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ โŒ

String? name = null;
print(name?.length); // null (์—๋Ÿฌ ์•ˆ ๋‚จ!)

โœ” name์ด null์ด ์•„๋‹ˆ๋ฉด .length ์‹คํ–‰
โœ” null์ด๋ฉด, null ๋ฐ˜ํ™˜


๐Ÿ“Œ ?? โ†’ null์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ

String? name = null;
print(name ?? "์ด๋ฆ„ ์—†์Œ"); // "์ด๋ฆ„ ์—†์Œ"

๐Ÿ“Œ ??= โ†’ null์ผ ๋•Œ๋งŒ ๊ฐ’์„ ํ• ๋‹น

String? name;
name ??= "๊ธฐ๋ณธ ์ด๋ฆ„";
print(name); // "๊ธฐ๋ณธ ์ด๋ฆ„"

๐Ÿ“‹ ? ์šฉ๋„๋ณ„ ์ •๋ฆฌํ‘œ

๋ฌธ๋งฅ / ์œ„์น˜์˜ˆ์‹œ์ด๋ฆ„ (์ •์‹ ๋ช…์นญ)์„ค๋ช…
์กฐ๊ฑด๋ฌธ (์กฐ๊ฑด์‹)์กฐ๊ฑด ? ์ฐธ๊ฐ’ : ๊ฑฐ์ง“๊ฐ’์‚ผํ•ญ ์—ฐ์‚ฐ์ž (ternary operator)์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‘ ๊ฐ’ ์ค‘ ํ•˜๋‚˜ ์„ ํƒ
ํƒ€์ž… ๋’ค์— ๋ถ™์ŒString? namenullable ํƒ€์ž…null ๊ฐ’์„ ํ—ˆ์šฉํ•˜๋Š” ๋ณ€์ˆ˜
๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์•ž์— ๋ถ™์Œuser?.namenull-aware ์ ‘๊ทผ ์—ฐ์‚ฐ์žnull์ด๋ฉด ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ
๊ธฐ๋ณธ๊ฐ’ ์ง€์ •a ?? bnull ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž (null coalescing operator)null์ผ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ ๊ฐ’ ์‚ฌ์šฉ
null์ผ ๋•Œ ํ• ๋‹นa ??= 10null ๋ณ‘ํ•ฉ ํ• ๋‹น ์—ฐ์‚ฐ์žnull์ผ ๋•Œ๋งŒ ๊ฐ’์„ ํ• ๋‹น

์ •๋ฆฌํ‘œ์ธ๋ฐ ๊ตฌ์ฒด์ ์ธ ๋ช…์นญ์ด๋‚˜ ์ด๋ฆ„์€ ์•„์ง ์™ธ์šฐ๊ธฐ๋Š” ์–ด๋ ต๊ณ  ์ฒœ์ฒœํžˆ ์ ‘ํ•˜๋ฉด์„œ ์ตํ˜€์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋ฆฌ๊ณ  ?์˜ ์šฉ๋„๊ฐ€ null์—์„œ ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.


โœ๏ธ List, null

โœ… null-safe ์˜ˆ์ œ

List<String?> names = ["์ฒ ์ˆ˜", null, "์˜ํฌ"];
//
for (var name in names) {
  if (name == null) {
    print("์ด๋ฆ„์ด ์—†์Šต๋‹ˆ๋‹ค.");
  } else {
    print("์ด๋ฆ„: $name");
  }
}
for (var name in names) {
  // ์ด๋ฆ„(name)์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ
}

โœ” var name ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , in names ์ฆ‰, names ๋ผ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐ˜๋ณตํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.

for (String name in names) {
  print(name);
}

โœ” var ๋Œ€์‹ ์— ํƒ€์ž…์„ ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


๐Ÿ”ฅ math ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๐Ÿ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ import ์‹œ ์ฃผ์˜์‚ฌํ•ญ

import 'dart:math' as math;
import 'dart:game_engine' as GE; // ์ž„์˜๋กœ ์ƒ๊ฐํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
//
math.min();  //math ์˜ min
GE.min(); // ๊ฒŒ์ž„ ์—”์ง„์˜ min

๐Ÿ’ก ์˜ˆ์‹œ๋กœ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ import ํ•  ๋•Œ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณดํ†ต import ํ•˜๊ณ  ๋’ค์— ์ž„์˜๋กœ ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ, math.min();, math.pow(); ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โŒ ๋‹จ, ๋„ˆ๋ฌด ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ๋ถˆํŽธํ•ด์ง„๋‹ค.


โœ… ๊ธฐ๋ณธ ์ˆ˜ํ•™ ํ•จ์ˆ˜

ํ•จ์ˆ˜์„ค๋ช…์˜ˆ์‹œ
pow(x, y)๊ฑฐ๋“ญ์ œ๊ณฑ (x์˜ y์ œ๊ณฑ)pow(2, 3) โ†’ 8
sqrt(x)์ œ๊ณฑ๊ทผ (๋ฃจํŠธ)sqrt(9) โ†’ 3.0
abs(x)์ ˆ๋Œ“๊ฐ’abs(-5) โ†’ 5
max(a, b)๋” ํฐ ๊ฐ’max(3, 7) โ†’ 7
min(a, b)๋” ์ž‘์€ ๊ฐ’min(3, 7) โ†’ 3
round()๋ฐ˜์˜ฌ๋ฆผ3.6.round() โ†’ 4
floor()๋‚ด๋ฆผ (์ž‘์€ ์ •์ˆ˜)3.9.floor() โ†’ 3
ceil()์˜ฌ๋ฆผ (ํฐ ์ •์ˆ˜)3.1.ceil() โ†’ 4
truncate()์†Œ์ˆ˜์  ์ž˜๋ผ๋‚ด๊ธฐ (0์ชฝ์œผ๋กœ ์ž๋ฆ„)3.9.truncate() โ†’ 3

โœ” ํ”ผํƒ€๊ณ ๋ผ์Šค ์ •๋ฆฌ โˆš(aยฒ + bยฒ) โ†’ sqrt(pow(a, 2) + pow(b, 2))


โœ… ์‚ผ๊ฐ ํ•จ์ˆ˜

ํ•จ์ˆ˜์„ค๋ช…์˜ˆ์‹œ (๋ผ๋””์•ˆ ์‚ฌ์šฉ)
sin(x)์‚ฌ์ธsin(pi / 2) โ†’ 1.0
cos(x)์ฝ”์‚ฌ์ธcos(0) โ†’ 1.0
tan(x)ํƒ„์  ํŠธtan(pi / 4) โ†’ ์•ฝ 1.0
asin(x)์•„ํฌ ์‚ฌ์ธ (์—ญ์‚ฌ์ธ)asin(1) โ†’ pi / 2
acos(x)์•„ํฌ ์ฝ”์‚ฌ์ธacos(0) โ†’ pi / 2
atan(x)์•„ํฌ ํƒ„์  ํŠธatan(1) โ†’ pi / 4

โœ… ๋žœ๋ค ๊ด€๋ จ

import 'dart:math';
final random = Random();
์ฝ”๋“œ์„ค๋ช…
random.nextInt(n)0 ์ด์ƒ n ๋ฏธ๋งŒ์˜ ์ •์ˆ˜ ๋ฐ˜ํ™˜
random.nextDouble()0.0 ์ด์ƒ 1.0 ๋ฏธ๋งŒ์˜ ์‹ค์ˆ˜
random.nextBool()true ๋˜๋Š” false ์ค‘ ๋žœ๋ค ๋ฐ˜ํ™˜

โœ… ์ƒ์ˆ˜ ๊ฐ’

์ƒ์ˆ˜์„ค๋ช…์˜ˆ์‹œ
pi์›์ฃผ์œจ (3.14159...)pi * r * r
e์ž์—ฐ๋กœ๊ทธ ๋ฐ‘์ˆ˜ (2.718...)์ง€์ˆ˜ ํ•จ์ˆ˜ ๊ณ„์‚ฐ์— ์‚ฌ์šฉ

โœ” ์› ๋„“์ด ๊ณต์‹ ฯ€rยฒ โ†’ pi * pow(r, 2)


โœ๏ธ ์˜ˆ์‹œ ์ฝ”๋“œ

import 'dart:math';
//
void main() {
  print(pow(2, 5));         // 32
  print(sqrt(16));          // 4.0
  print(sin(pi / 2));       // 1.0
  print(max(3, 9));         // 9
  print(random.nextInt(10)); // 0~9 ์ค‘ ๋žœ๋ค ์ˆซ์ž
}

๋Œ€์ถฉ ์ด๋Ÿฐ ์‹์ธ๋ฐ ๊ตณ์ด ์™ธ์šฐ๊ฑฐ๋‚˜ ํ•  ํ•„์š”๋Š” ์—†์–ด๋ณด์ด๊ณ , ๊ธฐ๋ณธ ์ˆ˜ํ•™ ํ•จ์ˆ˜์ •๋„๋งŒ ๋งŽ์ด ์“ฐ์ด์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. ํ˜น์€ ๊ฐœ๋ฐœํ•˜๋Š” ๋ถ„์•ผ์— ๋”ฐ๋ผ ๋‚˜๋‰  ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ”ฅ void

โœ๏ธ void์™€ Future

๐ŸŽฏ Dart์˜ main()์€ ๋ฐ˜๋“œ์‹œ void ๋˜๋Š” Future<void>์—ฌ์•ผ ํ•œ๋‹ค.

ํƒ€์ž…์˜๋ฏธ
void์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธ(return;์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ return ๊ฐ’;์€ ๋ถˆ๊ฐ€๋Šฅ)
Future<T>๋น„๋™๊ธฐ์ ์œผ๋กœ T ํƒ€์ž… ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธ (์˜ˆ: Future<String>)
Future<void>๋น„๋™๊ธฐ ํ•จ์ˆ˜์ง€๋งŒ ๋ฐ˜ํ™˜๊ฐ’์€ ์—†์Œ์„ ์˜๋ฏธ(await๋Š” ๊ฐ€๋Šฅ, return ๊ฐ’;์€ ์•ˆ๋จ)

โœ… void main()

๐Ÿ“Œ ํ˜•์‹

void main() {
  // ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
}

๐Ÿ“Œ ํŠน์ง•
โœ” main() ํ•จ์ˆ˜๊ฐ€ ์ฆ‰์‹œ ์‹คํ–‰๋œ๋‹ค.
โœ” await ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
โœ” ๋ณดํ†ต ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์— ์‚ฌ์šฉํ•œ๋‹ค.


โœ… Future<void> main()

๐Ÿ“Œ ํ˜•์‹

Future<void> main() async {
  await //๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
}

๐Ÿ“Œ ํŠน์ง•
โœ” await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๋‹ค.
โœ” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด์ง€๋งŒ ๋ฐ˜ํ™˜๊ฐ’์€ void์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋Š” ์—†๋‹ค.
โœ” ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ํŒŒ์ผ ์ฝ๊ธฐ, ํƒ€์ด๋จธ ๋“ฑ ๋น„๋™๊ธฐ ์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.


โšก async์™€ await

โœ… ์–ธ์ œ async์™€ await๋ฅผ ๊ผญ ๊ฐ™์ด ์จ์•ผ ํ•˜๋Š”๊ฐ€?

๐Ÿ’ก await๋ฅผ ์“ฐ๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ•จ์ˆ˜์— async๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

void main() async {
  await Future.delayed(Duration(seconds: 1));
  print('1์ดˆ ํ›„ ์ถœ๋ ฅ');
}

โœ” ์—ฌ๊ธฐ์„œ await๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ main()์€ async๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


โ— ๋ฐ˜๋Œ€๋กœ async๋งŒ ์“ฐ๊ณ  await๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ

Future<void> fetchData() async {
  // await ์—†์ด๋„ async ํ•จ์ˆ˜๋Š” ์œ ํšจํ•จ
  print('๋ฐ์ดํ„ฐ ์š”์ฒญ');
}

โŒ ๋‹ค๋งŒ ์ด๋Ÿฌ๋ฉด Future<void>๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋  ๋ฟ, ๋น„๋™๊ธฐ ์ž‘์—…์€ ์•ˆํ•˜๋Š” ์…ˆ์ด๋‹ค.


โš ๏ธ ์ฃผ์˜: async ์—†์ด๋„ Future๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Future<void> doSomething() {
  return Future.delayed(Duration(seconds: 1), () {
    print('์ž‘์—… ์™„๋ฃŒ');
  });
}

โœ” async์™€ await ์—†์ด๋„ ์ •์ƒ์ ์œผ๋กœ ๋น„๋™๊ธฐ ์ž‘๋™ํ•œ๋‹ค.
โœ” ์ฝœ๋ฐฑ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ผญ async/await๊ฐ€ ํ•„์š”ํ•œ ๊ฑด ์•„๋‹ˆ๋‹ค.

โœ๏ธ ์ •๋ฆฌ

ํ‚ค์›Œ๋“œ์—ญํ• 
asyncํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ์ •์˜
await๋น„๋™๊ธฐ ํ•จ์ˆ˜๋‚˜ Future์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆผ

์ƒํ™ฉํ•„์š” ์—ฌ๋ถ€
await ์‚ฌ์šฉโœ… ํ•จ์ˆ˜์— async ํ•„์š”
ํ•จ์ˆ˜์— async๋งŒ ์žˆ๊ณ  await ์—†์Œโœ… ๊ฐ€๋Šฅ (์—๋Ÿฌ ์•„๋‹˜)
async/await ์—†์ด Future ์‚ฌ์šฉโœ… ๊ฐ€๋Šฅ (์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ)
await ์—†์ด async๋งŒ ์‚ฌ์šฉโš ๏ธ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ ์ž‘๋™ ์•ˆํ•จ

โœ๏ธ void์™€ return

๐Ÿ” ์˜ˆ์‹œ

โœ… ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ

void main() {
  print('์‹œ์ž‘');
  return; // ๋ฌธ์ œ ์—†์Œ
}

ย 
โŒ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

void main() {
  return 1; // โŒ ์˜ค๋ฅ˜: void ํ•จ์ˆ˜์—์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์Œ
}

โœ” void main() ์•ˆ์—์„œ๋Š” return;๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค. return ๊ฐ’;์€ ์˜ค๋ฅ˜๋‚œ๋‹ค.


โšก ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

โœ… ํ•ด๊ฒฐ์ฑ… 1: exitCode๋ฅผ ์‚ฌ์šฉ(ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์‹œ ์ฝ”๋“œ ์ „๋‹ฌ)
dart:io ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ exitCode๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

import 'dart:io';
//
void main() {
  if (someErrorOccurred()) {
    exitCode = 1; // ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋ƒ„
  } else {
    exitCode = 0; // ์ •์ƒ ์ข…๋ฃŒ
  }
}

โœ” ์‰˜์ด๋‚˜ CI ํˆด์€ ์ด exitCode๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
โœ” ์ผ์ข…์˜ "๋ฐ˜ํ™˜๊ฐ’"์ฒ˜๋Ÿผ ํ™œ์šฉ๋œ๋‹ค.


โœ… ํ•ด๊ฒฐ์ฑ… 2: return ๋Œ€์‹  ์ถœ๋ ฅ (print())๋‚˜ ๋กœ๊ทธ๋กœ ์ „๋‹ฌ
๋งŒ์•ฝ ์‚ฌ์šฉ์ž๋‚˜ ์‹œ์Šคํ…œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, print()๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.

void main() {
  var result = computeSomething();
  print(result); // ์‚ฌ์šฉ์ž๋‚˜ ์™ธ๋ถ€์—์„œ ์ด ์ถœ๋ ฅ์„ ํ™œ์šฉ ๊ฐ€๋Šฅ
}

โœ… ํ•ด๊ฒฐ์ฑ… 3: ์‹ค์ œ ๋กœ์ง์€ ํ•จ์ˆ˜์— ๋„ฃ๊ณ  main()์€ ํ˜ธ์ถœ๋งŒ
main()์€ ์—ฌ์ „ํžˆ void์ง€๋งŒ, ๋กœ์ง์€ ๋ฐ˜ํ™˜๊ฐ’ ์žˆ๋Š” ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

int calculateSomething() {
  return 42;
}
//
void main() {
  int result = calculateSomething();
  print('Result is $result');
}

๋ชฉ์ ๋ฐฉ๋ฒ•์˜ˆ์‹œ
ํ”„๋กœ๊ทธ๋žจ ์ƒํƒœ ๋ฐ˜ํ™˜exitCode ์‚ฌ์šฉexitCode = 1;
๊ณ„์‚ฐ ๊ฒฐ๊ณผ ๋ณด์—ฌ์ฃผ๊ธฐprint() ๋˜๋Š” ๋กœ๊ทธ ์‚ฌ์šฉprint(result);
์ฝ”๋“œ ๋‚ด๋ถ€ ๋ฐ˜ํ™˜ ์ฒ˜๋ฆฌ๋ฐ˜ํ™˜๊ฐ’ ์žˆ๋Š” ํ•จ์ˆ˜ ๋”ฐ๋กœ ์ •์˜int compute() => 42;
main()์—์„œ ์ง์ ‘ ๋ฐ˜ํ™˜ โŒDart ์–ธ์–ด์ƒ ๋ถˆ๊ฐ€๋Šฅ

๐ŸŒฑ ์˜ค๋Š˜์€ ์ƒˆ๋กœ์šด ๊ฐ•์˜๋„ ๋“ค์–ด๋ณด๊ณ , ๊ถ๊ธˆํ•œ ๊ฒƒ์— ๋Œ€ํ•ด์„œ ๊ฐœ์ธ ํ•™์Šตํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค.
๋•๋ถ„์— ๊ถ๊ธˆํ•œ ์ ์ด๋‚˜, ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„์ด ์ผ๋ถ€ ํ•ด์†Œ๋œ ๋А๋‚Œ์ด๋‹ค.

์ฝ”๋”ฉ ๊ณต๋ถ€๊ฐ€ ๋์ด ์—†๋‹ค๊ณ  ๋А๊ปด์ง€๋Š” ๊ฒƒ์€ ํ•œ๊ฐ€์ง€ ์ฝ”๋“œ๋‚˜ ๋ฌธ๋ฒ•์„ ์•Œ๋ฉด, ์ด๋Ÿฐ ๋ฐฉ์‹์€ ๋˜๋Š”์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€๊ฐ€ ๊ถ๊ธˆํ•˜๊ณ , ๊ถ๊ธˆ์ฆ์„ ํ•ด์†Œํ•˜๊ณ  ๋‚˜๋ฉด ๊ทธ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์˜๋ฌธ์ ์ด ์ƒ๊ธฐ๊ณ ...

๊ถ๊ธˆ์ฆ์ด ์ƒ๊ธฐ๋ฉด ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ณ  ์‹ถ๊ณ , ์˜๋ฌธ์„ ํ•ด์†Œํ•˜๊ณ  ์‹ถ์–ด์„œ ์ด๊ฒƒ์ €๊ฒƒ ๋งŽ์ด ํ•™์Šตํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๋‹ค๋งŒ, ๋„ˆ๋ฌด ์ฐพ์•„๋ณธ ๊ฒƒ์ด ๋งŽ์•„์„œ ํ—ท๊ฐˆ๋ฆฌ๊ฑฐ๋‚˜ ๊ธฐ์–ต ์†์—์„œ ์žŠํ˜€์ง€๋ฉด ์–ด์ฉŒ๋‚˜ ์‹ถ์ง€๋งŒ, TIL์„ ์ž‘์„ฑํ•˜๋ฉฐ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋” ๋ณต์Šตํ•˜๋Š” ๋А๋‚Œ์ด๋‹ค.

๊ทธ๋ž˜๋„ ์ดํ•ดํ•˜๋ฉด์„œ ํ•™์Šตํ•˜๋ฉด ๋‹ค์Œ์— ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ดค์„ ๋•Œ ์ „์— ๋ดค๋˜ ๊ฒƒ์ธ๊ฒŒ ์ƒ๊ฐ๋‚˜๊ณ , ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋ฉด ๊ทธ ๊ธฐ๋Šฅ๋„ ์–ผ์ถ” ๋– ์˜ฌ๋ผ์„œ ๋ฟŒ๋“ฏํ•˜๊ณ  ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.


๋‚ด์ผ์€ ๋˜ ์–ด๋–ค ๊ณต๋ถ€๋ฅผ ํ• ์ง€ ๊ณ ๋ฏผ๋˜๋Š”๋ฐ, 2์‹œ์— Flutter ๋กœ๋“œ๋งต ์„ธ์…˜ ํŠน๊ฐ•์ด ํ•˜๋‚˜๊ฐ€ ์žˆ์–ด์„œ ๋๋‚˜๊ณ  ๋‚˜๋ฉด ๊ทธ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.

๐Ÿ‘€ ํ˜น์€ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ์ฐพ์•„๋ณด๋ฉด์„œ ๋˜๋‹ค๋ฅธ ํ•™์Šต์„ ํ•˜์ง€ ์•Š์„๊นŒ..!

profile
๐Ÿ’ป [25.05.26~] Flutter ๊ณต๋ถ€์ค‘โณ

0๊ฐœ์˜ ๋Œ“๊ธ€