Dart는 구글이 앱을 위해 디자인한 프로그래밍 언어로, 크로스플랫폼 웹 프레임워크인 Flutter가 이 언어를 사용하고 있다. Flutter를 배우기 전에 먼저 Dart를 익혀보고자 한다.
void main() {
print('Hello world');
}
void main() {
for (int i = 0; i < 5; i++) {
print('Hello ${i + 1}');
}
}
void main() {
const name = 'Hello dart starter';
print(name);
}
이렇게 하면 다양하게 원하는 구문을 출력할 수 있다.
Dart는 다른 언어와도 마찬가지로 Camel case를 사용한다.
ex) yourName, numberCount, learningDartClass
여기서는 간단하게 변수의 사용을 살펴보고 다음 게시글에서 자세하게 다룰 예정이다.
숫자는 int, double 등을 사용하고, 문자열은 String 은 아래와 같이 사용한다.
변수 선언 후 다양한 방법으로 출력할 수 있다.
'' 내에서 사용할 때는 $를 붙여주면 된다.
void main() {
String name = 'Jang';
String level = 'Starter';
print(name + '은(는) ' + level + '입니다.');
print('$name은(는) $level입니다.');
print('${name + ' ' + level} 이다.');
}
Boolean 형태는 bool 이라고 명시하며, 아래와 같다.
void main() {
bool isTrue = true;
bool isFalse = false;
print(isTrue);
print(isFalse);
}
var와 dynamic type의 차이
void main() {
var name = 'hello dart';
print (name);
name = 1;
// Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//name = 1; ^
//Error: Compilation failed.
print(name);
}
var로 선언 후 다른 값을 대입하면 에러가 발생한다.
const와 마찬가지로 초기 선언된 값이 변경되지 않는다.
var로 타입을 변경하고 싶으면 초기값을 대입하지 않고 변수만 선언해서 사용하면 에러가 발생하지 않는다.
void main() {
var name;
name = 'hello dart';
print (name);
name = 1;
print(name);
}
void main() {
List langList = [
'Java',
'Javascript',
'Dart',
'Python',
];
print(langList);
// 타입을 지정한 List
List<String> varList = [
'String',
'const',
'bool',
'int',
'double'
];
// index 사용
print(varList[0);
}
void main() {
Map fruit = {
'Orange' : '오렌지',
'Apple' : '사과',
'Banana' : '바나나'
};
// 데이터 타입 지정
Map<String, String> fruit2 = {
'Orange' : '오렌지',
'Apple' : '사과',
'Banana' : '바나나'
};
//키와 값을 추가하기
fruit2.addAll({
'Strawberry' : '딸기'
});
//키를 이용해 값을 변경
fruit2['Apple'] = '사아과아';
//키를 이용해 삭제
fruit2.remove('Banana');
//키를 List 형태로 출력
print(fruit2.keys.toList());
//값을 List 형태로 출력
print(fruit2.values.toList());
}
final과 const 둘 다 한 번 값을 선언하면 변경할 수 없다.
void main() {
final name = '당근';
// 타입을 지정하고 final사용
final String name2 = '고구마';
// final은 변수의 값을 변경할 수 없다.
// const와 final의 차이
// final의 경우 runtime에 값이 지정되어도 상관없다.
// const는 build time에 반드시 값이 지정되어야 한다.
final now = new Date.now();
print(now);
const now2 = new DateTime.now();
print(now2);
//Error: New expression is not a constant expression.
//const now2 = new DateTime.now();
// ^^^
// Build Time에 값을 알 수가 없기 때문에 에러가 발생한다.
}
enum Status {
approved,
rejected,
pending,
}
void main() {
Status status = Status.approved;
switch(status){
case Status.approved:
print('승인');
break;
case Status.rejected:
print('거절');
break;
default:
print('---');
break;
}
}
void main() {
int number = 2;
if(number % 3 == 0){
print('3의 배수입니다.');
}else if(number % 4 == 0){
print('4의 배수입니다.');
}else{
print('어떤 배수인지 알 수 없습니다.');
}
switch(number % 3){
case 1:
print('나머지가 1');
break;
case 2:
print('나머지가 2');
break;
default:
print('???');
break;
}
}
void main() {
int total = 0;
List<int> numbersList = [1,2,3,4,5,8];
// for
for(int i = 0; i < numbersList.length; i++){
total += numbersList[i];
}
print(total);
// for in
for(int number in numbersList){
total += number;
}
print(total);
// while
while(total < 10){
total ++;
}
// do while
do {
print(total);
total++;
} while(total < 10);
void main() {
int total = 0;
// break
// use break in while
while(total < 20){
print(total);
if(total == 15) break;
total ++;
}
// use break in for
for(int i = 0; i < 20; i++){
print(i);
if(i == 15) break;
}
// continue
for(int i = 0; i < 20; i++){
// i가 15면 지나가기
if(i == 15) continue;
print(i);
}
}
void main() {
double res = linearExp(1, 2, 4);
print(res);
}
// doubel type으로 반환되는 클래스
//positional parameter : 위치 기반으로 값을 지정
double linearExp(double a, double b, double x){
return a * x + b;
}
void main() {
// parameter값 그대로 계산이 된다.
double res = linearExp(1, 2, 4);
print(res);
//b 값을 명시하지 않아도 default 값으로 계산이 된다.
double res2 = linearExp(1, 2);
print(res2);
}
// []안에 변수를 넣어주면 optional parameter가 된다.
// 2가 default 값인 optional parameter double b
double linearExp(double a, double x, [double b = 2]){
return a * x + b;
}
void main() {
double res = linearExp(1, 2, b: 4);
print(res);
}
// named parameter : parameter의 이름을 지정해줄 수 있다.
double linearExp(double a, double x, {double b}){
return a * x + b;
}
typedef는 함수를 미치 시그니처화해서 다양하게 응용하여 사용할 수 있다.
함수를 변수처럼 사용하는 것이 가능하다.
typedef FunctionName (parameter);
void main() {
calculate(1,2, add);
calculate(1,2, substract);
}
// int 2개를 받는 함수 선언
typedef Operation(int x, int y);
void add(int x, int y){
print('result : ${x + y}');
}
void substract(int x, int y){
print('result: ${x - y}');
}
void calculate(int x, int y, Operation oper){
oper(x, y);
}
void main() {
Intro intro = new Intro();
intro.sayName();
}
class Intro{
String name = 'jang';
void sayName(){
print('저는 ${this.name} 입니다.');
}
}
void main() {
Intro intro = new Intro('Jang');
intro.sayName();
Intro intro2 = new Intro('Wawa');
intro2.sayName();
}
class Intro{
final name;
Intro(
//받고 싶은 값
String name,
) : this.name = name;
void sayName(){
print('저는 ${this.name}입니다.');
}
}
void main() {
// 1.
Intro jang = new Intro('Jang', '100');
jang.sayName();
Intro wawa = new Intro('Wawa', '5');
wawa.sayName();
// 2. fromMap 사용하기
Intro jang2 = new Intro.fromMap({
'name': 'Jang',
'age' : '1000',
});
}
class Intro{
final name;
final age;
Intro(
//받고 싶은 값
String name,
String age,
) : this.name = name,
this.age = age;
// 생성자에 이름붙여서 사용하기
Intro.fromMap(
Map values,
) : this.name = values['name'],
this.age = values['group'];
void sayName(){
print('저는 ${this.name}이고 ${this.age}살 입니다.');
}
}