상수 (final / const)

ssh·2023년 12월 3일
0

dart

목록 보기
2/22

개요

  • 변수는 값이 변경되어 의도치 않게 에러가 발생할 가능성이 있다.

  • 그래서 가급적으로 값이 변하지 않도록 상수로 사용하는 것이 좋다.

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

    final String name = '태종';
    const String name2 = '세종;'
    
    name = '이방원'; // 에러
    name2 = '이도'; // 에러 
    
    final name3 = '세종'; // 타입을 생략하여 작성 가능

final

특징

  • 런타임에 결정
  • var대신 final로 변수를 만들게 되면 이 변수는 수정할 수 없게 된다. (딱 한 번만 설정할 수 있음)
  • 자바스크립트의 const랑 비슷하다.
  • 대표적인 사용경우 : API fetching, 사용자가 화면에서 입력해야하는 값 등이 있다.
    void main() {
      final f = [1, 2, 3];
      final g = [4, 5, 6];
    
      // Error: Can't assign to the final variable 'f'.
      // f = g;
    }
    
    위와 같이 새로운 final 상수 f에 새로운 컬렉션을 대입하는 것은 불가능하다.
    다트에서 모든 변수는 레퍼런스 타입 변수로 참조하는 객체를 바꾸는 것은 불가능하지만 참조되는 객체가 바뀌는 것은 가능하다.
    void main() {
      final f = [1, 2, 3];
    
      f.add(5);  // 원소를 추가할 수 있다.
      print(f);  // [1, 2, 3, 5]
    }
    
    f 변수가 바라보는 컬렉션의 주소는 변경이 되지 않았다. 하지만 대상이 되는 컬렉션의 원소는 추가 되었다.

const

특징

  • 컴파일 타임에 결정
  • const를 사용할 수 있는 부분에서 사용하면 성능상의 이점을 가져갈 수 있음
  • const는 compile-time constant를 만들어준다.
  • const는 컴파일할 때 알고 있는 값을 사용해야 한다.
  • 만약 어떤 값인지 모르고, 그 값이 API로부터 오거나 사용자가 화면에서 입력해야 하는 값이라면 const가 아닌 final이나 var가 되어야 한다.
  • constfinal의 가장 큰 차이점은 컴파일이 되는 시점에 그 값을 알 수 있는지 없는지의 차이다.
  • const 상수는 컴파일 시점에 그 값이 확정적이어서 한 번 대입하면 그 값을 변경할 수 없다.
  • const는 의 성질을 바꾼다.
  • const [1, 2, 3]과 같이 컬렉션 타입의 값에 const 속성을 주거나 const Point(2, 3)과 같이 인스턴스에 const 속성을 주면 해당 객체는 전체 상태 값이 모두 컴파일 시점에 결정되어 불변(immutable) 속성이 된다.
  • const 상수는 deeply, transitively, recursively 불변속성이다.
  • 컬렉션 필드를 포함하는 final 변수를 선언해도 그 안에 컬렉션의 값은 변경할 수 있다.
  • 값을 절대 바꿀 수 없는 컬렉션을 만들고 싶으면 const 값을 만들어야 한다.
  • 따라서 final 상수와 달리 const 상수로는 아래 예제에서 c.add(5); 같은 코드를 실행할 수가 없다.
    void main() {
      const c = [1, 2, 3];
      // 잡히지 않은 에러: 지원되지 않는 연산: add
      // Uncaught Error: Unsupported operation: add
      // c.add(5);
      print(c); // [1, 2, 3]
    }
    

0개의 댓글

관련 채용 정보