[Dart] const와 final 공통점과 차이점? (flutter)

Flutter 개발을 하면서 가장 자주 마주치는 두 키워드가 바로 constfinal입니다. Dart에서 constfinal은 변수 선언 시 변경 불가능한 값을 정의하는 데 사용됩니다. 하지만 이 둘은 미묘한 차이점을 가지고 있고, 사용 목적과 상황에 따라 다르게 적용되어야 합니다. 이 글에서는 constfinal의 공통점과 차이점을 살펴보며, 각각을 언제 사용하는 것이 좋을지에 대해 다루겠습니다.

공통점

  1. 변경 불가
    constfinal로 선언된 변수는 한 번 값이 할당되면 이후에 변경할 수 없습니다. 즉, 불변성을 보장하는 변수 선언 방법입니다. 이 둘을 사용하면 변수가 이후 다른 값으로 재할당되지 않기 때문에 코드의 안정성을 높이고, 실수로 인한 버그 발생을 방지할 수 있습니다.

  2. 타입 지정 가능
    constfinal은 Dart의 모든 타입과 함께 사용할 수 있습니다. 기본 타입(int, double, String 등)뿐만 아니라 사용자 정의 객체에도 적용 가능합니다.

final int age = 25;
const String name = 'John';

차이점

  1. 초기화 시점
    final은 런타임에 값이 할당됩니다. 즉, 프로그램이 실행되는 동안 값을 할당할 수 있으며, 한 번 할당되면 변경할 수 없습니다. 반면, const는 컴파일 타임에 값이 결정되어야 합니다. 따라서 const로 선언된 변수는 완전히 불변해야 하며, 컴파일 시점에 값을 미리 알아야 합니다.

    예시:

    final DateTime now = DateTime.now();  // 런타임에 값이 할당됨
    const int x = 5;                      // 컴파일 타임에 값이 고정됨
    
  2. 상수 표현식
    const는 상수 표현식에서만 사용할 수 있습니다. 상수 표현식이란 컴파일 시점에 결정될 수 있는 표현식을 의미하며, const로 선언된 변수는 반드시 상수여야 합니다. 반면 final은 상수 표현식이 아니어도 사용 가능합니다. 예를 들어, const로는 DateTime.now()와 같은 함수 호출을 사용할 수 없지만 final은 가능합니다.

  3. 메모리 사용 방식
    const로 선언된 변수는 정적 메모리에 저장되며, 컴파일 시점에 한 번만 메모리에 로드됩니다. 따라서 여러 곳에서 동일한 const 변수를 사용하더라도 메모리에는 하나의 인스턴스만 존재합니다. 반면 final은 런타임에 할당되기 때문에 메모리 사용 방식이 다를 수 있습니다.

    예시:

    const listC1 = [1, 2, 3];
    const listC2 = [1, 2, 3];
    print(listC1 == listC2);  // true, 같은 인스턴스를 가리킴
    
    final listF3 = [1, 2, 3];
    final listF4 = [1, 2, 3];
    print(listF3 == listF4);  // false, 다른 인스턴스
    

언제 constfinal을 사용해야 할까?

  • 값이 컴파일 타임에 고정될 수 있을 때는 const를 사용하는 것이 좋습니다. 이렇게 하면 메모리 사용량이 줄고, 성능이 최적화될 수 있습니다.
  • 런타임에 결정되는 값을 저장해야 하거나, 계산에 따라 값이 변할 수 있는 경우에는 final을 사용하는 것이 적합합니다.

요약

특징constfinal
초기화 시점컴파일 타임런타임
상수 표현식반드시 상수 표현식이어야 함상수 표현식이 아니어도 가능
메모리 사용같은 값이면 메모리에서 한 번만 저장각각 다른 인스턴스로 저장될 수 있음
사용 시기컴파일 시점에 값이 고정될 수 있을 때 사용런타임에 값이 결정되거나, 변경되지 않을 값을 저장할 때

constfinal은 모두 Flutter 개발에서 효율적이고 안전한 코드 작성을 위해 매우 중요한 역할을 합니다. 이 둘의 차이를 잘 이해하고 적절하게 사용하는 것이 Flutter 앱의 성능과 유지보수성에 큰 도움이 될 것입니다.

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗