var
: var
키워드는 변수의 타입을 명시하지 않을 때 사용합니다. 컴파일러가 할당된 값에 따라 타입을 추론합니다. var
로 선언된 변수는 다른 값으로 변경이 가능합니다.
예를 들어:
예제 1
var name = 'John';
print(name); // John이 출력됩니다.
name = 'David';
print(name); // David가 출력됩니다. 변수값을 변경할 수 있습니다.
예제 2
var name = 'Dart'; // String 타입
name = 'Flutter'; // 여전히 String 타입
// name = 123; // Error! name 변수는 String 타입으로 이미 결정되었습니다.
var year = 2023; // int 타입
year = 2024; // 여전히 int 타입
// year = '2024'; // Error! year 변수는 int 타입으로 이미 결정되었습니다.
final
: final
키워드는 한 번 할당되면 값이 변경되지 않는 변수를 선언할 때 사용합니다. 즉, final
로 선언된 변수는 상수입니다만, 컴파일 시점에 값이 무엇인지 알 필요는 없습니다.
예를 들어:
final timeNow = DateTime.now();
print(timeNow); // 현재 시간을 출력합니다.
// 이후에 timeNow 변수에 다른 값을 할당하려고 하면 컴파일 에러가 발생합니다.
// timeNow = DateTime.now(); // 에러 발생!
const
: const
키워드도 final
과 같이 한 번 할당되면 값이 변경되지 않는 상수를 선언하는데 사용되지만, const
는 컴파일 시점에 값이 결정되어야 합니다. 즉, 변경할 수 없는 리터럴 값이거나, 다른 const
변수의 연산으로 값이 결정되어야 합니다.
예를 들어:
const pi = 3.14159;
print(pi); // 3.14159를 출력합니다.
// pi 변수에 다른 값을 할당하려고 하면 컴파일 에러가 발생합니다.
// pi = 3.14; // 에러 발생!
'super'는 Dart 언어에서 부모 클래스에 대한 참조를 나타내는 키워드입니다. 'super'를 사용하면 부모 클래스의 메서드를 호출할 수 있습니다.
예제
class Parent {
Parent(String message) {
print(message);
}
}
class Child extends Parent {
Child(String message1, String message2) : super(message1) {
print(message2);
}
}
void main() {
Child('Hello from parent!', 'Hello from child!');
}
이 코드를 실행하면, 우선 Parent
클래스의 생성자가 호출되어 "Hello from parent!"가 출력되고, 그 다음으로 Child
클래스의 생성자가 실행되어 "Hello from child!"가 출력됩니다. 여기서 Child
클래스의 생성자에서 super(message1)
을 사용하여 부모 클래스인 Parent
의 생성자를 호출하였습니다.
super
를 사용하는 주된 이유는 부모 클래스의 로직을 재사용하거나 확장하기 위함입니다. 이를 통해 중복 코드를 줄이고 코드의 유지 보수성을 높일 수 있습니다.
Flutter에서는 Widget
클래스가 key
를 파라미터로 받는 생성자를 가지고 있으며, 이 key
는 위젯을 고유하게 식별하는 데 사용됩니다. 따라서 StatelessWidget
이나 StatefulWidget
같은 위젯 클래스를 정의할 때는 super(key: key)
를 호출하여 부모 클래스인 Widget
의 생성자에 key
를 전달하는 것이 일반적입니다. 이를 통해 Flutter 프레임워크가 위젯을 올바르게 관리할 수 있게 됩니다.