Dart에서 const
키워드는 컴파일 시점에 값이 결정되고 프로그램 실행 도중에는 절대 변경되지 않는 상수를 만들 때 사용됩니다.
클래스 내부에서 const
생성자를 사용하면, 인스턴스를 생성할 때 const
키워드를 사용하여 상수 인스턴스를 만들 수 있습니다. 이렇게 생성된 상수 인스턴스는 모든 프로퍼티가 불변이 되며, 동일한 인자로 생성된 인스턴스는 모두 같은 메모리 주소를 가리키게 됩니다.
class Idol {
final String name;
final List<String> members;
const Idol(this.name, this.members);
}
위 코드에서 Idol
클래스는 name
과 members
라는 두 개의 프로퍼티를 가지고 있습니다. 이 클래스에는 const
생성자가 정의되어 있어, Idol
인스턴스를 상수로 만들 수 있습니다.
void main() {
Idol idol1 = const Idol('BTS', ['정국', '뷔']);
Idol idol2 = const Idol('BTS', ['정국', '뷔']);
print(idol1 == idol2);
}
main
함수에서는 idol1
과 idol2
두 개의 Idol
인스턴스를 만듭니다. 두 인스턴스는 모두 동일한 인자로 const
생성자를 통해 생성됩니다. 그런데 위의 코드처럼 인자가 동일할 때, idol1
과 idol2
는 같은 메모리 주소를 가리키게 되며 동일한 인스턴스가 됩니다. 따라서 idol1 == idol2
는 true
를 반환합니다.
void main() {
Idol idol1 = const Idol('BTS', ['정국', '뷔']);
Idol idol2 = const Idol('BTS', ['정국', 'RM']);
print(idol1 == idol2);
}
만약 Idol idol2 = const Idol('BTS', ['정국', 'RM']);
이 되어 인자가 동일하지 않을 때, idol1
과 idol2
는 다른 메모리 주소를 가리키게 되면서 2개의 인스턴스가 되고, idol1 == idol2
는 false
를 반환합니다.
상수 인스턴스의 프로퍼티는 변경할 수 없습니다. 하지만 프로퍼티가 객체를 참조하는 경우, 참조된 객체 내부의 값은 변경 가능할 수 있습니다. 예를 들어, members
리스트는 Idol
인스턴스가 불변이라 하더라도 리스트 내부의 값을 변경할 수 있습니다.
const
키워드와 const
생성자를 사용하면, 불변의 상수 인스턴스를 만들 수 있으며, 이는 메모리 효율성을 높이고 버그를 방지하는 데 도움이 될 수 있습니다. 하지만 참조된 객체의 불변성을 항상 주의 깊게 고려해야 합니다.