본문 바로가기
개발일지/임시카테고리

나를 위한 Dart 오퍼레이터 기본기 기초 문법 총모음 1

by 다니엘의 개발 이야기 2025. 3. 21.
320x100

#0 기본 컨셉

 

보아하니, 모든 변수에 대해서는 

1. 처음 선언 되었을 때의 "내용"

2. 처음 선언 되었을 때의 "타입"

이 2가지가 변동되는가, 고정되는가에 대해서 각 선언문이 달라진다는 것을 알 수 있었다.

 

#1 dynamic

dynamic name = 1;

이렇게 선언해주면, int로 타입이 지정된다.

dynamic = 'kellog';

그 뒤에 이렇게 오버라이드 해주면 String 타입이 된다.

 

즉, dynamic은 타입, 내용 모두를 오버라이드 가능하다.


#2 var

var name = 1;

기본적으로 모든 타입이 처음에 부여가 가능하다.

name = 'kellog';

하지만 뒤에 이렇게 String type으로 변환하려고 하면 에러가 발생된다.

 

이유는, var로 선언이되면, 처음 선언된 1)타입, 2)내용 에서

1)타입은 고정이 되고

2)내용은 오버라이드 가능하다.


#3 이미 선언된 변수를 추가 선언 못한다.

// 가능한 경우

var name = 'Maximus';
name = 'trash';

// 이런 경우에는 기존의 선언에서 타입이 변하는게 아니라 내용이 변하는 것이라 가능
// 불가능한 경우

var name = 'foods';
dynamic name = 'dog';
var name = 'cat';

// 이런 경우에는 이미 var로 name이 선언 되었기 때문에 뒤에 나오는 것이 
// 어떤 타입이든 상관없이 변수를 중복으로 만들 수 없다.

#4 ! 아니면 ?

 

String? name = 'name';
// ?를 넣게 되면, 추후에 String으로 선언된 name이 null(공백)으로 추가 선언되어도 괜찮다.

print(name!);
//이렇게 !를 넣게 되면, 이 값은 "반드시 null 값이 아니다." 라는 뜻이다.

#5 final vs const

 

// 공통점

final String name = 'name';
const String name2 = 'name2';
// 일때, 이후에 나오게 될 name이나 name2에 대해서는
// 타입도, 내용(여기서는 각각 'name', 'name2')를 변경시킬 수 없다.

// 활용법

// final과 const는 var 성격을 내포하고 있기 때문에
// 위에 쓴 것 처럼 내가 사용하고자 하는 타입을 선언안해줘도 된다.

final name = 'name';
const name2 = 'name2';
// 이렇게

 

차이점

 

final은 빌드되고 나서 "실행될때"의 값을 노출해준다. 즉, 실행버튼을 누르면

코드작성 - run버튼 실행 - 빌드 - 해당 시간이 저장

이 된다.

 

반면, const는  이미 선언 되어있을때의 시간이 저장되는 것이 아니라, 해당 코드가 작성 되었을때,

시간이 저장된다.

코드작성 - 해당시간이 저장 - run버튼 실행 - 빌드

의 과정인 것이다.

 

그렇기에

final은 DateTime now()의 경우를 실행할 때의 성격과 같이

코드작성 - run버튼 실행 - 빌드 - 해당 시간이 저장

되어서 문제가 없지만,

 

const 의 경우 DateTime now()를 할 경우는 

서로 상충 되어서 작동이 안된다.


#6 ++, --, +=, *=, /=, ??=

 

++는

1씩 값이 증가된다.


--는

1씩 값이 감소한다.


+=는

var name = 1;
name += 5;

// 6이 나온다.

 

즉, 내가 += 뒤에 선언해준 값 만큼 name에 덮어진다.

-=도 원리는 마찬가지


*=는

a *= b의 경우에

a라는 변수에 a*b를 담아준다. 라는 뜻이다.


/=는

a /= b의 경우에

a라는 변수에 a/b를 담아준다.


??=

의 경우는

 

int number = 1;
number ??= 4;

// 결과는 1

왜 그렇냐면, ??=의 경우에는

왼쪽의 변수가 null 값이면, ??= 오른쪽 값을 채워주고,

null이 아니라면 그냥 pass해줘 라는 의미다.

// 따라서

int iam = null;
iam ??= 55;

// 결과값 55

 

void main() {
  var mat = 4;
  mat ??= 555;
  print(mat);
  
  var meet = null;
  meet ??= 55;
  print(meet);
}

// 결과값
// 4
// 55

#7 is, is!

 

void main() {
	int number = 1;
    
    // number라는 변수가 int 타입이 맞냐
    print(number is int);
    // true
    
    // number는 int 타입이 아니다. 
    print(number is! int);
    // false
   
}

 

보면 알겠지만

 

변수 is 타입 -> 변수가 입력된 타입이 맞아?

변수 is! 타입 -> 변수가 입력된 타입이 아니지?

 

300x250