
const를 쓰는 것이 권장되지만 필수는 아닙니다. const를 생략해도 앱은 정상적으로 작동합니다.
하지만 플러터에서 왜 그렇게 const를 붙이라고 강조하는지, 그 이유와 장단점을 알면 도움이 됩니다.
플러터는 화면을 매우 빠르게 다시 그리는(Rebuild) 엔진입니다.
메모리 재사용: const가 붙은 위젯은 앱이 실행될 때 메모리에 딱 한 번만 올라가고, 화면이 수백 번 다시 그려져도 새로 생성되지 않고 기존 것을 재사용합니다.
불필요한 작업 방지: 화면 전체가 바뀔 때 플러터는 "어떤 위젯을 다시 그려야 하지?"를 계산합니다. 이때 const 위젯은 "이미 완벽하니 건드릴 필요 없음"이라고 판단하여 계산 과정을 생략합니다.
작성하신 코드에서 EmptylistItem() 앞에 const를 붙이라고 노란 줄이 가는 이유는, 그 위젯 내부에 변하는 값이 하나도 없기 때문입니다.
붙일 수 있는 경우: 위젯 내부의 모든 값이 컴파일 타임(코드 짤 때)에 이미 결정되어 있을 때.
붙일 수 없는 경우: items[index]처럼 실행 중에 값이 변하는 변수를 사용하는 경우.
공부할 때나 빠르게 코딩할 때: 귀찮으면 안 써도 됩니다. 앱이 안 돌아가는 건 아니니까요.
실제 배포용 앱을 만들 때: 반드시 써주는 게 좋습니다. 미세한 성능 차이가 모여서 앱의 부드러움(프레임 드랍 방지)을 결정합니다.
// ✅ 가능: 내용이 절대 안 변함 body: const EmptylistItem(), // ❌ 불가능: items라는 리스트 변수를 참조함 body: ProductListItem(items: items),
VS Code나 Android Studio 설정을 통해 파일을 저장할 때 자동으로 const를 붙여주는 기능을 켤 수 있습니다. (설정에서 Fix on Save를 검색해 보세요.)
class EmptylistItem extends StatelessWidget { const EmptylistItem({super.key}); Widget build(BuildContext context) { return Center( child: Column( children: [ Spacer(flex: 1), Image.asset('assets/images/empty_page.png', height: 190), Text( "등록된 상품이 없습니다.", style: AppTextStyles.s20w600.copyWith(color: AppColors.textPrimary), ), Text( "+ 버튼을 눌러 첫 상품을 등록해보세요!", style: AppTextStyles.s18w500.copyWith(color: AppColors.gray400), ), Spacer(flex: 2), ], ), ); } }
EmptylistItem()은 내용이 고정되어 있으니 const가 가능한 것이죠.