본문 바로가기

Dart

[Dart] final과 const의 차이점&정의를 알아봅니다.

반응형

Dart에서 Final과 const는 한번 설정한 값을 변경할 수 없게 한다는, 즉 상수를 보장해준다는 공통점이 있습니다. 하지만 이 상수를 선언하는 키워드가 두 가지라는 것은 분명 다른 부분이 있어서 입니다. 이번 시간에는 그 차이점을 알아봅니다. 

💡 참고 인스턴스 변수는 final 변수일 수 있지만 const는 아닙니다. 

인스턴스 변수로 final이 사용될 때 정확히 한번 설정해야 합니다. 선언 시 생성자 매개 변수를 사용하거나 생성자의 초기화 목록을 사용하여 final 인스턴스 변수를 초기화할 수 있습니다. 

//예시 코드
class Profile{
    final String name;
    final DateTime start = DateTime.now();

    ProfileMark(this.name);
    ProfileMark.unnamed(): name='';
}

final  개념

동적으로 메모리에 할당이라고 말합니다. 즉 컴파일 타임에는 변수할당을 하지 않고 런타임 시에 변수할당을 합니다. 

덕분에 컴파일 타임에서 확인할 수 없는 값들(예: DateTime.now())들을 변수에 할당할 수 있습니다. 

 

const 개념

컴파일 시에 변수선언이 이루어집니다. 덕분에 런타임시 특별히 할것없이 메모리에 할당되어 있는 값을 이용할 수 있어 효율적입니다. 

padding 값과 같이 재사용을 많이 하는 케이스라면 const가 유용합니다. 

 

코드 구현

final DateTime nowFinal = DateTime.now();
print(nowFinal);
const DateTime nowConst = DateTime.now();
print(nowConst);

// 현재 시간을 출력하는 DateTime class를 사용하면 두 키워드의 차이를 확실히 알 수 있습니다. 
// final 로 선언된 nowFinal은 잘 돌아가지만 const로 선언된 nowConst에는 아래와 같은 에러가 발생합니다.
// Const variables must be initialized with a constant value. (view docs)
// const 변수는 상수 값으로 초기화해야 합니다.

const는 컴파일 시에 값을 읽기 때문에 코드가 실행되어야 알 수 있는  DateTime.now()의 값을 알 수 없기 때문에 해당 에러가 발생합니다. 

 

추가 차이점 : 배열 선언 

배열을 선언하는 과정에서 또다른 차이점을 발견할 수 있습니다. 

final List<String> animals = [];
const List<String> drinks = [];
animals.add('dog');
/*
// compile error
drinks.add('Latte');
animals = ['dog'];
*/

languages는 final로 선언되어있은에도 불구하고 배열에 값을 추가할 수 있지만 const로 선언된 companies 배열은 값을 추가할 수가 없습니다. 대신 두 배열 모두 새로운 배열로 변경하는 것은 불가능합니다. 결국 final로 선언된 변수는 해당 변수에 새로운 값이 설정되는 것은 불가능하지만 객체나 배열에 값을 추가하는 행위에 대해서는 관여하지 않는다는 것을 알 수 있습니다. 

 

결론

역시 이유없이 만들어진 키워드들은 없는 것 같습니다. 모르고도 사용할 수 있지만 안다면 더 섬세한 코드를 만드는 데 도움이 될 것입니다. 

변수에 선언한 값을 변경하지 못하게 된다면 예기치 않은 상황에서 값이 변경되어 발생하는 문제들을 손쉽게 해결할 수 있을 것입니다.  

 

참고

https://velog.io/@unexpected-dev/final%EA%B3%BC-const

https://medium.com/dartlang-korea/dart-final-%EA%B3%BC-const-bc8c6c024ef4

https://dart.dev/guides/language/language-tour#final-and-const

https://negabaro.github.io/archive/flutter-dart-final__vs__const

 

반응형