Dart는 Google이 개발한 프로그래밍 언어로, Flutter 프레임워크에서 널리 사용됩니다. Dart에서 불변(immutable) 데이터를 다룰 때 final과 const 키워드를 사용할 수 있습니다. 이 둘은 비슷하지만 중요한 차이점이 있습니다. 이번 글에서는 final과 const의 차이를 명확하게 정리하고, 언제 어떤 키워드를 사용해야 하는지 살펴보겠습니다.
1. final과 const의 공통점
final과 const 키워드는 모두 변수의 값을 변경할 수 없도록 합니다. 즉, 한 번 값이 할당되면 다시 변경할 수 없습니다.
final int x = 10;
const int y = 20;
// x = 30; // 오류 발생 (final 변수 변경 불가)
// y = 40; // 오류 발생 (const 변수 변경 불가)
2. final과 const의 차이점
값 변경 가능 여부 | 불가능 | 불가능 |
컴파일 시점 상수 여부 | 아님 | 맞음 |
객체 생성 시점 | 런타임 | 컴파일 타임 |
리스트, 맵 등의 요소 변경 | 가능 | 불가능 |
사용 예시 | 네트워크 호출, 사용자 입력 등 | 수학적 상수, 변하지 않는 값 |
2.1 컴파일 타임 상수 여부
- final 변수는 런타임에 값을 결정할 수 있지만, const 변수는 반드시 컴파일 타임에 값을 정해야 합니다.
- 예를 들어, 아래 코드는 final에서는 동작하지만 const에서는 오류가 발생합니다.
final DateTime now = DateTime.now(); // 가능
const DateTime now = DateTime.now(); // 오류 발생 (컴파일 타임에 결정 불가능)
DateTime.now() 함수는 DateTime.now() 함수가 실행되는 순간의 날짜 및 시간을 제공해줍니다.
다시 말해 런타임, 즉 실행을 해봐야 값을 알 수 있다는 뜻입니다. 반면에 const를 사용하면 에러가 납니다.
const로 지정한 변수는 빌드 타임에 값을 알 수 있어야하는데 DateTime.now() 함수는 런타임에 반환되는 값을 알 수 있기 때문입니다. 코드를 실행하지 않은 상태에서 값이 확정되면 const, 실행될 때 확정되면 final을 사용하세요.
2.2 객체 생성 시점 차이
- final은 런타임에 값이 할당될 수 있지만, const는 반드시 컴파일 타임에 값을 결정해야 합니다.
- final 변수에 할당된 객체는 프로그램 실행 시마다 새로운 인스턴스를 생성할 수 있습니다.
class Person { final String name; const Person(this.name); // const 생성자 } void main() { final p1 = Person("Charlie"); final p2 = Person("Charlie"); print(p1 == p2); // false (서로 다른 인스턴스 생성) }
- 같은 값을 가지는 const 객체는 캐싱되어 재사용됩니다
class Person { final String name; const Person(this.name); // const 생성자 } void main() { const p3 = Person("Charlie"); const p4 = Person("Charlie"); print(p3 == p4); // true (같은 객체 참조) }
2.3 리스트, 맵 등의 요소 변경 가능 여부
- final 키워드는 변수 자체를 변경할 수 없지만, 리스트나 맵 같은 컬렉션의 내부 요소는 변경할 수 있습니다.
- const 키워드는 변수뿐만 아니라 내부 요소도 변경할 수 없습니다.
final List<int> finalList = [1, 2, 3]; const List<int> constList = [4, 5, 6]; finalList[0] = 100; // 가능 // constList[0] = 200; // 오류 발생 (const 리스트는 변경 불가)
3. 언제 final과 const를 사용할까?
3.1 final을 사용해야 하는 경우
- 런타임에 값이 결정될 때
- 네트워크 요청 결과, 사용자 입력 데이터 등 변경할 수 없는 값
- 변경이 필요하지 않은 객체
void main() { final DateTime now = DateTime.now(); print(now); }
3.2 const를 사용해야 하는 경우
- 항상 변하지 않는 값(수학 상수, UI에서 고정된 값 등)
- 컴파일 타임에 결정되는 상수값
const pi = 3.141592; const apiUrl = "https://example.com";
4. 결론
- final과 const 모두 변하지 않는 데이터를 정의하는 데 사용되지만, 주요 차이점은 컴파일 타임 상수 여부입니다.
- final은 런타임에 값이 결정될 수 있지만, const는 반드시 컴파일 타임에 값이 정해져야 합니다.
- 리스트와 같은 컬렉션을 사용할 때 final은 내부 요소를 변경할 수 있지만, const는 완전히 불변입니다.
final과 const를 적절하게 사용하면 코드의 가독성과 유지보수성을 높일 수 있습니다. 필요에 따라 적절한 키워드를 선택하세요! 😊