넘치게 채우기

[Dart] 간단한 Dart 문법 정리. 본문

개발/Flutter + Dart

[Dart] 간단한 Dart 문법 정리.

riveroverflow 2023. 7. 11. 18:02
728x90
반응형

 

함수와 main 함수

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

모든 다트 프로그램들은 main함수를 반드시 정의하여야 합니다.

다트 프로그램들의 실행은 모두 main함수로부터 시작됩니다.

void는 반환값이 없음을 뜻합니다.

main()은 main함수의 선언을 의미합니다. 함수명 뒤에 소괄호’()’를 붙여 함수를 선언합니다.

중괄호{}로 실행할 코드를 감쌉니다.

 

int addNums(int x, int y){
	return x + y;
}

이는 두 수를 입력받아 더하는 addNums()라는 함수입니다.

함수명 앞에 반환할 자료형을 정의합니다.

(int x, int y)으로 입력받을 인수를 정의합니다.

return을 통해서 함수가 값을 반환시킵니다.

자료형

아래는 Dart의 기본적인 자료형입니다:

int num = 1; //64비트의 정수 범위
double numm = 1.0; //부동소수점 값을 나타낼 수 있는 64비트의 범위

String str = 'Dart'; //문자열 값. ''이나 ""으로 감싸서 표현.

bool val = true; //불리언(boolean) 값. 참 또는 거짓으로 이루어지는 논리 값입니다.

List<int> lst = [1, 2, 3]; //순서가 있는 값의 목록. < > 사이에 자료형을 넣어 정의합니다.

Map<T, T> // key - value의 형식으로 데이터를 저장합니다. < > 사이에 자료형을 정의합니다.

Set<T> // 집합. 중복되는 값을 방지합니다.
dynamic myData = 10;
myData = true;
myData = 'Dart';

dynamic으로 선언된 변수는 어떠한 형식으로도 받을 수 있습니다. 보통 Map과 함께 사용하는 경우가 많습니다.

 

반면, var는 한번 정의되고 바꿀 수 없습니다.

var는 받은 값을 통해서 자료형을 추론합니다.

var variable = 0; // 
variable = true; // 이 코드는 유효하지 않습니다. 이미 변수가 int로 추론되었기 때문입니다.

 

 

주석

// 인라인 주석
/*
블록 주석
*/

/// 문서화에 사용하는 주석
///
///

 

vscode 단축키 (Win : Ctrl + / , Mac : Cmd + / )로 원하는 부분을 지정하여 주석화할 수 있습니다.

 

 

final, const, static, lazy

final과 const 는 비슷하게 느껴집니다.

둘은 변수를 바꿀 수 없게(immutable) 할 수 있습니다.

 

final 변수는 한 번만 할당할 수 있으며

런타임에서 선언 또는 생성 시 초기 값을 할당합니다. 그 이후로는 변경될 수 없습니다.

주로 클래스 수준에서 변수를 할당하기 전에 선언합니다.

클래스의 생성자에서 할당하는 모든 변수에 final을 사용합니다.

 

const 변수는 컴파일 타임 상수로, 선언 시에 상수로 초기화합니다.

 

final은 객체의 초기 값 할당에 주로 사용되고, const는 일반적인 상수 사용에 사용됩니다.

 

둘 다 자료형 앞에 붙여서 사용합니다.

 

static은 클래스를 인스턴스 없이 사용가능하게 합니다.

staic으로 선언된 멤버(변수, 상수, 메서드)는 클래스 수준에서 하나의 멤버만 선언되며, 모든 인스턴스가 해당 멤버를 공유합니다.

인스턴스를 생성하지 않고도 생성을 가능하게합니다.

 

lazy는 변수에 값이 즉시 초기화되지 않아도 됨을 의미합니다.

 

 

Null

개발을 하는 중에는 null 관련된 이슈가 많습니다. null을 잘 다룰수록 소프트웨어의 안정성이 높아집니다.

Dart언어는 강력한 널 연산자와 널 안정성 기능을 제공하고 있습니다.

 

널 안정성 기능

var? nullableVar; //null이 될 수도있는 변수를 선언할 수 있습니다.
var non_nullableVar = 'hello';; //null을 허용하지 않는 변수를 선언합니다.

print(non_nullableVar!);

?으로 변수가 널이 가능함(nullable)을 선언합니다.

!으로 변수가 널이 되는것이 불가능함(non-nullable)을 선언합니다. null 체크를 생략할 수 있습니다.

 

 

널 연산자

if(user != null){
	this.userAge = user.age;
}
//위와 아래 두 코드는 같은 의미입니다. 널이 아니면 userAge에 user.age를 넣습니다.
this.userAge = user?.age


this.userAge = user.age ?? 18; //user.age가 널이면 오른쪽의 값을 넣습니다.


int x;
x ??= 3; //x가 널이면 3을 대입합니다. 널이 아니라면 하지 않습니다.

?. : 변수가 널이 아닌경우 접근이 가능합니다.

?? : 변수가 널인경우, 대체값을 변수에 넣습니다.

??= : 변수가 널인 경우에만 값을 넣습니다(??과 비슷합니다)

 

 

as, is, is!

as는 변수를 다른 타입으로 캐스팅할 때 사용됩니다.

주로 부모 클래스를 자식 클래스처럼 사용할 때 사용됩니다.(다운 캐스팅)

 

is는 변수의 자료형을 확인합니다. 비교 자료형과 맞으면 true, 아니면 false를 반환합니다.

 

is!는 is의 반대 불리언을 반환합니다. 다르면 true, 같으면 false를 반환합니다.

 

class Animal {
  void eat() {
    print('Animal is eating');
  }
}

class Cat extends Animal {
  void meow() {
    print('Meow!');
  }
}

class Dog extends Animal {
  void bark() {
    print('Woof!');
  }
}

void main() {
  Animal animal = Cat();
  
  if (animal is Cat) {
    // animal이 Cat 타입인지 확인
    Cat cat = animal as Cat; // animal을 Cat 타입으로 캐스팅
    cat.eat(); // Animal 클래스의 eat 메서드 호출
    cat.meow(); // Cat 클래스의 meow 메서드 호출
  }
}

 

 

반복문, 제어문

다른 C언어기반의 문법과 비슷합니다.

for문, for-in 문, while문, do~while문이 있습니다.

if/else, switch, 삼항 연산자등도 사용합니다.

 

열거자

enum은 상수 집합을 표현하는 클래스입니다. 이는 높은 안정성을 제공합니다.

enum Color = {red, blue};

 

 

다트의 객체지향 프로그래밍

클래스 선언

class Cat {
	String name;
	String color;
}

Cat haru = Cat();
haru.name = 'Haru';
haru.color = 'grey';

Cat moya = Cat();
haru.name = 'Moya';
haru.color = 'Yellow';

Cat클래스는 객체의 청사진일 뿐입니다. Cat 클래스의 인스턴스 hart는 객체이고, 다른 인스턴스들과 독립적인 name과 color를 가집니다.

 

Haru와 Moya는 완전히 다른 객체입니다.

 

생성자

class Human { //#1
	String name; //처음에는 null이 할당됨.
	int age;

	Human(String name, String age) { //생성자
		this.name = name;
		this.age = age;
	}
}
////////////
class Human { //#2 다트에서는 1번보다 간결하게 코드를 짤 수 있습니다. (아래처럼)
	String name; //처음에는 null이 할당됨.
	int age;

	Human(this.name, required this.age) { //생성자. required를 붙이면, 클래스를 만들 때 필수적으로 요구합니다.
	}
}

void main(){
	Human Doil('Doil', 21);	
	print(Doil.age); //21
}

새 인스턴스를 만들 때 수행할 동작을 지정할 수 있습니다.

이 역할을 하는 함수를 생성자(Constructor)라고 합니다.

 

 

상속

class Animal{ //슈퍼클래스
	int legs;
	int age;
	String name;

	void bark(){}
}

class Dog extends Animal(){ //서브클래스

	Dog(this.legs, this.age, this.name);
	
	@override //오버라이딩
	void bark(){
		print('Woof!');
	}
}

Animal 클래스를 상속받은 Dog 클래스는 Animal클래스의 모든 속성을 이어받습니다.

@Override를 통해서 상위 클래스의 메서드를 재정의 할 수 있습니다.

 

 
728x90
반응형