flutter final, const, static

jokil·2023년 12월 4일
0

플러터

목록 보기
2/15
상수 final, const

변수는 값이 변경되면 의도치 않게 에러를 발생할 가능성이 있다. 가급적이면 값이 변하지 않게 상수로 사용하는게 좋다.

선언할 때 final 키워드를 제일 앞에 붙이면 값이 수정되지 않는 상수로 사용할 수 있다.

const String con = 'good';
print(con);
결과

good 출력

const String con = 'good';
print(con);
con = 'bad';
print(con);
결과

Error: Can't assign to the const variable 'con'.

할당 할 수 없다고 에러가 뜬다.

 

final String fin = 'ggood';
print(fin);
fin = 'bbad';
print(fin);
결과

Error: Can't assign to the final variable 'fin'.

 

둘다 상수기 때문에 값을 바꿀 수 없다.

하지만 finalconst만 없으면 값을 바꿀 수 있다.

String con = 'good';
print(con);
con = 'hello';
print(con);
결과 

good
hello

 

값이 바뀌었다.

static은 아주 잘 설명한 글이 있길래 이걸 가져왔다.

코드를 짜면서 가끔씩 나오는 "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의 정보를 전부 알 수 있어서 문제없이 사용가능합니다.

출처: https://jutole.tistory.com/86
profile
주니어 개발자에서 점핑점핑

0개의 댓글