반응형
다트언어는 플루터 앱들을 만드는데 사용됩니다. 제가 몇가지 언어를 배웠는데 다트언어는 그 중 여러 언어의 장점들만 모아놓은 느낌이 듭니다. 물론 다른 언어보다 최근에 나온 언어이기 때문에 가능하다고 생각됍니다.
그럼 다트언어가 어떠한 장점이 있는지 다른언어에 비해서 어떤점이 좋은지 확인해 봅시다.!
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);
반응형
'[개발] 이야기 > [Flutter] 이야기' 카테고리의 다른 글
[flutter] 플러터에 구글 애드몹 (광고)붙이기 android, ios 적용방법 (0) | 2023.08.28 |
---|---|
플루터의 장점/속도/편리함 - 이렇게 편하게(빠르게) 앱, 웹, 데스크탑 개발을 코드 하나로 할수 있다 (0) | 2023.08.27 |
[flutter] 플러터 FutureBuilder, StreamBuilder 비동기 사용법 이론 간단 정리 (0) | 2023.02.02 |
[flutter] 비디오 재생하는 방법 - 외부 플러그인 사용, ViodeoPlayer (0) | 2023.02.01 |
[flutter] 버튼 눌림(클릭) 효과 주기 - 스타일 변경 (0) | 2023.02.01 |
댓글