widget은 불변의 법칙을 가지고 있다.
그러므로 위젯의 변경이 필요하면 기존 위젯은 삭제되고, 새로운 위젯으로 대체한다.

- constructor로 widget이 생성
- build 함수 실행(life cycle동안 단 한번만 실행)
- widget의 변경이 일어나면 처음부터 constructor와 build가 실행되는 방식
기본

- StatefulWidget의 constructor에서 createState()를 호출하고 State 생성
- State에서 initState()로 초기화
- didChangeDependencies()가 호출되어 변경이 필요한 dirty 상태로 변환
- build()가 호출되어 화면에 UI를 그리고 clean 상태로 변환
파라미터 변경

- 파라미터가 변경되면 widget이 삭제됨(widet은 불변)
- 새로 생긴 widget의 constructor는 실행되지만, 삭제된 State를 찾아서 재활용하기 때문에 createState는 실행되지 않음
- didUpdateWidget()이 호출되어 dirty 상태로 변환
- 변경된 값들을 기반으로 build() 호출되어 UI 생성 후 clean 상태로 변환
setState 실행

- setState() 호출되면 dirty 상태로 변환
- 변경된 값들을 기반으로 build() 호출되어 UI 생성 후 clean 상태로 변환