[Dart] 기본 문법

임승민·2023년 6월 27일
0

Dart

목록 보기
2/3
post-thumbnail

콘솔

print()

print 함수를 통해 콘솔을 찍을 수 있다.(JS의 console.log)

dart는 뒤에 꼭 세미콜론을 붙여야 한다.

void main(){
	print('hello world!'); //hellog world
}

타입 추론 변수, 동적 타입 변수

var (타입 추론 변수)

var는 모든 타입을 할당할 수 있고 재할당 또한 가능하다. 하지만 첫 할당한 타입과 다른 타입으로 재할당이 불가능하다.

void main(){
	var name = 'simon';
	print(name); //simon
	name = 1; //error🚨
}

dynamic (동적 타입 변수)

dynamic은 어떤 타입이건 할당할 수 있다. 첫 할당한 타입과 다른 타입으로 재할당이 가능하다.

void main(){
	dynamic text = 'hello';
	text = 1;
	text = true;
} 

둘의 차이

var와 dynamic은 모든 타입을 할당할 수 있는 공통점이 있다.

하지만 var는 초기화 시 타입을 추론하여 재할당 시 다른 타입으로 변경이 불가능하다.

dynamic은 동적으로 타입이 변경되어 재할당 시 다른 타입으로 변경이 가능하다.

+ runtimeType

runtimeType을 통해 변수의 타입을 확인할 수 있다.

void main(){	
	var idk = true;
	print(idk.runtimeType); //bool
}

기본 타입

String

String 타입은 문자열만 할당할 수 있다. 문자를 더하면 문자가 합쳐진다.

${}안 혹은 $뒤에 변수를 넣어서 사용할 수도 있다. JS의 백틱(````)과 유사한것 같다.

void main(){
	String text = 'hello';
	String text2 = 'world'
	print(text + ' ' + text2); //hello world
	print('${text} ${text2}'); //hello world
	print('$text $text2'); //hello world
}

Int (integer)

int 타입은 정수만 할당할 수 있다.

void main(){
	int num = 1;
	print(num + num); //2
}

double

double 타입은 실수만 할당할 수 있다.

void main(){
	double num = 0.5;
	print(num + num); //1
}

bool

bool 타입은 true, false만 할당할 수 있다.

void main(){	
	bool t = true;
	bool f = false;
}

nullable

변수에 null을 할당하면 에러가 발생한다. 하지만 타입뒤에 ?를 붙이면 null도 할당할 수 있게된다.

void main(){
	String text = 'hello';
	text = null; //error🚨
	String? text2 = 'hello';
	text2 = null; 
}

non-nullable

타입 앞에 ?를 사용하는 경우, 변수와 !를 호출하면 현재 값이 null이 아니라는 뜻이다.

void main(){
	String? text = 'hello';
	print(text!); //hello
}

컬렉션 타입

List

List 타입은 <>안에 나열할 값의 타입을 적어주면 된다. 만약 List에 설정한 타입과 다른 값이 있으면 에러가 발생한다. JS의 배열과 비슷하다.

void main() {
	List<String> alphabet = ['a','b','c'];
	pring(alphabet[1]); //b
}

List) add 메소드

add 메소드를 이용해 List에 값을 추가할 수 있다.

void main() {
	List<String> alphabet = ['a','b','c'];
	alphabet.add('d');
	pring(alphabet); // [a, b, c, d]
}

List) remove 메소드

remove 메소드를 이용해 특정 값을 제거할 수 있다.

void main() {
	List<String> alphabet = ['a','b','c'];
	alphabet.remove('a')
	pring(alphabet); // [b, c, d]
}

List) indexOf 메소드

indexOf 메소드를 통해 원하는 값의 인덱스를 구할 수 있다.

void main() {
	List<String> alphabet = ['a','b','c'];
	pring(alphabet.indexOf('c')); // 2
}

Map

Map의 꺽쇠안에는 <key, value>의 타입을 넣어주면 된다. 대괄호를 통해 특정 값에 접근할 수 있다. (JS의 객체)

void main() {
	Map<String, int> price = {
		'staek': 120,
		'pasta': 30,
	};
	print(price); //{staek: 120, pasta:30}  
	print(price['staek']); // 120
}

Map) addAll 메소드

addAll 메소드로 Map안에 프로퍼티를 추가할 수 있다. 또는 그냥 할당해서 추가할 수도 있다.

void main() {
	Map<String, int> price = {
		'staek': 120,
		'pasta': 30,
	};

	price.addAll({
		'pizza': 20,	
	})
	print(price); //{staek: 120, pasta: 30, pizza: 20}  

	price['soup'] = 5;
	print(price); //{staek: 120, pasta: 30, pizza: 20, soup: 5}  
}

Map) remove 메소드

remove 메소드로 특정 프로퍼티를 삭제할 수 있다.

void main() {
	Map<String, int> price = {
		'staek': 120,
		'pasta': 30,
	};

	price.remove('pizza')
	print(price); //{staek: 120}  
}

Map) keys, values 메소드

keys 메소드로 Map의 keys만 얻을 수 있고, value 메소드로는 values를 얻을 수 있다.

void main() {
	Map<String, int> price = {
		'staek': 120,
		'pasta': 30,
	};
	print(price.keys); // (staek, pasta)
	print(price.values); // (120, 30)
}

Set

List 처럼 값들을 나열할 수 있지만 다른점은 중복값이 포함 될 수 없다. 포함시켜도 자동으로 제거해준다. 대부분의 메소드는 List와 비슷하다.

void main() {
	Set<int> price = {1,2,3};
	print(price); // {1,2,3}

	price.add(1);
	print(price); // {1,2,3}

	price.remove(3);
	print(price); // {1,2}
}

Set) contains 메소드

contains 메소드로 Set내부에 특정값이 있는지 확인할 수 있다.

void main() {
	Set<int> price = {1,2,3};
	print(price.contains(1)); // true
}

상수

const, final

타입 앞에 const 혹은 final을 붙이면 상수가 되어 재할당이 불가능해진다. 또한 식별자 앞에 타입을 쓰지 않아도 된다.

void main(){
	const String text2 = 'text2';
	text2 = 'string'; //error🚨

	final String text = 'text';
	text = 'string'; //error🚨

	const text3 = 'ABC';
}

const, final 차이점

const: 컴파일 타임에 값 결정

final: 런타임에 값 결정

  • 컴파일 타임: 소스코드에서 기계어로 변환되는 과정
  • 런타임: 컴파일 종료 후 프로그램이 실행되는 때
void main(){
	const DateTime time1 = DateTime.now(); //error🚨
	final DateTime time2 = DateTime.now();
}

DateTime.now()는 함수를 실행한 순간의 시간을 반환한다. 그래서 컴파일 타임에 값이 결졍되는 const는 에러가 발생한다.


연산자

산술/ 할당/ 비교 연산자는 다른 언어들과 동일하다.

null 병합 연산자

null 병합 연산자는 왼쪽 값이 null이 아니면 왼쪽 값을 반환, null이면 오른쪽 값을 반환한다.

void main(){	
	int? x;
	int y = 10;
	int z = x ?? y;
  print(z); //10
}

null 병합 할당 연산자

null 병합 할당 연산자는 변수의 값이 null이면 오른쪽 값을 할당한다.

// null일 경우
void main(){
  double? number = 2;
  print(number); //2
 
  number = null;
  print(number); // null
  
  number ??= 100;
  print(number); //100
}
// null이 아닐 경우
void main(){
  double? number = 2;
  print(number); //2
  
  number ??= 100;
  print(number); //2
}

타입 검사 연산자

is앞에 변수가 is뒤의 타입이면 true를 아니면 false를 반환한다. is뒤에 !를 붙이면 반대값이 나온다.

void main(){
	String text = 'a';
	print(text is String); //true
	print(text is int); //false
	print(text is! int); //true
}

0개의 댓글