[Dart] final과 const 차이점 완벽정리

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를 적절하게 사용하면 코드의 가독성과 유지보수성을 높일 수 있습니다. 필요에 따라 적절한 키워드를 선택하세요! 😊