brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Feb 27. 2020

다트 주석, 타입, 변수, 상수

플러터를 위한 다트 프로그래밍

다트의 주석, 타입, 변수, 상수

다트의 주석, 변수, 상수, 타입은 다른 프로그래밍 언어와 거의 유사한 형태이다. 따라서 새롭거나 어려운 내용은 없다.


1. 주석(comment)

다트 주석은 다른 언어와 큰 차이가 없다.


// 내용 : 한 줄 주석

/* 내용 */ : /*와 */ 사이의 모든 내용 주석



2. 타입(type)

다트에서 제공하는 내장 타입(built-in type)은 다음과 같다. num, var, dynamic을 제외하면 대부분의 언어에서 사용하는 것과 유사하다. num, var, dynamic은 변수를 소개하면서 특징을 살펴볼 것이다.


3. 변수(variable)

변수를 선언하고 초기화하는 기본 형태는 다음과 같다.


타입 변수명 = 초깃값;

ex) String lastName = 'Seo';

       String firstName = "Junsu";


다트의 변수는 참조(reference)를 저장한다. 위의 lastName 변수는 Seo이라는 값을 가진 String 객체에 대한 참조를 가지는 것이다. lastName처럼 ' '(작은따옴표)로 문자열을 묶어도 되고 firstName처럼 " "(큰따옴표)로 묶어도 된다.


lastName 변수는 String이라고 타입을 명시적으로 지정해주었다. 하지만 var 타입을 사용하여 타입을 지정하지 않을 수 있다. var 타입 사용 시 초깃값을 참고하여 해당 변수의 타입을 추론한다.


var balance = 1000;


balance 변수는 1000이라는 정수형 타입을 값으로 가지고 있다. 따라서 int 타입인 것으로 추론할 수 있다. 이렇게 int 타입으로 초기화된 balance 변수는 다른 타입을 값으로 가질 수 없다.


balance = '천'; // error


그런데 이 상태에서 balance 변수에 문자열을 넣어야 할 일이 있다면 어떻게 해야 할까? 바로 타입 변경이 가능한 dynamic 타입을 사용하면 된다. (또는 최상위 클래스인 Object를 사용해도 된다.)


dynamic balance = 1000;

balance = '천';

또는

Object balance = 1000;

balance = '천';


간단한 다음 예제를 통해서 확인이 가능하다.


var는 가독성이 떨어지고 실수를 유발할 가능성이 높기 때문에 초보자는 가급적 명시적으로 타입을 선언하는 것이 좋을 것 같다.


만약 아래 예제와 같이 초기화를 늦게 하는 경우라면 변수 선언부에서 타입이 뭔지 알 수가 없다. 또한 어떤 목적으로 처음에 선언했는지 혼란스러울 수도 있다. (var 타입이 유용한 사례 제보받습니다.)


num은 int와 double의 상위 타입이다. 따라서 num 타입은 int와 double 모두 참조 가능하다. 그러나 int와 double은 서로 참조할 수 없다. 보통 더 큰 범위를 가지는 double에 int가 할당되는데 다트에선 안된다.


num a = 10;

int b = 20;

double c = 1.2;

a = b;

a = c;


b=c; // error

c=b; // error



4. 상수

상수와 변수의 가장 큰 차이는 값의 변경 유무다. 변수는 값을 바꿀 수 있지만 상수는 값을 바꿀 수 없다. (값이 변경되지 않는 것은 리터럴도 마찬가지다. 리터럴과 상수의 차이는 리터럴은 값 그 자체이고 상수는 그 값을 가진 후 값이 변경되지 않는 변수이다.)


상수는 결국 값을 바꿀 수 없는 변수이다. 그러면 변수가 값을 바꾸지 못하게 하려면 어떻게 해야 할까? 두 가지 방법이 있다.


1) final


final int PRICE = 1000; // 1000은 리터럴

final NAME = 'Kim'; // 타입 생략 가능

PRICE = 2000; // error



2) const


const int PRICE = 1000;

const NAME = 'Kim'; // 타입 생략 가능

PRICE = 2000; // error


다음 예제와 같이 타입을 생략해도 정상적으로 동작한다.


그렇다면 final과 const는 무슨 차이가 있는 걸까? const는 컴파일 시점에 상수가 된다. 이게 어떤 차이를 만드냐면 다음과 같은 경우에 문제가 된다.

final은 런타임에 상수화 되기 때문에 실행 시 get() 함수에서 가져온 값으로 설정이 가능하다. 하지만 const는 이미 컴파일 시점에 상수화 되었기 때문에 런타임 시 get() 함수에서 가져온 값을 넣으려고 하면 에러가 발생한다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari