[Flutter] 1.Dart ๋ฌธ๋ฒ•

Beanxxยท2024๋…„ 7์›” 11์ผ
0

Flutter

๋ชฉ๋ก ๋ณด๊ธฐ
1/5
post-thumbnail

โœ…ย ๋ณ€์ˆ˜(variable): var

var๋Š” ์žฌ์„ ์–ธ ๋ถˆ๊ฐ€ โŒ

var name = 'flutter';
var name = 'new_flutter'; // error -> ์žฌ์„ ์–ธ ๋ถˆ๊ฐ€

โœ… ์ •์ˆ˜(integer): int

int num1 = 10;
int num2 = 15;
print(num1+num2); // 25

โœ… ์‹ค์ˆ˜: double

์†Œ์ˆ˜์  ํ‘œํ˜„ ๊ฐ€๋Šฅ

double num1 = 2.5;
double num2 = 0.5;
print(num1 + num2); // 3

โœ… Boolean: bool

bool isTrue = true;
bool isFalse = false;

โœ…ย ๋ฌธ์ž์—ด(string): String

String str1 = 'flutter';
String str2 = 'dart';

print(`${str1} ${str2}`); // 'flutter dart'
print('$str1 $str2'); // 'flutter dart' <- {} ์ค‘๊ด„ํ˜ธ ์ƒ๋žต ๊ฐ€๋Šฅ

โœ‹ย var์™€ String์˜ ์ฐจ์ด๋Š”?

๐Ÿ“ขย var type์€ ๋”ฐ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ž๋™์œผ๋กœ ํƒ€์ž…์„ ์ถ”๋ก ํ•œ๋‹ค

var num = 20; // int type
var str = 'Hi'; // String type

โœ…ย Return type

var name = 'Tom';
print(name.runtimeType); // String

โœ…ย dynamic

๋ชจ๋“  ํƒ€์ž…์œผ๋กœ ์„ ์–ธ ๊ฐ€๋Šฅ !

๐Ÿ‘€ย dynamic: ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ์žฌ์„ ์–ธ โญ•๏ธย  / var: ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ์žฌ์„ ์–ธ โŒ

dynamic name = 'flutter';
dynamic num = 1;

name = 5; // String -> int type์œผ๋กœ ์žฌ์„ ์–ธ ๊ฐ€๋Šฅ
// dynamic์€ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ์žฌ์„ ์–ธ ๊ฐ€๋Šฅ

// But, var๋Š” ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ์žฌ์„ ์–ธ ๋ถˆ๊ฐ€
var name2 = 'flutter';
name2 = 6; // error -> ์ฒ˜์Œ ์„ ์–ธํ•œ ํƒ€์ž…์œผ๋กœ ๊ณ ์ •๋˜์–ด ์ฒ˜์Œ ์„ ์–ธํ•œ ํƒ€์ž…์œผ๋กœ๋งŒ ์žฌ์„ ์–ธ ๊ฐ€๋Šฅ

โœ…ย null

์•„๋ฌด๋Ÿฐ ๊ฐ’๋„ ์žˆ์ง€ ์•Š์Œ

  • nullable: null ๊ฐ€๋Šฅ
  • non-nullable: null ๋ถˆ๊ฐ€๋Šฅ
String name = 'flutter';
name = null; // error

  • type ๋’ค์— ? ๋ฅผ ๋ถ™์ด๋ฉด null ์„ ์–ธ ๊ฐ€๋Šฅ
String? name2 = 'dart;
name2 = null;
print(name2!); // nullableํ•œ ๊ฐ’ ๋’ค์— `!`๋ฅผ ๋ถˆ์ด๋ฉด ํ•ด๋‹น ๊ฐ’์€ null์ด ์•„๋‹˜์„ ๋ช…์‹œํ•ด์ฃผ๋Š” ๊ฒƒ

โœ…ย final

๋ณ€์ˆ˜ ์„ ์–ธ์‹œ ํ•ด๋‹น ๋ณ€์ˆ˜ ํƒ€์ž… ์•ž์— ์ž‘์„ฑ

final String name1 = 'flutter';
name1 = 'dart'; // error -> finial ์„ ์–ธ์‹œ ํ•œ๋ฒˆ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ํ›„ ๊ฐ’ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

const String name2 = 'dart';
name2 = 'flutter'; // error -> final๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ const ์„ ์–ธ์‹œ์—๋„ ๊ฐ’ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

// final, const ์„ ์–ธ์‹œ var ํ‚ค์›Œ๋“œ ์ƒ๋žต ๊ฐ€๋Šฅ
final name1 = 'flutter';
const name2 = 'dart';

โœ‹ย final vs const ์ฐจ์ด์ 

  • final: ๋นŒ๋“œํƒ€์ž„์— ๊ฐ’์„ ์•Œ๊ณ  ์žˆ์ง€ ์•Š์•„๋„ ok
  • const: ๋นŒ๋“œํƒ€์ž„์— ๊ฐ’์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•จ
DateTime now = DateTime.now(); // ํ˜„์žฌ ์‹œ๊ฐ„ ์ถœ๋ ฅ (ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ์˜ ์‹œ๊ฐ„ ์ถœ๋ ฅ)
print(now); // 2024-04-21 16:55:36.946

final DateTime now = DateTime.now();
const DateTime now = DateTime.now(); // error
// why error? DateTime.now()๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ์˜ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ ๋นŒ๋“œํƒ€์ž„์— ๊ฐ’์„ ์•Œ๊ณ  ์žˆ์ง€ ๋ชปํ•ด์„œ error

โœ…ย operator: ์—ฐ์‚ฐ์ž

+,-,*,/,% ์—ฐ์‚ฐ์„ ํ•ด๋„ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค

int num = 2;

// %: ๋‚˜๋จธ์ง€
print(num % 2); // 0
print(num); // 2 -> num ๊ฐ’ ๋ณ€๊ฒฝ X

// ์žฌ์ €์žฅ
num ++; // num = num + 1; ๊ณผ ๋™์ผํ•œ ์˜๋ฏธ๋กœ ๊ฐ’์„ ์žฌํ• ๋‹นํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ
print(num); // 3 -> num ๊ฐ’ ๋ณ€๊ฒฝ๋จ

num --;
print(num); // 2 -> num ๊ฐ’ ๋ณ€๊ฒฝ๋จ

num += 5;
print(num); // 7 <- 2+5

  • ??= : ์ขŒํ•ญ๊ฐ’์ด null์ด๋ฉด ์šฐํ•ญ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”๋ผ
double? num = 4.0; // null๊ฐ’ ํ• ๋‹น ํ—ˆ์šฉ
num = 2.0;
print(num); // 2

num = null;
num ??= 3.0; // num ๊ฐ’์ด null์ด๋ฉด ์šฐํ•ญ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”๋ผ
print(num); // 3

num = 2.0;
num ??= 3.0;
print(num); // 2 -> num ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ธฐ์กด ๊ฐ’ ์œ ์ง€
int num1 = 1;
int num2 = 2;

print(num1 >= num2); // false (1 >= 2)
print(num1 == num2); // false (1 == 2)
print(num1 != num2); // true (1 != 2)

โœ…ย type ๋น„๊ต

  • value is type : value์˜ ํƒ€์ž…์ด type๊ณผ ๋™์ผํ•œ์ง€ ํƒ€์ž… ๋น„๊ต (๋™์ผํ•˜๋ฉด true)
  • value is! type: value์˜ ํƒ€์ž…์ด type๊ณผ ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฉด true
int num1 = 1;

print(num1 is int); // true
print(num1 is String); // false
print(num1 is! int); // false

โœ…ย ๋…ผ๋ฆฌ operator

  • && : and ์กฐ๊ฑด (๋ชจ๋‘ true์—ฌ์•ผ true)
    bool result1 = 12 > 10 && 1 > 0;
    print(result1); // true && true => true
  • || : or ์กฐ๊ฑด (ํ•˜๋‚˜๋ผ๋„ true์—ฌ์•ผ true)
    	bool result2 = 12 > 0 || 0 > 1;
    print(result2); // true || false => true

โœ…ย List: ๋ฐฐ์—ด

List<String> langs = ['js', 'java', 'node'];
List<int> numbers = [1, 2, 3, 4];

print(langs[0]); // 'js'
print(langs[3]); // error -> List ์ „์ฒด ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” index ๊ฐ’์€ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Œ
print(langs.length); // 3 -> ๊ธธ์ด ์ถœ๋ ฅ

// ๊ฐ’ ์ถ”๊ฐ€
langs.add('python');
print(langs); // [js, java, node, python]

// ๊ฐ’ ์‚ญ์ œ
langs.remove('python');
print(langs); // [js, java, node]

// ๋ฐฐ์—ด ๋‚ด ํŠน์ • ์›์†Œ ๊ฐ’ index ์ฐพ๊ธฐ
print(langs.indexOf('java')); // 1

โœ…ย Map: ๊ฐ์ฒด

Key: value

Map<String, bool> isFruit = {
	'Banana': true,
	'Apple': true,
	'Peach': true,
};

print(isFruit); // { Banana: true, Apple: true, Peach: true }

// ๊ฐ’ ์ถ”๊ฐ€
isFruit.addAll({ 'Spider': false });
isFrunt['Ant'] = false;

print(isFruit); // { Banana: true, Apple: true, Peach: true, Spider: false, Ant: false }
print(isFruit['Banana']); // true

// ๊ฐ’ ๋ณ€๊ฒฝ (Map์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” Key์ธ ๊ฒฝ์šฐ)
isFruit['Ant'] = true;
print(isFruit); // { Banana: true, Apple: true, Peach: true, Spider: false, Ant: true }

// ๊ฐ’ ์‚ญ์ œ
isFruit.remove('Ant');
print(isFruit); // { Banana: true, Apple: true, Peach: true, Spider: false }

// key ๊ฐ’๋งŒ ์ถœ๋ ฅ
print(isFruit.keys); // (Banana, Apple, Peach, Spider)

// value ๊ฐ’๋งŒ ์ถœ๋ ฅ
print(isFruit.values); // (true, true, true, false)

โœ…ย Set: ๊ฐ์ฒด

final Set<string> names = {
	'flutter',
	'dart',
	'js',
	'flutter',
}

print(names); // { flutter, dart, js } <- ์ค‘๋ณต ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ํ•œ๋ฒˆ๋งŒ ์ถœ๋ ฅ

names.add('java'); // ๊ฐ’ ์ถ”๊ฐ€
names.remove('java'); // ๊ฐ’ ์‚ญ์ œ
print(names.contains('flutter')); // true

๐Ÿ‘€ย contains('str'): str ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€์˜ ์—ฌ๋ถ€ ํŒ๋‹จ

โœ‹ย List vs Set ์ฐจ์ด์ 

  • List: ์ค‘๋ณต๊ฐ’ ์กด์žฌ ๊ฐ€๋Šฅ โญ•๏ธ
  • Set: ์ค‘๋ณต๊ฐ’ ์กด์žฌ ๋ถˆ๊ฐ€๋Šฅ โŒ โ†’ ์ค‘๋ณต์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค๋Š” ์žฅ์ 

โœ…ย ์กฐ๊ฑด๋ฌธ

โ€ฃ if๋ฌธ

if (์กฐ๊ฑด๋ฌธ) {
	// if ์‹คํ–‰๋ฌธ1;
} else if () {
	// else if ์‹คํ–‰๋ฌธ2;
} else {
	// else ์‹คํ–‰๋ฌธ3;
}

โ€ฃ switch๋ฌธ

switch(์กฐ๊ฑด๋ฌธ) {
	case 0:
		// case0 ์‹คํ–‰๋ฌธ1;
		break;
	case 1:
		// case1 ์‹คํ–‰๋ฌธ2;
	default:
		// default ์‹คํ–‰๋ฌธ3;
		break;
}

โ€ฃ for ๋ฐ˜๋ณต๋ฌธ

for (int i = 0; i < 10; i++) {
	if (i == 5) {
		continue; // ํ•ด๋‹น ๋ฃจํ”„ ๋น ์ ธ ๋‚˜์™€์„œ ๋‹ค์Œ i ๋ฃจํ”„ ์‹คํ–‰
	}
	
	print(i); // 5๋งŒ ์ถœ๋ ฅ X
}
List<int> numbers = [1, 2, 3, 4, 5, 6];

// js์™€ ๋‹ฌ๋ฆฌ for_of๋ฌธ์€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ๋ฐฐ์—ด ์ˆœํšŒ์‹œ for_in๋ฌธ ์‚ฌ์šฉ
for (int num in numbers) {
	print(num);
}

โ€ฃ while ๋ฐ˜๋ณต๋ฌธ

  • while: ์กฐ๊ฑด์„ ๋จผ์ € ํ™•์ธํ•œ ๋‹ค์Œ์— ์‹คํ–‰๋ฌธ ์‹คํ–‰
int total = 0;

// total < 10 ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ์ˆœํšŒ
while (total < 10) {
	total += 1;
	
	if (total == 5) {
		break; // loop ํƒˆ์ถœ
	}
}

  • do-while: ๋จผ์ € ์‹คํ–‰๋ฌธ ์‹คํ–‰ํ•œ ๋‹ค์Œ์— ์กฐ๊ฑด๋ฌธ ํ™•์ธ (์ž˜ ์‚ฌ์šฉ X)
do {
	total += 1;
} while (total < 10);

print(total); // 10

โœ…ย enum

๋ช…ํ™•ํ•œ ํƒ€์ž…์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ํƒ€์ž…๋“ค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Œ

enum Status {
	approved, // ์Šน์ธ
	pending, // ๋Œ€๊ธฐ
	rejected, // ๊ฑฐ์ ˆ
}

Status status = Status.approved;

if (status == Status.approved) {
	print('์Šน์ธ');
} else if (status == Status.pending) {
	print('๋Œ€๊ธฐ');
} else {
	print('๊ฑฐ์ ˆ');
}

โœ…ย ํ•จ์ˆ˜ ์„ ์—…๋ฒ•

  • parameter = argument = ๋งค๊ฐœ๋ณ€์ˆ˜
  • positional parameter: ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ
  • optional parameter([]): ํ•„์ˆ˜๊ฐ€ ์•„๋‹Œ ํŒŒ๋ผ๋ฏธํ„ฐ (๊ธฐ๋ณธ๊ฐ’ ์„ค์ •ํ•ด์ฃผ๋ฉด error๋‚˜์ง€ ์•Š์Œ)
// int type return
// optional parameter: y, z
int addNumbers(int x, [int y = 20, int z = 30]) { // ํ˜ธ์ถœ์‹œ y, z ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋จ
	int sum = x + y + z;
	
	if (sum % 2 == 0) { print('์ง์ˆ˜') } 
	else { print('ํ™€์ˆ˜') }
	
	return sum;
}

  • named parameter: ์ด๋ฆ„์ด ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ {} ์ค‘๊ด„ํ˜ธ ๋‚ด์— ์ž‘์„ฑ (์ˆœ์„œ ์ค‘์š” โŒ)
  • required ์†์„ฑ์„ default๋กœ ๋ถ™์ด์ง„ ์•Š์Œ
addNamedNumbers({required int x, required int y, int z = 30}) {
	int sum = x + y + z;
	
	if (sum % 2 == 0) { print('์ง์ˆ˜') } 
	else { print('ํ™€์ˆ˜') }
}
// position parameter & named parameter mixํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
int addMixNumbers(int x, { rquired int y, int z = 30 }) {
	...
}
// void: return์ด ์—†์Œ์„ ์˜๋ฏธ
void main() {
	int result = addNumbers(10, 20, 30);
	int result2 = addNumbers(20);
	
	addNamedNumbers(x: 10, y: 20, z: 30);
	addnamedNumbers(y: 10, z: 20, x: 30); 
	// named parameter๋ฅผ ๋ฐ›์œผ๋ฏ€๋กœ ์ˆœ์„œ ๋ฐ”๊ปด๋„ ์ƒ๊ด€์—†์ด name ์ง€์ •ํ•œ๋Œ€๋กœ ๊ฐ’ ํ• ๋‹น๋จ
	
	addMixNumbers(10, y: 20);
}

โœ…ย typedef

// [์„ ์–ธ]

// sinature
typedef Operation = int Function(int x, int y, int z);

// ๋”ํ•˜๊ธฐ
int add(int x, int y, int z) => x + y + z;

// ๋นผ๊ธฐ
int substract(int x, int y, int z) => x - y - z;

// ๊ณ„์‚ฐ
int calculate(int x, int y, int z, Operation operation) {
	return operation(x, y, z);
}
// [ํ˜ธ์ถœ]

Operation operation = add;
int result = operation(10, 20, 30);
print(result); // 60

operation = substract;
int result2 = operation(10, 20, 30);
print(result2); // -40

int result3 = calculate(30, 40, 50, add);
print(result3); // 120

int result4 = calculate(40, 50, 60, subtract);
print(result4); // -70

โœ…ย arrow function: ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

int arrowFun(int x, {required int y, int z = 30}) => x + y + z;
profile
FE developer

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