Flutter/기본

[Flutter] static 키워드

주톨 2023. 4. 18. 14:01
728x90

 

 

 

 

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의 정보를 전부 알 수 있어서 문제없이 사용가능합니다.