Final
- 변수가 한 번 할당된 후 변경되지 않도록 보장한다.
- final 변수는 런타임에 값을 할당받을 수 있으며, 그 값은 객체가 생성될 때 초기화된다.
즉, 실행 시점까지 변수의 실제 값이 무엇인지 결정되지 않는데 현재 시간 계산, 사용자 입력이나 계산에 의해 변수 값이 결정되는 경우다.
Const
- const는 컴파일 시점에 상수로 결정되며, 프로그램의 실행 동안 절대 변경될 수 없다.
- 즉 프로그래밍 실행 전에 이미 값이 고정된 상태라고 보면 된다.
- 프로그램 실행 때마다 값이 변할 필요 없는 경우 최적화를 위해 사용한다.
- 컴파일 타임에 값이 고정되기 때문에 프로그램의 어느 곳에서도 변경될 수 없다.
- 예를 들어 앱 전체에서 반복적으로 사용되는 TextStyle을 const로 정의하여 메모리 사용을 최소화하고 렌더링 성능을 향상시킬 수 있다.
const TextStyle defaultStyle = TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.black);
Static
- final, const와 달리 static이 붙은 변수나 함수는 클래스 객체를 생성하지 않고도 사용할 수 있다.
- static 키워드를 사용하면 해당 변수나 메소드가 클래스의 모든 인스턴스(객체)에 의해 공유되고 접근될 수 있는데 특정 인스턴스에 속하지 않는다.
- 이렇게 하면, 클래스의 어떤 인스턴스도 생성하지 않고도 해당 변수나 메소드에 접근할 수 있으며, 생성된 모든 인스턴스에서 이를 공동으로 사용할 수 있다.
- static 변수는 런타임에 초기화될 수 있으며, 프로그램 실행 동안 변경될 수 있다.
- 공통으로 사용되는 데이터베이스 접속 정보 같은 설정을 클래스 레벨에서 공유하는 데 사용할 수 있다.
class DatabaseConfig {
static String databaseURL = 'https://api.example.com/data';
static final int timeout = 5000;
}
언제 어떤 키워드를 사용하는 것이 적합할까?
final, const: 불변성을 보장하기 위해 사용 → 불변의 상수 관리에 적합
static: 클래스 레벨의 자원을 정의하고 공유하기 위해 사용 → 공유되는 자원 관리에 적합
한번 더 정리하자면!
final: 불변성. 한번 초기화되면 그 이후로 값을 변경될 수 없도록 한다.
const: 컴파일 타임 상수. 컴파일 시간에 상수로 결정되며 실행 중에 절대 변경될 수 없다.
static: 클래스 레벨에서 변수나 메소드를 정의하여 모든 인스턴스에서 공유되므로 객체 생성 없이 접근이 가능하다.