flutter를 위한 dart 기본 문법 (1)
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개의 문법 포스팅을 할 예정입니다.
그 주제로는 객체 지향 프로그래밍, 함수형 프로그래밍, 비동기 프로그래밍으로 구성할 것입니다.
다시 한번 말씀드리지만 프로그래밍 언어를 처음 배우시는 분들에게는 맞지 않고, 다른 언어를 경험하신 분들이라면 이해하기 수월하실 겁니다.
감사합니다.