본문 바로가기
프로그래밍 언어/다트

다트 기초(C언어와의 차이점을 중심으로)

by seongjko 2023. 9. 3.
728x90

 

이 글은 제가 유일하게 아는 언어인 C언어와 구별되는 Dart의 특징적 개념만을 정리하였으므로
프로그래밍 자체가 처음이신 분들은 이해하기 어려울 수 있습니다.

 

dynamic type vs var type 

둘 다 데이터 타입을 명시적으로 지정하지 않고, 컴파일러가 할당된 값의 데이터 타입을 기반으로 타입을 추론하도록 한다.

이로써 코드를 간결하게 작성할 수 있는 장점이 있다.

그러나 var type으로 선언된 변수는 한 번 초기화했을 당시의 자료형만 계속 쓸 수 있다.

var name = 12;

// 위와 같이 integer로 초기화되어 있다면 
// name이라는 변수에는 string이나 bool 같은 자료형의 데이터는 저장할 수 없다.

name = 43;        [O]
name = 'string';  [X]
name = true       [X]

 

dynamic type은 초기화 당시와는 상관없이 아무 자료형이나 저장할 수 있다. 

dynamic name = 12;

// 위와 같이 integer로 초기화되어 있다면 
// name이라는 변수에 아무 자료형이나 막 들어갈 수 있다.

name = 43;        [O]
name = 'string';  [O]
name = true       [O]

 

 

 

Nullable & Non-nullable

어떤 type이든 type 끝에 물음표를 붙이면 그 type으로 선언된 변수에는 Null이 들어갈 수 있다는 뜻.

물음표가 없다면 그 type에는 Null이 들어갈 수 없음.

String? name = '블랙핑크'  //Nullable

String name = '블랙핑크'   //Non-nullable

 

tip.

Nullable type의 변수인데 이 변수를 사용할 때 뒤에 느낌표가 붙어 있으면

이 변수 안에는 Null이 들어가 있지 않다는 뜻.

String? name = '블랙핑크';

Print(name!);

 

즉, 정리하자면 

초기화할 때 type 뒤에 ?가 붙어 있다 -> 이 변수 안에 Null이 들어갈 수도?

변수를 사용할 때 변수 뒤에 !가 붙어 있다 -> 여기 안에 있는 건 Null일 수가 없음! 그럴 수가 없음!

 

 

 

final vs const

둘 다 변수 값을 한 번 선언하면 그 값을 다시 바꿀 수 없게 만든다.

final Const name = '에스파';

const String name = '블랙핑크';

 

그러나 값이 결정되는 타이밍에 큰 차이점이 있다.

final은 파일이 컴파일된 후 실행될 때 값이 결정되지만, const는 컴파일 당시에 값이 결정된다. 

const는 실행 파일이 만들어지는 과정에서 이미 고정되어 있는 값이기 때문에 실행 파일에서는 그 안의 값을 조작할 수 없다.

하지만 final은 실행될 때 값이 결정되기 때문에 실행 파일에서 그 값을 조작할 수 있다.

만약 프로그램이 실행될 때 final을 따로 할당하지 않는다면 원래 저장되어 있는 값이 그대로 확정된다.

 

하나의 예시만 더 살펴보자.

DateTime now = DateTime.now();

print(now);

DatetTime.now() 이 method는 코드가 실행이 되는 순간을 불러온다.

그러면 위의 코드에서 DateTime now 이 변수에는 final을 붙일 수 있을까?

실행파일이 실행되는 순간에 값이 결정이 되기 때문에 붙일 수 있다.

그럼 const는?

붙일 수 없다. 이미 고정되어 있는 값이기 때문에 runtime에 호출되는 DateTime.now() method가

힘을 쓸 수가 없다. 만약에 써버리면 에러를 뱉어버리기 때문에 안 된다.

 

 

연산자

C랑 거의 비슷하지만 몇 가지 차이점이 있다. 

 

후위 증가 연산을 하려면 한 칸씩 띄워줘야 한다.

number ++;
number --;

 

?? -> Null 병합 연산자 

좌변의 값이 Null이면 우변의 값을 내보낸다.

좌변의 값이 Null이 아니면 좌변의 값을 내보낸다.

String name;

print(name ?? "널이 아님");

 

is 연산자

변수의 데이터 타입을 확인하는 데 이용됨.

int number 1;

print(number is int);       //number는 int 자료형인가?
print(number is String);    //number는 String 자료형인가?

print(number is! int);      //number는 int 자료형이 아닌가?
print(number is! String);   //number는 String 자료형이 아닌가?

 

List

그냥 배열이다. index 쓰는 것도 c랑 똑같다. 

List<String> blackpink = ['제니', '리사'];

List<int> numbers = [1, 2, 3, 4, 5, 6];

 

배열 이름 뒤에 .을 찍으면 함수 리스트가 쭉 나오는데 그 함수들을 바로 적용시킬 수 있다.

List<String> blackpink = ['제나', '리사'];

print(blackpink.length);

blackpink.add('지수');

 

 

Enum

구조체랑 비슷한데 좀 다름 

상태를 저장하는 느낌? 잘 모르겠다.

enum TrafficLight {
  red,
  yellow,
  green,
}

void main() {
  TrafficLight currentLight = TrafficLight.red;

  if (currentLight == TrafficLight.red) {
    print("Stop");
  } else if (currentLight == TrafficLight.yellow) {
    print("Slow down");
  } else if (currentLight == TrafficLight.green) {
    print("Go");
  }
}

 

Positional parameter vs optional parameter vs named parameter

Positional parameter

함수에 들어가는 인자는 크게 두 가지로 구분되는데 

positional parameter는 함수를 사용할 때 반드시 줘야 하는 인자값이다. 안 주면 오류가 난다.

addNumbers(int x, int y, int z);

여기서 x, y, z는 모두 함수를 사용할 때 반드시 줘야 하는 인자값으로 positional parameter라고 할 수 있다.

 

Optional parameter

하지만 optional parameter는 함수를 사용할 때 줘도 되고 안 줘도 되는 인자값들이다.

addNumbers(int x, [int y, int z]);

대괄호 안에 들어간 y와 z는 꼭 없어도 된다.

addNumbers(1);
addNumbers(1, 2);
addNumbers(1, 2, 3);

위 세 가지 방식 중 어떻게 써도 상관이 없다. 

addNumbers(int x, [int y = 20, int z = 30]);

 

위와 같이 하면 y와 z가 안 들어왔을 경우 그냥 20이랑 30으로 처리하라는 이야기다. 

 

named parameter 

순서가 별로 중요하지 않다.

positional parameter는 인자의 위치에 따라 어떤 변수로 들어갈지가 정해지지만 

named parameter는 아래와 같이 처리한다.

addNumbers({
	required int x,
    required int y,
    required int z,
    })

이런 함수가 있으면 

addNumbers(y: 20, z: 10);

이런 식으로 name이 어떤 변수에 들어갈지를 결정해주기 때문에 위치가 중요하지 않다. 

 

Typedef

함수와 기능이 비슷하지만 Body가 없다.

간단한 함수를 편리하게 사용할 수 있는 기능이다.

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

int add(int x, int y, int z);

int sub(int x, int y, int z);

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

void main() {
	Operation operation = add;

	int result = operation(10, 20, 30);
	print(result);

	operation = sub;
	int result2 = operation(10, 20, 30);
	print(result2);

	int result3 = calculate(40, 50, 60 sub);
}

 

 

반응형

'프로그래밍 언어 > 다트' 카테고리의 다른 글

다트 클래스 사용법 기초  (0) 2023.09.06