const와 final의 차이점

하요·2024년 6월 30일
0
post-thumbnail

Dart의 constfinal 설명 및 사용 시점


constfinal의 개념

const란?
  • 정적 상수: 코드가 컴파일(실행 파일로 변환)될 때 값이 정해짐. 절대 변하지 않음.
  • 불변 객체: const로 선언된 객체는 변경 불가능.
final이란?
  • 런타임 상수: 코드가 실행될 때 값이 정해짐. 한 번 정해지면 변하지 않음.
  • 단일 할당: 변수에 한 번만 값을 설정할 수 있음. 이후 변경 불가.

constfinal의 공통점

  • 변수 재할당 방지 기능:

    final a = 1;
    a = 2; // 불가능
    
    const b = 1;
    b = 2; // 불가능

constfinal의 차이점

  1. 용도 차이:

    • final: 변수의 참조 재할당을 방지하는 역할.
    • const: 컴파일 타임에 계산될 수 있는 상수를 선언하는 역할.
  2. late 키워드 사용 가능 여부:

    • final: late 키워드 사용 가능.
    • const: late 키워드 사용 불가능 (컴파일 타임에 선언되므로 나중이 없음).
  3. 값 변경 여부:

    • final: 값을 변경할 수 있습니다.
    • const: 값을 변경할 수 없습니다.
  4. 객체 생성과 관련된 차이점:

    • final은 변수 재할당 방지만 담당할 뿐, 객체 생성과 관련이 없기 때문에 각기 다른 배열을 만듭니다.
    • const는 값이 동일하기 때문에 배열을 하나만 만든 뒤 참조를 공유합니다.
    final a1 = [];
    final a2 = [];
    final a3 = [];
    final a4 = [];
    
    const b1 = [];
    const b2 = [];
    const b3 = [];
    const b4 = [];

언제 const를 사용해야 할까?

  1. 값이 미리 결정되어야 할 때:

    • 예: 수학에서 사용되는 상수 값, 절대 변하지 않는 문자열 등.
    const double pi = 3.141592653589793;
    const String greeting = 'Hello, World!';
  2. 변경되지 않는 불변 리스트를 만들 때:

    • 예: 프로그램 내내 변하지 않을 목록.
    const List<int> numbers = [1, 2, 3, 4, 5];
  3. 프로그램 전체에서 사용할 상수를 만들 때:

    • 예: 앱 설정 값, 최대 연결 수 등.
    const int maxConnections = 100;

언제 final을 사용해야 할까?

  1. 값이 실행 중에 결정될 때:

    • 예: 현재 시간, 사용자 입력 값 등.
    final DateTime now = DateTime.now();
    final String userInput = getUserInput();
  2. 한 번만 설정되고 이후 변하지 않아야 할 때:

    • 예: 프로그램이 실행되는 동안 변경되지 않는 값.
    final int result;
    if (condition) {
      result = 10;
    } else {
      result = 20;
    }
  3. 클래스 속성으로, 생성자에서 설정되고 이후 변하지 않도록 할 때:

    • 예: 객체 생성 시 결정되고 변경되지 않아야 하는 값.
    class Person {
      final String name;
      final int age;
      
      Person(this.name, this.age);
    }

간단한 요약

  • const: 값이 컴파일 시점에 결정되고 절대 변하지 않을 때 사용.

  • final: 값이 런타임 시점에 결정되지만 한 번만 할당될 때 사용.

  • const:

    • 언제?: 값이 변하지 않고, 코드가 컴파일될 때 결정되는 경우.
    • : 수학 상수, 불변 리스트, 전역 설정 값.
  • final:

    • 언제?: 값이 실행 중에 결정되지만, 한 번만 설정되고 이후 변하지 않는 경우.
    • : 현재 시간, 사용자 입력 값, 생성자에서 설정되는 클래스 속성.

예제 코드

// const 예제
const double pi = 3.141592653589793; // 항상 변하지 않는 수학 상수
const String greeting = 'Hello, World!'; // 변하지 않는 문자열
const List<int> numbers = [1, 2, 3, 4, 5]; // 불변 리스트

// final 예제
void main() {
  final DateTime now = DateTime.now(); // 프로그램 실행 중에 결정되는 값
  final String userInput = getUserInput(); // 사용자 입력 값

  print('현재 시간: $now');
  print('사용자 입력: $userInput');
}

// 사용자 입력을 받는 함수 (예제용)
String getUserInput() {
  return 'Hello, Dart!';
}

추가 예제

// late 키워드와 final 예제
late final int lateValue;
void setLateValue() {
  lateValue = 42;
}

// const와 final의 객체 생성 차이점
void main() {
  final a1 = [];
  final a2 = [];
  final a3 = [];
  final a4 = [];

  const b1 = [];
  const b2 = [];
  const b3 = [];
  const b4 = [];
  
  print(identical(a1, a2)); // false
  print(identical(b1, b2)); // true
}

profile
flutter 개발자(진)

0개의 댓글