클래스의 멤버변수 또는 함수가 클래스의 인스턴스가 아닌 클래스 자체에 귀속되어야 할 때 사용하는 키워드로, static
키워드가 붙은 멤버변수 또는 함수는 인스턴스의 생성 없이 클래스의 이름만 사용하여 호출이 가능합니다.
class Menu {
String lunch = 'salad';
static String dinner = 'cheeseBurger';
}
print(Menu().lunch);
print(Menu.dinner);
인스턴스 변수는 클래스의 인스턴스가 생성될 때, 즉 런타임 시 메모리에 할당되지만 static
멤버는 컴파일 시 클래스가 메모리에 처음 할당될 때 메모리에 할당됩니다. 따라서 인스턴스 변수와 다르게 static
멤버의 경우 프로그램 실행 시에 생성되어 프로그램이 종료될 떄까지 메모리에 존재합니다.
다만 static
멤버의 경우 인스턴스 변수처럼 힙 영역이 아닌 데이터 영역에 저장되기 때문에 가비지 컬렉터의 대상이 아닙니다. 따라서 메모리 낭비를 초래하지 않도록 목적에 맞게 사용하는 것이 중요합니다.
const
와 final
의 가장 큰 차이점은 값의 초기화 시점입니다.
먼저 const
의 경우 상수를 선언해야 할 때 사용하는 키워드로, const
키워드가 선언된 상수는 컴파일 시점에 값이 결정됩니다.
보통 처음에 초기화된 후로 변하지 않는 고유한 값들을 선언할 때 사용하며, 미리 초기화해놓은 값을 런타임 시 가져다 쓰기만 하면 되기 때문에 성능에 약간의 이점이 있습니다.
다만 인스턴스 변수에는 단독으로 사용할 수 없기 때문에 인스턴스 변수에 사용하려면 static
키워드와 함께 사용해야 합니다.
class Menu {
const String lunch = 'salad'; // complie error, only static fields can be declared as const
static const String dinner = 'cheeseBurger';
}
final
키워드가 붙은 변수의 경우 const
와 달리 런타임 시점에 값이 결정됩니다. 따라서 런타임 시 최초 한번 값이 할당된 이후에는 더이상 값을 할당할 수 없습니다.
class Menu {
Menu({this.lunch});
final String lunch = 'salad';
void printLunchMenu() {
print(lunch);
}
}
void main() {
// compile error, 'lunch' is final and was given a value when it was declared, so it can't be set to a new value.
// Try removing one of the initializations.
Menu menu = Menu(lunch: 'salad');
menu.printLunchMenu();
}
class Menu {
Menu({required this.lunch});
final String lunch;
void printLunchMenu() {
print(lunch);
}
}
void main() {
Menu menu = Menu(lunch: 'salad'); // OK
menu.printLunchMenu();
}
[Flutter] static 키워드
[Flutter&Dart] Singleton ? Static ? Class ? .. 차이점을 Instance 관점에서 알아보자