[Flutter] static 키워드
class A {
static int aa = 1;
static void aaPrint() {
print(aa);
}
}
코드를 짜면서 가끔씩 나오는 "static" 무슨 역할을 할까요?
static 이란?
"static"은 프로그래밍에서 여러 의미를 가지는 키워드 중 하나입니다. 일반적으로 static 키워드가 붙은 변수나 함수는 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다.
void main() {
final b = B(); //B클래스 선언
print(b.bb); //출력 2
b.bbPrint(); //출력 2
}
class B {
int bb = 2;
void bbPrint() {
print(bb);
}
}
기본적으로 클래스의 멤버변수나 멤버함수는 클래스 객체를 생성해야지만 사용할 수 있습니다. 하지만 static이 붙은 변수나 함수는 클래스 객체를 생성하지 않고도 사용할 수 있습니다.
void main() {
print(A.aa); // 출력 1
A.aaPrint(); // 출력 1
}
class A {
static int aa = 1;
static void aaPrint() {
print(aa);
}
}
static 키워드를 사용함으로써 이미 메모리에 할당되어 있기 때문에 클래스 객체를 생성하지 않아도 사용할 수 있습니다.
어떻게 가능할까?
static 키워드만 붙였는데 어떻게 클래스 객체를 생성하지 않고도 가능할까요? 이것을 이해하려면 메모리 할당과 컴파일타임/런타임을 알아야 합니다.
void main() {
final b = B(); //B클래스 선언
print(b.bb); //출력 2
b.bbPrint(); //출력 2
}
class B {
int bb = 2;
void bbPrint() {
print(bb);
}
}
우리가 B클래스를 사용하기 위해 객체를 생성할 때는 힙 메모리에 할당됩니다.
(힙 메모리 : 동적할당 메모리가 저장되는 영역)
즉 객체를 생성할 때 / 런타임에 메모리에 할당되기 때문에 할당된 이후부터 클래스의 멤버변수나 멤버함수에 접근해서 사용이 가능합니다.
(런타임 : 사용할 때)
void main() {
print(A.aa); // 출력 1
A.aaPrint(); // 출력 1
}
class A {
static int aa = 1;
static void aaPrint() {
print(aa);
}
}
A클래스를 사용할 때는 객체를 생성하지 않았습니다. 하지만 "static" 키워드가 붙음으로써 컴파일 타임 때 static이 붙은 변수는 데이터 섹션 메모리에 할당되고 함수는 텍스트 섹션 메모리에 할당됩니다.
(데이터 섹션 메모리 : 전역변수 및 정적변수등의 데이터가 저장되는 영역)
(텍스트 섹션 메모리 : 실행가능한 코드가 저장되는 영역)
(컴파일 타임 : 앱을 실행할 때)
쉽게 말해 앱을 실행할 때 클래스 A의 aa변수와 aaPrint함수를 기억하고 있다가 사용하는 겁니다.
데이터 섹션 메모리와 텍스트 섹션 메모리에 할당된 데이터는 프로그램이 종료될 때 해제됩니다.
주의할 점
class A {
static int aa = 1;
int bb = 2;
static void aPrint() {
print(aa);
print(bb); // error : Instance members can't be accessed from a static method.
}
void bPrint() {
print(aa);
print(bb);
}
}
static 함수에서 static으로 선언되지 않은 bb변수를 사용할 수 없습니다. static은 컴파일 타임에 할당되는데 인스턴스 멤버인 bb변수는 런타임에 할당되기 때문에 컴퓨터는 bb가 뭐 하는 코드인지 알 수 없기 때문입니다.
하지만 일반 함수인 bPrint는 런타임에 할당되기 때문에 aa와 bb의 정보를 전부 알 수 있어서 문제없이 사용가능합니다.