플러터로 앱을 개발하다 보면, 안드로이드 스튜디오에서 위젯 앞에 const를 붙이라는 제안을 종종 받을 수 있다. 자꾸 뜨는 노란 밑줄이 왜 강조되는지, 그 이유와 함께 const와 static const의 활용법을 알아보았다.
dart 공식문서 참조
https://dart-ko.dev/language/variables
"컴파일 타임 상수인 변수를 생성할 때 const를 사용하세요. 클래스 레벨의 상수 변수라면 static const로 선언하세요." (공식 문서 참조)
const로 선언된 객체는 컴파일 타임에 상수로 평가되며, 프로그램 실행 중 동일한 값을 가지는 다른 const 객체들이 동일한 인스턴스를 참조하게 된다. 이를 통해 메모리를 절약하고 성능을 향상시킬 수 있다.
예를 들어, 다음과 같은 코드가 있다고 가정해보자. 이 코드에서 myConstWidget과 anotherConstWidget는 동일한 'Hello'라는 텍스트를 가지므로, 두 객체는 메모리 상에서 같은 인스턴스를 공유한다.
const myConstWidget = Text('Hello');
const anotherConstWidget = Text('Hello');
const 객체는 메모리 절약을 위해 동일한 내용을 가진 객체를 하나의 인스턴스로 공유하는 특징이 있다. 같은 파일 내에서 여러 번 호출해도 동일한 const 객체는 최초 선언 시 생성된 인스턴스를 계속 재사용한다.
Widget build(BuildContext context) {
return Column(
children: [
myConstWidget,
anotherConstWidget,
const Text('Hello'), // 동일한 객체 참조
],
);
}
따라서 위의 예제에서 세 개의 Text('Hello') 위젯은 모두 동일한 인스턴스를 참조하게 된다.
이 때문에 동일한 값을 가지는 객체가 여러번 사용 될 때, 메모리 사용이 최적화 되어 성능이 향상된다는 것.
공식 문서에도 나와있듯이, 클래스 레벨에서 상수 값을 설정할 때는 const와 함께 static을 사용한다. static const는 클래스에 종속된, 불변하는 상수값을 설정할 때 사용된다. 일반적으로 애플리케이션 내에서 반복해서 사용되는 상수값을 클래스의 정적 변수로 선언할 때 유용하다.
class AppColors {
static const primaryColor = Color(0xFF000000);
static const secondaryColor = Color(0xFFFFFFFF);
}
위 코드에서 primaryColor와 secondaryColor는 여러 위치에서 동일하게 사용될 수 있으며, 메모리 효율성을 제공한다.
메모리 효율성: 동일한 값을 가진 객체가 하나의 인스턴스를 공유하여 메모리 사용을 줄인다.
성능 향상: 불변 객체를 재사용함으로써 객체 생성 비용을 줄인다.
코드 안정성: 불변 객체를 사용해 예측 가능한 동작을 보장.
const는 동일한 값을 가지는 객체가 여러 번 사용될 때 메모리를 절약하고, 코드의 일관성을 높인다.
따라서 const와 static const를 적절히 활용하면 메모리 절약과 성능 최적화를 동시에 이룰 수 있다. 특히 반복해서 사용되는 상수값을 클래스의 static const로 선언하면, 코드의 안정성과 효율성이 향상된다.