프로그래밍/Flutter

Flutter 기본기 Dart 언어 기본 익히기

우징어🦑 2024. 11. 7. 17:34

출처

 

[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출! 강의 | 코드

코드팩토리 | iOS 앱과 Android 앱을 코드 한번만 작성해서 모두 제작한다! 코드팩토리의 Flutter 초보 탈출 강의! 디테일한 이론과 흥미로운 프로젝트를 진행하며 탄탄한 기본기 쌓기!, 10개의 프로젝

www.inflearn.com

 

인프런에서 모바일 앱 개발 Flutter 강의를 듣기 시작했다.

 

강의를 들으면서 새롭게 알게 된 내용 위주로 간단히 정리하고자 한다.

 

 

안쓰면 까먹는걸 알기에.. 내 뇌를 위해 쓰는 글

 

 

변수

dynamic

void main() {
  // dynamic 선언 변수는 여러 타입으로 변수 할당 가능
  dynamic name = '홍길동';
  var name2= '김사또';
  
  name = 1; // 정상
  name2 = 2; // 오류 
}

 

?와 ! (nullable, non-nullable)

void main() {
	String name = '홍길동'; // non-nullable
    String? name2 = 'ㅇㅇ'; // nullable
    
    name = null; // 오류
    name2 = null; // 정상
    
    print(name2!); // nullable 변수에 !를 붙이면 현재 이 값은 null이 아니라는 뜻
}

 

Final과 Const

 

공통점

void main() {
	final String name = '홍길동'; // final로 선언한 변수는 값 변경 불가
    
    name = '이몽룡'; // 오류
    
    const String name2 = '김사또'; // const 또한 값 변경 불가
    
    name2 = '춘향이'; // 오류
    
    // final, const 는 var 선업 타입 생략 가능
    final name = '홍길동';
    const name2 = '김사또';
    
}

 

차이점

void main() {
	DateTime now = DateTime.now();
    DateTime now2 = DateTime.now();
    // DateTime.now(): 실행 버튼을 누르는 순간이 아닌, 이 코드가 실행되는 순간의 날짜와 시각.
    // 즉, 위 코드를 동시에 실행해도 now, now2 의 값은 다름.
    
    final DateTime now = DateTime.now(); // 정상
    const DateTime now2 = DateTime.now(); // 오류
    
}

 

final : Build time 값 몰라도 됨.

const : Build time 의 값을 알고 있어야 함

 

 

Build란 ?

  • 프로그래밍 언어를 Build를 해서 컴퓨터가 이해할 수 있는 0,1 의 형태로 코드를 변환하는 것

Build time이란?

  • Build가 되는 시점

 

Datetime.now()는 코드의 실행 순간을 알려주는 함수인데, build 시점에는 해당 함수의 실행 시점을 알지 못함.

  • 빌드 다음에 실행이므로
  • 따라서 const 로 선언한 DateTime 타입 변수의 now() 함수 실행 시 오류 발생

 

Operator

 

void main() {
	double number = 4.0;
    
    number = 2.0;
    print(number);
    
    number = null;
    print(number); // null
    
    number ??= 3.0; // ??: number가 null이면 3.0 으로 바꾸고, null이 아니면 바꾸지 않는다.
    print(number); // 3
    
    double number2 = 1.0;
    
    number2 ?? = 3.0;
    print(number2); // 1. number2가 null이 아니므로 3.0으로 바꾸지 않고 1.0 출력
}

?? 는 처음 봤다. 삼항연산자랑 유사한 느낌..

 

void main() {
	int number1 = 1;
    print(number1 is int); // true
    print(number1 is String); // false
    
    print(number1 is! int); // false
    print(number1 is! String); // true
}
void main() {
	bool result = 12 > 10; // true
    
    bool result1 = 12 > 10 && 1 > 0;  // true && true -> true
    bool result2 = 12 > 10 && 1 < 0;  // true && false -> false
    
    bool result3 = 12 > 10 || 1 > 0; // ture || true -> true
    bool result4 = 12 > 10 && 1 < 0;  // true && false -> true
    bool result5 = 12 < 10 && 1 < 0;  // false && false -> false
}

 

 

List

void main() {
	List<String> fruits = ['Apple', 'Orange', 'Banana'];
    List<int> numbers = [1,2,3,4,5];
    
    print(fruits.length);
    
    fruits.add('Coconut');
    
    fruits.remove('Coconut');
    
    fruits.indexOf('Banana');
}

 

Map

void main() {
	// Map : Key, Value
    
    Map<String, String> dict = {
    	'Harry Potter': '해리포터',
        'Ron Weasley': '론 위즐리',
        'Hermione Granger': '헤르미온느 그레인저',
    };
    
    dict.addAll({
    	'Ironman': '아이언맨',
    });
    
    dict['Ironman'] = '로다주'; 
	
    dict.remove('Ironman');
    
    print(dict.keys);
    print(dict.values);
}

 

Set

중복 제거된 List

 

contains() 함수 : 값 존재 여부를 true / false 로 반환

 

 

 

함수

void main() {
	addFunc(1,2,3); // 6
    
    addFunc(10); // 12
}

// parameter를 [] 로 묶어주면 있어도 되고 없어도 되는 optional parameter 처리
// y, z 에 null이 들어갈 수 있어야 하므로 파라미터 선언 부분에 int -> int? 처리
// 그렇다 하더라도 x + y + z 에서 null 을 더할 수 없으므로 오류 발생
// 따라서 y=0, z=0 으로 null 일 때 기본값 지정

addFunc(int x, [int y = 1, int z = 1]) {
	int sum = x + y + z;
    
    print(sum);
}

 

 

named paramter로 선언한 함수

void main() {
	addFunc(x: 1, y: 2, z: 3); // 6
    addFunc(x: 1, y: 2 ); // 3
}

// named paramter
addFunc({
	required int x,
    required int y,
    int z = 0, // optional parameter
}) {
	int sum = x + y + z;
    
    print(sum);
}

 

 

arrow function

void main() {
	int result = addFunc(10, y: 20);
    int result2 = addFunc(10, y: 30, z: 40);
    
    print('result: $result'); // result: 40
    print('result2: $result2'); // result2: 80
    
    print('sum: ${result + result2}'); // sum: 120
}


int addFunc(int x, {
	required int y,
    int z = 10,
}) => x + y + z;

 

 

typedef

void main() {
	Operation op = add;
    int result = op(10, 20); // 30. add 함수 실행됨.
    
    op = subtract;
    int result2 = op(10, 20); // -10. subtract 함수 실행됨.
}

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

int add(int x, int y) => x + y;

int subtract(int x, int y) => x - y;

 

typedef 에 선언된, signature에 부합하는 모든 함수를 집어넣어서 사용 가능

 

현실적으로 어떤 형태로 사용하느냐,

void main() {
	calculate(30, 40, add); // 70
    
    calculate(10, 50, subtract); // -40
}

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

int add(int x, int y) => x + y;

int subtract(int x, int y) => x - y;

int calculate(int x, int y, Operation op){
	return op(x, y);
}

함수 파라미터로 typedef로 정의된 signature를 받아서 사용