const

김동준·2025년 12월 29일
post-thumbnail

const를 쓰는 것이 권장되지만 필수는 아닙니다. const를 생략해도 앱은 정상적으로 작동합니다.

하지만 플러터에서 왜 그렇게 const를 붙이라고 강조하는지, 그 이유와 장단점을 알면 도움이 됩니다.

const를 써야 하는 이유 (성능 최적화)

플러터는 화면을 매우 빠르게 다시 그리는(Rebuild) 엔진입니다.

메모리 재사용: const가 붙은 위젯은 앱이 실행될 때 메모리에 딱 한 번만 올라가고, 화면이 수백 번 다시 그려져도 새로 생성되지 않고 기존 것을 재사용합니다.

불필요한 작업 방지: 화면 전체가 바뀔 때 플러터는 "어떤 위젯을 다시 그려야 하지?"를 계산합니다. 이때 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가 가능한 것이죠.

0개의 댓글