flutter/dart

flutter를 위한 dart 기본 문법 (1)

천뿌니 2022. 11. 30. 04:51
728x90

dart

flutter로 앱을 만들어보고 싶어서 dart 언어를 배워보겠습니다.

필자는 깊진 않지만 여러 프로그래밍 언어에 대한 경험(컴공)이 있기 때문에 순전히 필자의 기준으로 작성했으니 이 포스트는 프로그래밍 언어를 처음 배우시는 분에겐 맞지 않을 수 있으니 유의!!!

다른 언어를 배워본 경험이 있으신 분들은 가볍게 보시면 dart 문법 금방 아실 거라고 생각합니다.

**음슴체**


출력

String variable = "Dart";

print('text');

print(variable);

print('${variable} text');

print('$variable text');

 

타입

변수 : var
숫자(정수) : int
숫자(실수) : double
boolean(참/거짓) : bool
문자 : String (첫 대문자 필수)
변수 : dynamic

 

var은 선언에 따라 타입이 결정된다. 그러나 dynamic은 완전 자유, 할당에 따라 달라질 수 있음.
그럼 왜 dynamic로만 변수를 선언하지 않을까?
1. 예를 들어 정수로 사용되어야 할 변수가 문자열로 사용되는 오류가 발생 가능
2. 유지보수 측면에서 자신이나 타인이 봤을 때, 변수의 용도를 빨리 파악이 되지 않음

 

nullable(null이 될 수 있음) : ? - 타입 오른쪽 ? 삽입 

ex. String? name = null
non-nullable(null이 될 수 없음) : ! - 변수 오른쪽 ! 삽입

ex. name!

 

final, const : 선언 맨 앞에 값 변경 불가능, 타입 생략 가능(var 대체) 

ex. final/const String name -> final/const name

 

final VS const
final 은 컴파일/런타임 상황에 결정되는 값을 상수로 설정 가능, const 오직 컴파일 상황에서만 결정되는 값을 상수로 가능
즉, 어떤 시점에 상수가 설정되는지 차이.
예제) final(o)/const(x) DateTime now = DateTime.now(): -> DateTime은 런타임 시점에 설정됨.

 

컴파일? 런타임?
컴파일 - 우리가 작성한 코드를 컴퓨터가 이해하기 쉽게 기계어로 변환할 때
런타임 - 응용 프로그램이 화면에 띄어질 때

 

타입 알려면?

print(variable.runtimeType)

 

 

operator

++, --, +=, -=, *=, /=,??=(해당 변수가 null이면 오른쪽 값으로 바꿔라)
>, <, >=, <=, ==, !=
is or is! - 타입 확인

ex) print(variable is int/String 등등), print(variable is! int/String 등등)
&&(and), ||(or)

 

 

list

List<type> variable = [value1, value2 ...];

인덱스 접근 가능 : variable[0], variable[1], variable[2]...

리스트 길이 : variable.length
리스트 value 추가 : variable.add(value)
리스트 value 삭제 : variable.remove(value)
리스트 value 인덱스 확인 : variable.indexOf(value)

 

 

map(파이썬 딕셔너리와 유사)

Map<type, type> variable = {
    key1 : value1,
    key2 : value2,
};


map value 추가 : variable.addAll({ key : value, }); or variable[key] = value
map value 삭제 : variable.remove(key)
map key 확인 : variable.keys
map value 확인 : variable.values

 

 

set(list와 유사 but 중복 허용 안됨)

Set<type> variable = { value1, value2, value3 ... }

set value 추가 : variable.add(value)
set value 삭제 : variable.remove(value)
set안에 value가 포함되어 있는지 확인 : variable.contains(value)

 

 

if문(if, if-else, if-else if-else)

if(조건){
	실행문
}else if(조건){
	실행문
}else{
	실행문
}

 

 

switch문

switch(조건){
	case 조건에 해당하는 값:
		실행문
		break
	case 조건에 해당하는 값:
		실행문
		break
	default:
		실행문
		break
}

 

 

for loop

for(초기값, 조건, operator){
	실행문
}

ex) 
List<int> numbers = [1,2,3,4,5,6]
for(int i =0; i<numbers.length; i++){ 	
}
for(int num in numbers){
}

 

 

while, do while

while(조건){
	실행문
}

do{
	실행문
}while(조건)

 

** break, continue도 반복/조건문과 같이 사용 **

 

 

enum

해당 타입만 사용하게 강제, 오타 방지

enum Status{
  approved,
  pending,
  rejected,
}

void main() {
  Status status = Status.pending;
  
  if(status == Status.approved){
    print("승인입니다.");
  }else if(status == Status.pending){
    print("대기입니다.");
  }else{
    print("거절입니다.");
  }
}

 

 

function

1) no parameter / argument

void main() {
  addNumbers();

}
// 세개의 숫자 (x,y,z)를 더하고 짝수인지 홀수인지 알려주는 함수
addNumbers(){
  int x = 10;
  int y = 20;
  int z = 30;

  int sum = x + y + z;
  
  if(sum % 2 == 0){
    print('짝수입니다.');
  }else{
    print('홀수입니다.');
  }
}

 

2) positional parameter(순서가 중요한 파라미터)

void main() {
  addNumbers(10, 20, 30);

}
// 세개의 숫자 (x,y,z)를 더하고 짝수인지 홀수인지 알려주는 함수
addNumbers(int x, int y, int z){
  int sum = x + y + z;
  
  if(sum % 2 == 0){
    print('짝수입니다.');
  }else{
    print('홀수입니다.');
  }
}

 

 

3) optional parameter(있어도 되고 없어도 되는 파라미터) - [ ] 사용

void main() {
  addNumbers(10); -> result 40
  addNumbers(10, 50, 70); -> 초기 값 무시 -> result 130
}
// 세개의 숫자 (x,y,z)를 더하고 짝수인지 홀수인지 알려주는 함수
addNumbers(int x, [int y = 10, int z = 20]){
  int sum = x + y + z;
  
  if(sum % 2 == 0){
    print('짝수입니다.');
  }else{
    print('홀수입니다.');
  }
}

 

 

4) named parameter - 이름이 있는 파라미터 (순서가 중요하지 않다.)

void main() {
  addNumbers(x: 10, y: 20, z: 30); - 파라미터 전달 방식이 다름, variable : value
  
  addNumbers(z: 10, x: 20, y: 30); - 순서가 바껴도 괜찮
}

// 세개의 숫자 (x,y,z)를 더하고 짝수인지 홀수인지 알려주는 함수
addNumbers({
  required int x,
  required int y,
  required int z,
}){
  int sum = x + y + z;
  
  if(sum % 2 == 0){
    print('짝수입니다.');
  }else{
    print('홀수입니다.');
  }
}

 

 

4-1) 그럼 named parameter에서 optional parameter는?

void main() {
  addNumbers(x: 10, y: 20); -> z 제외 가능
  
  addNumbers(z: 10, x: 20, y: 30);
}

// 세개의 숫자 (x,y,z)를 더하고 짝수인지 홀수인지 알려주는 함수
addNumbers({
  required int x,
  required int y,
  int z = 10,  -> required를 제외하고 초기 값 설정
}){
  int sum = x + y + z;
  
  if(sum % 2 == 0){
    print('짝수입니다.');
  }else{
    print('홀수입니다.');
  }
}

 

 

5) 반환 값이 있는 함수

void main() {
  int num1 = addNumbers(10, y: 20, z: 30);
  int num2 = addNumbers(10, z: 10, y: 30);
  int sum = num1 + num2;
  print(sum);
}

// 세개의 숫자 (x,y,z)를 더하고 짝수인지 홀수인지 알려주는 함수
int addNumbers(int x, {   --> positional parameter 추가
  required int y,
  int z = 30,
}){
  int sum = x + y + z;
  return sum;
}

 

 

6) arrow function - 화살표 함수

void main() {
  int num1 = addNumbers(10, y: 20, z: 30);
  int num2 = addNumbers(10, z: 10, y: 30);
  int sum = num1 + num2;
  print(sum);
}
int addNumbers(int x, {
  required int y,
  int z = 30,
}) => x + y + z;

 

 

7) typedef 

시그니처와 함께 함수를 좀 더 유연하게 다룰 수 있다.

void main() {
  Operation operation = add;

  int result = operation(10, 20, 30);
  
  print(result);
  
  operation = subtract;
  
  int result2 = operation(10, 20, 30);
  
  print(result2);
  
  int result3 = calculate(30, 40, 50, add);
  
  print(result3);
  
  int result4 = calculate(30, 40, 50, subtract);
  
  print(result4);
}

// signture
typedef Operation = int Function(int x, int y, int z);

// 더하기
int add(int x, int y, int z) => x + y + z;

// 빼기
int subtract(int x, int y, int z) => x - y - z;

int calculate(int x, int y, int z, Operation operation){
  return operation(x,y,z);
}

 


이번 포스팅은 dart 기본 문법에 대해 알아보았습니다. 추가로 3개의 문법 포스팅을 할 예정입니다.

그 주제로는 객체 지향 프로그래밍, 함수형 프로그래밍, 비동기 프로그래밍으로 구성할 것입니다.

다시 한번 말씀드리지만 프로그래밍 언어를 처음 배우시는 분들에게는 맞지 않고, 다른 언어를 경험하신 분들이라면 이해하기 수월하실 겁니다. 

감사합니다.