Dart var·final·const 차이: 변수 선언 기준과 예제

핵심 요약
재할당이 필요하면 var 또는 명시 타입, 런타임에 한 번 정해지면 final, 컴파일 시점 상수라면 const를 선택합니다.

검수 범위
final 객체 내부 변경과 const 표현식의 차이를 포함해 초보자가 자주 혼동하는 선언 규칙을 검수했습니다.

Flutter로 어플 만드는 것 생각 중이시죠? 키워드인 var, final, const로 변수 선언 하는 방법부터 배우셔야 합니다. 아래 글을 읽고 어플 만들기 첫걸음을 디뎌보죠.

Flutter 변수 선언 방법

Flutter 앱을 만들 때 가장 먼저 익혀야 하는 것 중 하나가 “변수 선언”입니다. Dart에서는 변수를 선언할 때 보통 아래 형태를 사용합니다.

키워드 + (타입) + 변수명 = 값;

여기서 키워드는 주로 var, final, const를 의미합니다. 세 키워드는 “값을 바꿀 수 있는지”와 “값이 언제 결정되는지”에서 차이가 나므로, 이 차이만 정확히 잡아두면 이후 문법이 훨씬 쉬워집니다.

var: 타입 추론 + 값 변경 가능

var는 초기값을 보고 타입을 자동으로 추론하도록 할 때 사용합니다. 또한 var로 선언한 변수는 같은 타입의 값으로 재할당(변경) 이 가능합니다.

핵심은 var를 쓸 때 타입을 같이 쓰지 않는다는 점입니다. var 자체가 타입 추론을 의미하므로, 뒤에 타입을 붙이면 문법 오류가 됩니다.


var a = 10;

위와 같이 작성하는 경우 변수명 a는 int로 추론되고, 값은 10으로 결정되는 것이죠. 이 값은 언제든지 바뀔 수 있습니다. 하지만 var는 한 번 타입이 추론되면 다른 타입으로 변경 불가합니다.


var a = 10;  // a는 int로 추론됨
a = 20;      // 같은 int이므로 재할당 가능

var a = 10;
a = "hello"; // 오류: a는 int로 추론되었기 때문에 String 대입 불가

final: 한 번만 대입

final딱 한 번만 값이 들어갈 수 있는 변수입니다. 즉, 초기화(대입) 이후에는 재할당이 불가능합니다.

const와의 가장 큰 차이는 final앱 실행 중(런타임)에 계산된 값으로도 초기화가 가능하다는 점입니다. 대표적으로 사용자 입력처럼 실행 중에 값이 정해지는 경우에 사용합니다.


final int b = int.parse(userInput);

위처럼 코드를 입력하면, 어플을 시작하고, 어플 사용자가 입력하는 숫자가 b의 값으로 결정되고, 이후에 변경이 불가합니다. 아래와 같이 코드를 입력하는 경우 오류가 뜨는 것이죠. 


final int b = int.parse(userInput);
// b = 30; // 오류: final 변수는 재할당 불가

추가로 중요한 점이 있습니다. final은 “변수에 다른 값을 다시 대입(재할당)”하는 것을 막는 것이지, 객체 내부가 바뀌는 것까지 무조건 막는 것은 아닙니다. 예를 들어 리스트처럼 내부 수정이 가능한 타입이라면, 리스트 자체를 바꾸지는 못해도 내부는 아래와 같이 변경될 수 있습니다.


final list = <int>[1, 2];
list.add(3); // 가능: list 자체를 다른 값으로 재할당하는 게 아니라 내부를 수정

const: 컴파일 타임 상수(실행 전에 값이 확정)

const컴파일 시점(빌드 시점)에 값이 확정되는 상수입니다. 즉, 코드가 실행되기 전에 이미 값이 결정되어 있어야 합니다.


const int c = 30;

따라서 아래와 같이 사용자가 입력하는 코드는 작성이 불가합니다.


const int c = int.parse(userInput); // 오류: 컴파일 타임에 결정 불가

final vs const 차이 정리

  • final : 한 번만 대입 가능. 어플 실행 중 값 결정

  • const : 컴파일 타임 상수, 어플 실행 전 값 결정

결론

Dart에서 변수 선언은 var, final, const의 차이를 정확히 구분하는 것부터 시작합니다. 값이 바뀔 가능성이 있고 타입 추론을 활용하고 싶다면 var를 사용하되, var와 타입을 함께 쓰면 문법 오류가 나므로 둘 중 하나만 선택해야 합니다. 실행 중에 한 번 정해진 뒤 바뀌면 안 되는 값이라면 final이 적합하며, 사용자 입력이나 실행 중 계산 결과처럼 런타임에 결정되는 값도 담을 수 있습니다. 반대로 앱 실행 이전(빌드 시점)에 이미 확정되어 있어야 하는 진짜 상수는 const를 사용해야 하며, int.parse(userInput)처럼 런타임 값이 필요한 표현식은 const로 만들 수 없습니다. 실무에서는 “변경 가능성”과 “결정 시점(런타임/컴파일 타임)”을 기준으로 선택하면 실수가 크게 줄어듭니다.

선택 순서를 코드로 확인하기

선언 키워드를 고를 때는 먼저 값이 다시 대입되는지 묻습니다. 다시 대입되지 않지만 실행 중 계산되는 값이면 final, 컴파일 전에 확정되는 상수 표현식이면 const를 사용합니다. 다시 대입해야 한다면 타입이 초기값에서 분명할 때 var, 공개 API나 복잡한 데이터 경계에서는 명시 타입을 검토합니다.

final로 선언한 List는 변수에 다른 List를 다시 넣지 못하게 할 뿐 add() 같은 내부 변경까지 막지는 않습니다. 반대로 const 컬렉션은 런타임 변경을 허용하지 않습니다. 이 차이를 모르고 final을 ‘완전 불변’으로 설명하면 상태 변경 버그를 놓칠 수 있으므로 변수 재할당과 객체 내부 변경을 따로 테스트해야 합니다.


검증 기준과 참고 자료

이 글은 2026-09-08에 아래 공식 문서와 공개 기술 문서를 기준으로 내용과 용어를 다시 검수했습니다. 제품 버전과 기기 제조사에 따라 화면 이름은 달라질 수 있으므로 실제 화면과 공식 문서를 함께 확인하세요.

관련 글

댓글은 닫혔습니다.