본문 바로가기
[개발] 이야기/[Flutter] 이야기

[Flutter] dart 키워드로 보는 기본문법 총정리 - dart A to Z 문서 하나로 보는 정리

by 헤이나우
반응형

 

다트언어는 플루터 앱들을 만드는데 사용됩니다. 제가 몇가지 언어를 배웠는데 다트언어는 그 중 여러 언어의 장점들만 모아놓은 느낌이 듭니다. 물론 다른 언어보다 최근에 나온 언어이기 때문에 가능하다고 생각됍니다. 

 

그럼 다트언어가 어떠한 장점이 있는지 다른언어에 비해서 어떤점이 좋은지 확인해 봅시다.!

 

 

 

dartpad (https://dartpad.dev/)
dart를 웹으로 실행할 수 있는 사이트 입니다.
간단하게 dart를 테스트 해볼 수 있습니다.
주석
// 줄주석
/*
영역 주석
*/ 

자료형

자료형 설명 예시
String 문자열 String name = '헤이나우'
String name = "헤이나우"
int 정수 int i = 1
double 실수 double i = 1.0
bool 참, 거짓 bool flag = true/false
List<T> 배열 List<int> list = [1,2,3,1,2,3]
Map<K,V> 사전 Map<int,String> dic = { 1:"dart" }
Set<T> 중복을 제거한 배열 Set<int> set = [1,2,1,2,] => [1,2]
dynamic 모든 자료형을 담을 수 있음 dynamic name ="hi"
name = 1

변수(variable)

변수명은 카멜케이스 형식으로 사용한다

String myName = "헤이나우";
String myEngName = "HeyNow";

var

var str = "String Type";
var i = 3;
var list = [1,2,3,4]; //List<int>

{자료형}

String str = "str";
int i = 1;
bool flag = false;

{자료형}?

//자료형? 으로 선언하면 null값을 넣을 수 있다.
String? str = null;
str = "String";

final {자료형}

final date = DateTime.now();
date = DateTime.now(); //오류발생

const {자료형}

const str = "string";
str = "str"; //오류발생

 

* final과 const의 차이점

const는 빌드시 값이 정확히 명시되어야 한다(숫자나 문자열같은-상수)

final은 함수를 통해 값을 초기화 할수 있다. 한번 초기화 이후 변경은 안된다.

 

연산자

기본연산자

+, -, *, /, ~/(몫), %(나머지)

int i = 10;
int j = 3;
print(i + j);  // 13
print(i - j);  // 7
print(i * j);  // 30
print(i / j);  // 3.3333333
print(i ~/ j); // 3
print(i % j);  // 1

 

증감 연산자

++,--

int i = 10;
print(i++); // 10
print(i);   // 11

i = 10;
print(++i); // 11

i = 10;
print(i--); // 10
print(i);   // 9

i = 10;
print(--i); // 9

비교 연산자

==, !=, >, <, >=, <= 사용 가능.

print(10 == 10); // true
print(10 != 10); // false
print(10 > 1);   // true
print(10 < 1);   // false
print(10 <= 10); // true
print(10 <= 10); // true

논리연산자

&&, ||, ==, !, != 사용 가능.

print(true && false); // false
print(true || false); // true
print(true == false); // false
print(!true);         // false
print(true != false); // true

삼항연산자

int i = 10;
int j = 20;
print(i > j ? "i가 크다" : "j가 크다"); 
// j가 크다 출력

null체크 연산자 (null cheked operation)

String? str = null;
print(str ?? "str은 null이다"); // str은 null이다
str = "value";
print(str ?? "str은 null이다"); // value

 

제어문

if

int i = 10;
if (i == 10) {
//i가 10
} else if (i == 20) {
//i가 20
} else {
//그외
}

for // for in

var numbers = [1,2,3,4,5];

for (int i = 0; i < numbers.length; i++) {
	var number = numbers[i];
	print(number);
} 

for (var number in numbers) {
	print(number);
}

while

int i = 0;
while(i < 10) {
    print(i);
    i++;
}

do while

do 문은 무조건 한번은 실행한다

int i = 0;
do {
    print(i);
} while(i < 10);

continue

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
      continue;
    }
    print(i);
 }

break

int i = 0;
  while(true) {
    if (i == 10) {
      break;
    }
    i++;
    print(i);
 }

 

 

반응형

 

함수

[return type] func name()

* return type 생략 가능

void func1(String str){
  print("void");
}
int func2(String str, int i) {
  return 1;
}

func3() {
  print("void");
}
func4() {
  return 1;
}

named 함수(초기 값을 지정해 줘야 한다, 생략 가능)

int namedFunc(String str, {int number = 0, String name = ""}) {
  return 1;
}

//호출 방법
namedFunc("str",number: 10);
namedFunc("str", name: "name");
namedFunc("str", name: "name", number: 10);

 

required 파라미터(필수 파라미터 지정) 

int requiredFunc(String str, {required int number,  String name = ""}) {
  return 1;
}

//호출 방법
requiredFunc("str",number: 10);
requiredFunc("str", name: "name", number: 10);

 

 

typedef

typedef SumFunc = int Function(int x, int y);

int sumFunc(int x, int y) {
  return x + y;
}
int calc(int x, int y, SumFunc func) {
  return func(x, y);
}

//사용 방법
SumFunc sum = sumFunc;
print(sum(1,2));
print(calc(1,2,sum));

람다식(lambda)

(파라미터) => 리턴값

var func1 = (String str) => print(str);
func1("람다");

//확장형식
var func1 = (String str) {
    print(str);
    print(str);
    print(str);
    return 1;
};
func1("람다");



//typedef형식에도 람다 함수를 넣을 수 있다.
typedef SumFunc = int Function(int x, int y);
SumFunc sum = (int x, int y) => x + y;
print(sum(1,2));

enum

enum DocumentType {
  PICTURE,
  BLOG,
  NEWS
}

//사용
DocumentType docType = DocumentType.BLOG;

 

 

 

클래스

보통 파스칼 케이스를 사용한다

class HeyNow {}
class MyName {}

생성자

class Car {
  String name;
  // 1. 아무런 인자값이 없는 생성자
  HeyNow();
  // 2. 이름을 받아서 name변수를 초기화
  Car(this.name);
  // 3. Car.malibu()를 호출시 특정 값으로 초기화
  Car.malibu():
    this.name = "말리부";
  
  
  @override
  toString() {
    return name;
  }
  
}

//사용
Car car1 = Car();
Car car2 = Car("소나타");
Car mali = Car.malibu();

print(car2);
print(mali);

private클래스

// 앞에 언더바(_)를 붙이면 외부 파일에서 접근이 안됨
class _Car {

}

상속 & 메쏘드 재정의(override)

class Car {
  Car();
  void run() {
    print("슝슝");
  }
  void stop() {
    print("끽~");
  }
}

class Sonata extends Car {
  Sonata();
  @override
  void run() {
    print("슝슝슝슝");
  }
}

var myCar = Sonata();
myCar.run(); // 슝슝슝슝 출력

 

 

인터페이스(extends, implements)

// Interface는 class키워드를 그대로 사용한다
class ICar{
  String name;
  ICar(this.name);
  void run(){}
  void stop(){}
}

// implements 사용시 모든 인터페이스 내용을 구현해야 한다.
class Malibu implements ICar {
  String name;
  Malibu(this.name);
  
  void run() {
    print("달리자");
  }
  void stop() {
    print("정지");
  }
  
}

// extends 사용시 필요한 함수만 구현한다.
class Sonata extends ICar {
  
  Sonata(super.name);
  
  void run() {
    print("달리자");
  }
}

 

제네릭

class Car<T> {
  T item;
  Car(this.item);
  
}

class CarDic<K,V> {
  K key;
  V value;
  CarDic(this.key, this.value);
  
}

//사용

var myCar = Car<String>("Item");
var myCar2 = Car<int>(1);

var myCarDic = CarDic<String, int>("Item", 1);
var myCarDic2 = CarDic("Item", 1);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글