본문 바로가기
Flutter

[Flutter] Dart

by ♡˖GYURI˖♡ 2023. 6. 21.

1. Dart 언어의 특징

  • Statically typed language
  • 강력한 객체지향 언어
  • 단일상속, mixin 지원

 

2. Type

- 기본 자료형

  • int : 정수형
  • double : 실수형
  • num : int, double을 포함하는 타입
  • bool : true, false
  • String : 문자열 (' ')

- 집합 자료형

  • List : 중복을 허용하며 순서가 있는 집합
  • Set : 중복을 허용하지 않고 순서가 없는 집합
  • Map : key-value 쌍으로 구성된 집합

 

 

타입 선언

 

- 기본 자료형 : 형식 변수명;

String name;
int age;

 

- 집합 자료형 : 타입<요소타입>;

List<int> numbers = [0, 1, 2];

Map<String, int> scores = {
	'english' : 100,
    'math' : 90,
    'science' : 80
}

 

- 함수 : 반환타입 함수명;

void main() {
	print('Hello!');
}

String greeting() {
	return 'Hello!';
}

 

 

var/dynamic

 

- var : 타입 추론

var 키워드를 사용하면 타입을 선언하지 않아도 변수에 할당된 초기값에 따라 타입이 자동으로 추론됨 (단, 이후 해당 변수는 타입 변경 불가)

void main() {
	var age = 5;		//int
    var name = dana;   	 	//String
    var human = true; 	 	//bool
    age = 20;			//ok
    age = 'hi';			//Error : age는 int타입, 'hi'는 String타입
}

 

- dynamic : 동적 타입 지정

변수 선언 시 dynamic을 붙여주면 컴파일러가 해당 변수에 모든 형식을 허용함 (이후 타입 변경 가능)

void main() {
    dymanic something = 9;
    something = 'apple';
    print(something);	//apple
}

 

 

final, const, static

  • 변수의 형식을 확장하는 키워드
  • final, const 모두 불변하는 상수를 의미하지만 약간의 차이 존재
    • const : 앱의 life cycle에서 절대 변하지 않음을 의미하기 때문에 불변 변수의 앞에 const를 붙여 주면 플러터가 그 부분을 rebuild하지 않기에 앱의 속도가 빨라짐 (성능 up)
    • const : compile-time constant로 앱 빌드 시 값이 정해지는 반면, final은 run-time constant로 앱 빌드 시에는 값이 정해지지 않지만 앱 실행 시 값이 정해짐
  • static은 클래스 레벨의 변수를 의미, 클래스의 각 인스턴스는 하나의 static 값을 공유함

 

 

3. Operator

 

기본 연산자

 

- ~/

void main() {
	print(55~/2) ; //27
}

 

- as

강제 형변환 키워드, 부모 타입의 객체를 자식 타입의 객체로 형변환(다운캐스팅)할 때 사용

 

 

- is / is!

void mai() {
    var age = 0;
    print(age is int);  //true
    print(age is num);  //true
    print(age is! num); //false
}

 

 

null-aware 연산자

객체가 null일 경우를 인지하여 에러 발생을 막고 다른 값을 할당시키는 연산자

 

- A?.B

Optional chaining, A가 null이 아니면 A 객체의 B 속성을 사용하고, null이면 null 반환(A는 name, B는 length)

void main() {
    String? name;
    print(name.length);		//Error : null값
    print(name?.length); 	//?. 로 처리 시 Error가 나지 않음
}

 

- A ??= B

위와 반대로 B가 null이면 백업값 할당, 아니면 B 반환(A는 myAge, B는 age)

void main() {
    int age;
    int myAge = 24;
    myAge ??= age;
    print(myAge);	//age가 null이므로 24 반환
}

 

 

4. Function

함수의 구조

 

- 기본구조 : 리턴값 타입 함수명 (파라미터 타입 파라미터) {}

String sayHi(String name) {
    return 'Hi $name!';
}

 

- 화살표 함수 : '{return 리턴값}'을 '=> 리턴값'으로 축약 가능

String sayHi(String name) => 'Hi $name!';

 

- main 함수

 

 

 

파라미터

 

- named parameter : 파라미터를 중괄호로 감싸면 named parameter가 됨

void main() {
    void introduce({required String name, required int age}) {
    	print('I am $name. $age years old!');
    }
    introduce(name: 'Sam', age: 5);
}

 

- optional parameter : 파라미터를 대괄호로 감싸면 선택형 인자 설정 가능

void main() {
    void introduce(String name, int age, [String? food]) {
    	print('I am $name. $age years old!');
    	if(food is String) {
    		print('I like $food!');
        }
     }
    
    introduce('Tom', 7);		//I am Tom. 7 years old!
    introduce('Sam', 5, 'ice cream');	// I am Sam. 5 years old! I like ice cream!
}

 

- default parameter : = 연산자 사용

void main() {
    void introduce(String name, int age, [String food = 'chocolate']) {
    	print('I am $name. $age years old! I like $food!');
    }
    
    introduce('Tom', 7)    // I am Tom. 7 years old! I like chocolate!
}

 

 

5. Null Safety

 

1) nullable

  • 일반 타입 뒤에 물음표를 붙여주면 해당 변후는 해당 타입 또는 null이 될 수 있음을 나타냄
  • 초기화 없이 사용하면 null 값으로 할당됨
void main() {
    String? name;
    int? age;
    bool? student;
    
    print(name);    // null
}

 

2) non-nullable

  • 물음표 없이 사용하면 자동적으로 null이 될 수 없는 값으로 인식됨
  • 사용 전 반드시 초기값 할당
void main() {
    String name;
    int age;
    bool student;
    
    print(name);    // Error
}

 

- required

: 함수에서 네임드 파라미터나 옵셔널 파라미터를 설정할 때, non-nullable로 지정하기 위해 타입 앞에 붙여줌

void greeting({required String name}) {
    print('Hello $name!');
}

 

- late

: 클래스에 non-nullale 프로퍼티가 필요하지만 디폴트값이나 초기화를 시키지 않을 경우 나중에 값을 할당한다는 의미

class Cat {
    late String name;
    late int age;
}

 

 

 

 

 

참고 : https://velog.io/@dosilv/Flutter-Dart-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-type-operator-function-null-safety

 

[Flutter] Dart 문법 정리 🎯 (type / operator / function / null safety)

내가 보려고 정리하는 다트 문법 🗒

velog.io