Dart 변수 값 변경: 재할당과 Flutter 상태 업데이트

핵심 요약
변수 재할당과 화면 갱신은 별개이며, Flutter에서는 값이 바뀐 뒤 상태 변경을 프레임워크에 알려야 UI가 다시 그려집니다.

검수 범위
Dart 대입 연산과 Flutter 상태 갱신을 한 개념처럼 설명하던 부분을 분리해 검수했습니다.

Flutter로 어플로 만들 때 변수 값 변경이 왜 필요할까요? 변수 값 변경이 불가능한 경우, 변수의 양은 기하급수적으로 늘어나고, 일일이 변수 코드를 작성해야 하기 때문입니다. 이번 글에서 변수 값 변경하는 방법에 대해 자세히 알아보겠습니다.

변수값 바꾸는 방법

Dart(Flutter)에서 변수값을 바꾸는 방법은 간단합니다. 변수에 새 값을 “대입”하면 값이 바뀌죠. 대입은 =로 표현하고, 이미 선언된 변수에 다시 대입하는 것을 보통 재할당이라고 부릅니다.

가장 기본: 재할당으로 바꾸기

한 번 선언한 변수는 이후에 var를 다시 쓰지 않고, 변수명에 새 값을 대입해 바꿉니다.

var x = 1;  // 선언 + 초기값
x = 2;      // 값 변경(재할당)
x = 3;      // 값 변경(재할당)

첫 줄에서 x라는 변수를 만들고 1을 넣습니다. 그 다음 줄들은 x에 들어있는 값을 각각 2, 3으로 덮어쓰기합니다. var처음 선언할 때만 쓰고, 이후에는 x = ...만 쓰면 됩니다.

var x = 1;
x = 2;     // OK
x = "a";   // 오류: int 변수에 String 대입 불가

 var x = 1;에서 초기값이 정수이므로 xint로 확정됩니다. 그래서 이후에는 int만 넣을 수 있습니다. 타입이 다른 "a"를 넣으면 컴파일 오류가 납니다.

기존 값을 이용해서 바꾸기

값을 “교체”하는 것뿐 아니라, 현재 값에 기반해서 새 값을 계산해 넣는 방식도 매우 흔합니다.

var count = 0;

count = count + 1; // 1 증가
count = count - 1; // 1 감소

count = count + 1;은 “현재 count 값에 1을 더한 결과를 다시 count에 넣어라”라는 뜻입니다. 즉, 현재 값 기반으로 새 값을 계산한 뒤 다시 대입하는 패턴입니다.

var count = 0;

count += 1;  // count = count + 1
count -= 2;  // count = count - 2

실무에서는 축약 연산도 자주 씁니다. +=는 “더해서 다시 넣기”, -=는 “빼서 다시 넣기”를 짧게 쓴 표현입니다.

조건에 따라 바꾸기 (if / switch)

어떤 상황에서는 “조건이 맞을 때만” 변수값이 바뀌어야 합니다. 이때 조건문을 사용합니다.

var score = 50;

if (score < 60) {
  score = 60; // 합격 처리
}

score < 60이 참일 때만 중괄호 안이 실행됩니다. 즉 점수가 60 미만이면 강제로 60으로 바꾸고, 60 이상이면 아무 일도 일어나지 않아 값이 유지됩니다.

반복하면서 바꾸기 (for / while)

반복문 안에서 재할당하면 “여러 번” 값이 바뀝니다. 합계, 카운트, 상태 갱신에 자주 사용됩니다.

var sum = 0;

for (var i = 1; i <= 5; i++) {
  sum = sum + i; // 반복마다 값이 바뀜
}
// sum == 15

i가 1부터 5까지 변하는 동안, 매번 sumi를 더한 값을 다시 sum에 넣습니다. 결과적으로 sum1+2+3+4+5가 누적되어 15가 됩니다.

함수 결과로 바꾸기 (계산/가공한 값을 넣기)

값을 직접 쓰지 않고, 함수가 반환한 결과로 변수를 바꾸는 패턴입니다.

int discount(int price) {
  return (price * 0.9).toInt();
}

var price = 10000;
price = discount(price); // 9000으로 변경

discount(price)는 할인된 금액을 계산해 반환합니다. price = discount(price);는 “할인 계산 결과를 다시 price에 넣어서 가격을 갱신하라”라는 의미입니다. 즉, 함수의 결과로 변수값을 업데이트합니다.

비동기 결과로 바꾸기 (await / Future)

네트워크 요청, DB 조회처럼 “나중에 결과가 도착”하는 작업은 await 결과로 값을 바꿉니다.

Future<int> fetchCount() async {
  await Future.delayed(const Duration(seconds: 1));
  return 10;
}

var count = 0;

Future<void> load() async {
  count = await fetchCount(); // 나중에 10으로 변경
}

fetchCount()는 1초 뒤에 10을 반환한다고 가정한 함수입니다. await fetchCount()는 “결과가 올 때까지 기다린 뒤 그 결과를 받는다”는 뜻이고, 그 결과를 count에 대입하므로 시간이 지난 뒤에 count가 바뀝니다.

이벤트가 발생했을 때 바꾸기 (버튼/입력 등)

Flutter에서는 사용자의 행동(클릭/입력/탭 등)이 변수값을 바꾸는 가장 대표적인 트리거입니다.

var count = 0;

void onPressed() {
  count = count + 1; // 버튼 클릭 시 값 변경
}

onPressed()는 보통 “버튼이 눌렸을 때 호출되는 함수”입니다. 즉, 사용자가 버튼을 눌렀을 때만 실행되고 그때 count가 1 증가합니다. 이벤트가 없으면 함수도 실행되지 않으니 값도 바뀌지 않습니다.

실패했을 때 다른 값으로 바꾸기 (try/catch)

실패 가능성이 있는 로직이라면, 실패했을 때 “대체값”으로 바꾸는 방식이 실전에서 많이 쓰입니다.

var result = 0;

try {
  // 실패할 수 있는 로직
  throw Exception("fail");
} catch (e) {
  result = -1; // 실패 시 대체값으로 변경
}

try 블록에서 예외가 발생하면 catch로 넘어갑니다. 이 예시는 강제로 예외를 발생시키고 있으므로 catch가 실행되어 result-1로 바꿉니다. 즉, 실패 시 대체값으로 변수값을 갱신하는 패턴입니다.

재할당 없이도 “바뀌는 것처럼 보이는” 경우

변수에 새 값을 대입하지 않았는데도 값이 바뀐 것처럼 느껴질 때가 있습니다.
그건 보통 변수 자체가 아니라, 변수가 가리키는 객체 내부가 변경된 경우입니다.

var list = [1, 2];

list.add(3);  // list에 재할당은 없지만, 내부 요소가 추가됨

이 코드는 list = ...처럼 재할당을 하지 않습니다. 대신 list가 가리키는 리스트 객체의 내부에 3을 추가합니다. 즉 “변수에 새 값을 넣은 것”이 아니라 객체 내부 상태가 변경된 것입니다. 초보자 입장에서는 “값이 바뀐 것처럼” 보이기 때문에 재할당과 구분이 필요합니다.

변수 변경 못하는 함수 (final / const)

변수값을 바꾸려면 기본적으로 재할당이 가능해야 합니다. finalconst는 재할당이 금지됩니다.

final x = 1;
x = 2; // 오류: final은 한 번만 대입 가능

final은 “한 번만 값 대입 가능”이라서 두 번째 대입(재할당)이 금지됩니다.

const y = 1;
y = 2; // 오류: const는 컴파일 타임 상수

const는 컴파일 시점에 확정되는 상수라 재할당이 불가능합니다.

결론

Flutter 앱은 실행 중에 화면과 상태가 계속 변합니다. 버튼을 누르면 숫자가 올라가고, 입력값이 바뀌면 UI가 갱신되며, 서버 응답이 오면 데이터가 업데이트됩니다. 이 변화를 표현하는 가장 기본적인 수단이 “변수값 변경(대입/재할당)”입니다. 변수값을 바꿀 수 없다면 동일한 목적을 위해 매번 새로운 변수를 추가로 만들어야 하고, 그만큼 코드가 복잡해지며 유지보수가 어려워집니다. 따라서 Dart에서 재할당, 조건/반복 기반 변경, 함수/비동기 결과 반영, 이벤트 처리, 예외 시 대체값 설정, 객체 내부 변경과 재할당의 구분까지 이해해두면 Flutter에서 상태 관리와 UI 업데이트 흐름을 훨씬 안정적으로 설계할 수 있습니다.


검증 기준과 참고 자료

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

관련 글