본문 바로가기

Flutter/Dart

플러터에서 자주 쓰이는 Dart 언어 특징들

2024.10.22 수정됨

계속 쓰면서 업데이트 할 예정

 

변수

변수 타입

다트언어는 형변환을 지원하지 않는다.

num 타입에는 int ,double 타입 모두 대입할수  있다.

var : 한번 데이터를 할당하면 데이터 변경이나 다른 형태의 변수로 바꿀수도 없다.

Dynamic : 데이터 변경도 자유로움 ( int 타입이 었다가 String 타입으로도 변환 가능.)

 


final , const

1. 비교

차이점

  • 코드 실행의 결과로 인해 결정되는 상수 : final
  • 코드 실행 이전부터 결정되어야 하는 상수 const ⇒ DateTime.now() 과 같이 실행의 결과로 나오는 값 불가

공통점

  • 둘 다 "상수"이다.

2. 선언 방법

  • final String a = "final";
  • const String b = "const";

final 이든 const 든 선언된 이후, 값을 변경하려고 하면 에러가 발생한다

3. Immutable 하다

"바뀔수 없다." 라는 의미

 

⇒ 이를 플러터에 적용해보자면,

Stateful 위젯은 mutable이다.

Stateless 위젯은 immutable 이다.

따라서 Stateless 위젯에 사용하는 변수가 있다고 한다면, 해당 변수는 한번 값이 설정되면 변경 될수 없어야 하고, 이 경우 해당 변수 타입에 final (Stateless 위젯은 필요하게 되면 렌더링 되기때문에, 코드 실행의 결과로 인한 final 을 사용)을 붙여주어야 한다.

즉 , Stateless 위젯은 state가 없는 위젯이므로 상수만 존재할 수 있다.

 


함수

리턴타입 메서드명(매개변수) {
  함수내 코드
  return ~
}

int doubleValue(int a, int b) {
  int value = a + b;
  return value;
}
  • 클래스 밖에 작성하는 함수 ⇒ 최상위 함수 (main 함수 같은). 최상위 함수는 어디에서나 접근 가능
  • 클래스 내부에 작성하는 함수는 객체 생성 또는 클래스 이름을 통해 접근 가능
  • static 키워드가 붙은 함수는 최상위 함수 처럼 사용 가능 ⇒ 어디에서나 접근 가능하다는 이야기

 

익명 함수 와 람다식

다트 공식문서에는 익명 함수를 람다 또는 클로저(closure)라고도 부른다고 설명해놨다. (좀 다른 거 같은데..)

 

  • 익명 함수의 기본 형태는 다음과 같다.
(매개변수명) { 표현식; };
ex) (a, b) { a + b; };

 

  • 람다식의 기본 형태는 다음과 같다.
(매개변수명) => 표현식;
ex) (a, b) => a - b;

 

익명 함수와 람다식의 차이점을 보면 결국 { };를 => 로 변경한 것 밖에 없다. 그래서 친구라고 말했던 것이다.

실제로 어떻게 쓰이는지는 다음 예제를 참고하면 된다.

int add(int a, int b) {
	return a + b;
}
// 익명 함수
var multi = (_a,_b) {
	return _a * _b;
}
// 람다식
sub(_a, _b) => _a - _b;

main() {
	int a= 10;
	int b= 5;

	print('$a + $b = ${add(a,b)}');
	print('$a + $b = ${multi(a,b)}');
	print('$a - $b = ${sub(a,b)}');
}

//결과값
10 + 5 = 15
10 * 5 = 50
10 - 5 = 5

 


 

삼항연산자

개발할때 정말 많이 사용된다.

특정 변수의 true , false 결과 값에 따라 다른 위젯을 보여주고자 할때 많이 사용한다.

int value1 = 5;
bool value2 = false;

value1 = value2 ? 100 : 200;

?는 자바에서도 볼 수 있는 삼항연산자 입니다.

? 앞의 수식이

  • true면 :의 앞쪽을 반환하고,
  • false면 :의 뒤쪽을 반환합니다.

플러터에서 굉장히 자주 사용하게 되는데, widget내에서는 if문을 사용하지 못하기 때문입니다.

// isSignIn 의 bool 값에 따라서 다르게 표현되는 Widget
isSignIn 
? RaiseButton(
    child : Text('SignUP'),
	onPressed:(){}			
  )
: SizedBox();

예시처럼 조건에 맞게 widget이 랜더링 되어야하는 경우에는 삼항연산자를 사용해야합니다.

또, 크기나 기타 위젯의 속성들을 조건에 맞추는 경우도 마찬가지입니다.

그리고 삼항연산자는 반드시 true와 false 두가지 반환값이 필요한데, 아무 위젯도 반환하고 싶지 않을 경우에는

SizedBox를 반환하는 것이 일반적입니다.

 

정리하자면 if문은 widget에서 사용할 수 없으니 삼항연산자를 사용해야합니다.

 


 

Nullish coalescing

?. 연산자

객체가 null 아니면 정상 수행, null일 때는 에러 대신 null을 반환

var a = nullableObject?.MethodA();

// 위와 같은 처리
if(nullableObject != null) {
  a = nullableObject.MethodA();
}

null 일때, 에러를 반환하므로 사용을 권하지 않는다.

안전한 코드작성은 null check 를 확실히 하는 코드 작성 습관을 들여야 한다.

 

?? 연산자

null이 아니면 정상 결과를 null이면 ?? 뒤에 값을 리턴

: 변수의 default 값을 설정하는데 많이 사용한다.

String data = loadData() ?? 'fail'; // loadData() 가 null 이면 'fail' 반환

이 연산자를 사용할 때 가장 많이하는 실수가 map 타입에서 사용하는 경우입니다.

Map data = {'name' : 'pitter' , 'id' : 1};

bool result = data.containKey('name');

Map의 데이터가 null임을 확인하고 준비해준 데이터로 대체하고 싶다면

??이 아니라 containsKey나 containsValue 함수를 사용하여 Map 내부에 해당하는 key, value가 있는지 확인해야합니다.

만약 data['name'] ?? 'fail' 처럼 코드를 작성했다면 의도한대로 동작하지 않을 것입니다.

 

??= 연산자

변수가 null이 아닌 경우는 값을 할당하지 않고, null 인경우는 우변 값을 할당한다.

보통 null 값 특수처리를 하고 싶은 경우에만 사용함.

var a ??= 0;

// 위와 같은처리. 이게 더 직관적이라서 더 많이 사용
a = a ?? 0;

 


 

반복문의 where (조건필터링 함수)

for , if 문을 사용하면 더 많은 양의 코드를 작성해야 하지만

final items = [1,2,3,4,5]

// 짝수만 출력
items.where((e) => e%2 == 0).forEach(print) // 2, 4

 

'Flutter > Dart' 카테고리의 다른 글

Flutter 로드맵 - 2025  (0) 2024.12.02
Dart : isolate  (2) 2022.12.13