flutter 에서 stateful, stateless class를 만들면, 자동으로 key라는 것이 class 안에 들어가있는 것을 확인 할 수 있다.
여기서 key는 무엇이고 const는 왜 사용하는것일까?
플러터 독스에 따르면, Key class는 Widget에 대한 identifier이다.
다른 클래스에서 동일한 키를 가지고 있으면, 같이 업데이트 해줄 수 있다.
Key에는 LocalKey와 GlobalKey가 존재한다.
GlobalKey 는 전체 앱에서 unique한 특성을 가진다.
LocalKey는 parent widget이 같은 경우에 사용한다.
그래서 평상시에 코딩할 때는 class에 key를 남겨놓을 필요가 없을 것 같다
그렇다면 class 정의를 하고, 바로 아랫줄에 있는 const는 왜 붙어있는 것일까??
const는 한번 설정 한 값을 변경 할 수 없게한다.
또한, 더 자세히 설명하자면 컴파일 타임에서 상수를 정의하기 때문에, 런타임에서 정의되는 값을 설정 할 수 없다.
그래서 class 명 앞에 const가 있으면 해당 class는 컴파일 타임에서 정의되는 class라는 뜻이다.
그런데, 컴파일타임에서 정의가되면, 해당 클래스는 변하지 못한다.
따라서 class내에 있는 변수도 변하지 못하므로 아예 정의를 못하게 하는 것이다.
그래서 class 내에 변수가 있는 경우, const를 지워줘야 에러가 나지 않는다.
그렇다면 class의 생성자 안에 들어있는 {Key? key}는 무슨 뜻일까?
{}는 optional named parameter를 선언하는 것이다.
optional named parameter는 해당 class를 선언할 때 지정할 필요가 없다.
따라서 key는 지정할 필요가 없는 optional parameter이다.
플러터는 null safety를 지원한다. 그래서 null값일 가능성이 있는 것은 ?(물음표)를 붙여준다.
여기서도 그런 이유때문에 Key 뒤에 물음표를 붙여줬다. class를 생성하는데, key가 지정될 수도 있고, 지정이 안될 수도 있다. 따라서 이 값이 null 값일 가능성이 있기때문에 물음표를 붙여준다.
그러면 이제, 생성자 뒤에 붙어있는 : 는 왜 있는 것이며, super(key:key)는 왜 있는것일까?
:는 initializer list(초기화 리스트)를 시작한다.
초기화 리스트를 사용하는 경우, 생성자를 구현하기 전에 인스턴스 변수를 초기화할 수 있다.
말이 좀 어려운데, 예를 들어서
class Person{
String name;
Person():name='Kim'{
print('This is Person($name) Constructor!');
}
}
이 경우에는 Person의 class를 생성 할 때, name을 Kim으로 초기화 시키고, 내용을 print한다.
만약 초기화리스트가 생략된 경우에는, 상위 클래스(super class)의 기본 생성자를 호출하고,
초기화리스트가 있는 경우에는, 주어진 클래스의 특정 생성자를 호출한다.
생성자 : 초기화리스트의 형태인 것이다!
example({Key? key)}: super(key : key);
다시 돌아와서 그러면 example class는 super(key:key)를 초기화시킨다.
super class의 key에 example에서 생성한 key를 전달한다.
그렇다면 super class의 key 와 example class의 key가 같은것인가 다른것인가..?
이거에 대해서는 나도 아직 더 공부를 해봐야할 것 같은데,
같다고 생각한다.
key 값을 따로 주지 않는 이상 부모와 같아질 것이다.
'flutter' 카테고리의 다른 글
flutter provider.of vs Consumer (1) | 2022.06.28 |
---|---|
flutter dependencies vs dev dependencies (0) | 2022.06.24 |
flutter listview builder scroll (0) | 2022.06.22 |
플러터 스플래쉬 화면 (0) | 2022.06.20 |
flutter 위젯에서 조건문 사용하기 (0) | 2022.06.19 |