민프

[Flutter] const, final의 공통점과 차이점 (feat. Runtime, Compile Time) 본문

[Flutter]

[Flutter] const, final의 공통점과 차이점 (feat. Runtime, Compile Time)

민프야 2023. 8. 8. 12:23

https://minf.tistory.com/223

 

[Flutter] Dart언어에서 알면 좋은 점 (Feat. 객체지향언어)

Main 함수 Dart에서 Main함수는 모든 Dart 프로그램의 Entry point이기 때문에 중요하다 만약 main을 다른 함수명으로 바꾼다면 아래 사진과 같이 Run | Debug 내용이 없어지게 되고, 실제로 이 코드를 강제

minf.tistory.com

위 포스팅에서 const, Final 변수에 대해서 간단하게 알아봤었는데 이번 포스팅에서는 좀 더 명확하게 알아보려고 합니다.

 

Flutter에서 const와 final은 모두 변수 선언 시 사용되는 키워드로, 변수를 상수로 선언하거나 변수에 할당된 값을 변경할 수 없도록 만듭니다. 하지만 동작 원리와 차이점에는 몇 가지 중요한 점이 있습니다.

const와 final의 공통점

  • 둘 다 변수를 상수로 선언하는 데 사용됩니다.
  • 상수로 선언된 변수는 반드시 초기화되어야 합니다.
  • 상수로 선언된 변수에는 재할당이 불가능합니다.

 

 

const의 특징

  • const는 컴파일 타임에 상수 값을 평가하여 변수에 할당합니다.
  • 객체를 const로 선언하려면 해당 객체와 그에 포함된 모든 필드가 모두 const로 선언되어야 합니다.
  • const로 선언된 변수는 메모리에서 한 번만 할당되고 해당 값을 공유합니다. 따라서 같은 값에 대해 여러 변수가 있는 경우 실제로는 같은 메모리를 가리키게 됩니다.

코드로 예를 들어서)

const DateTime const = DateTime.now();
  print(const);

위 코드에서 

const는 컴파일 시에 상수를 결정하기 때문에

런타임 코드에서 코드가 실행되어야 알 수 있는 DateTime.now()의 값을 알 수 없기 때문에 오류가 발생한다.

 

final의 특징

  • final은 런타임에 상수 값을 평가하여 변수에 할당합니다.
  • final은 객체의 생성자를 상수로 만들지 않습니다.
  • final로 선언된 변수는 런타임에 한 번만 할당됩니다.
  • final로 선언된 변수는 선언 시점이나 클래스 생성자에서 초기화됩니다.

마찬가지로 코드로 예를 들어보자면

final DateTime fin = DateTime.now();
print(fin);

반대로 final 의 경우에는 런타임에서 값이 결정되기 때문에 DateTime.now()의 값을 가져올 수 있어 정상적으로 출력이된다.

 

 

위 특징들에서

const = 컴파일 타임(Compile Time)

final = 런타임(Runtime)
각 타임은 프로그램의 실행과정에서 중요한 개념인데 하나하나 알아가보도록 하겠습니다.

 

컴파일 타임(Compile Time)

  • 컴파일은 프로그래밍 언어로 작성된 소스 코드기계어 또는 중간 코드로 변환하는 과정입니다.
  • 소스 코드를 컴퓨터가 이해할 수 있는 형태로 변환하여 오류를 검출하고 최적화하여 실행 파일을 생성합니다.
  • 컴파일은 프로그램의 정적(static) 특성을 나타냅니다. 정적 특성은 코드가 실행되기 전에 결정되는 것을 의미합니다.

예시 코드를 예시로 설명해보자면

void main() {
  final int x = 10;
  const int y = 20;

  int z = x + y; // 변수 x, y는 상수이므로 컴파일 타임에 해당 표현식이 계산되고, z에는 30이 할당됩니다.

  print("z: $z");
}

위 예제에서 변수 xy는 모두 finalconst로 선언되어 있으므로 컴파일 타임에 상수로 평가됩니다. xy는 프로그램이 실행되기 전에 이미 값을 가지고 있으며, 따라서 변수 z를 계산하는 표현식 x + y도 컴파일 타임에 이미 계산됩니다. 따라서 z에는 30이 할당되고, 이 값은 런타임에 영향을 받지 않습니다.

런타임(Runtime)

  • 런타임은 프로그램이 실제로 실행되는 시점입니다.
  • 프로그램이 실행되면서 변수가 할당되고 메모리가 동적으로 관리되며, 함수가 호출되고 객체가 생성됩니다.
  • 런타임은 프로그램의 동적(dynamic) 특성을 나타냅니다. 동적 특성은 코드가 실행되는 동안에도 변경될 수 있다는 것을 의미합니다.

마찬가지로 예시 코드를 예시로 설명해보자면

void main() {
  int x = 5;
  int y = getValueFromServer(); // 가정: 서버에서 값 받아오기

  int z = x + y; // x와 y는 런타임에 값이 결정되므로, 이 표현식은 런타임에 실행됩니다.

  print("z: $z");
}

int getValueFromServer() {
  // 가정: 서버에서 값을 받아와서 반환하는 함수
  return 10;
}

위 예제에서 xy는 런타임에 값이 결정됩니다. x는 5로 초기화되었지만, ygetValueFromServer() 함수를 호출하여 서버에서 값을 받아오는 동적인 과정을 거칩니다. 따라서 변수 z를 계산하는 표현식 x + y는 런타임에 실행되며, xy의 값에 따라 z의 값이 달라집니다. 이것이 런타임의 동적 특성을 보여주는 예시입니다.

 

요약하면, 컴파일 타임은 프로그램이 실행되기 전에 코드가 분석되고 최적화되는 시점을 의미하며, 런타임은 프로그램이 실제로 실행되는 시점을 의미합니다. 컴파일 타임에는 상수 표현식이 계산되고 변수의 타입 검사가 수행되지만, 런타임에는 변수의 실제 값이 할당되고 함수가 호출되며, 객체가 생성되는 등의 동적인 활동이 이루어지게 됩니다.

 

 

Comments