앱이 실행되면 iOS의 UIApplication은 메인 스레드에서 main run loop를 실행시킴
main run loop는 돌아가면서 터치 이벤트, 위치의 변화, 디바이스 회전 등 각종 이벤트를 처리
처리 과정은 각 이벤트에 대응하는 핸들러를 찾아 처리 권한을 위임하며 진행됨
⇒ 버튼의 터치 이벤트를 @IBAction 메서드가 처리하는 것과 같음
이렇게 발생한 이벤들을 모두 처리하고 권한이 다시 main run loop로 돌아오게 되는 시점은 update cycle

main run loop에서 이벤트가 처리되는 과정에서 layout이나 position 값을 바꾸는 핸들러가 실행되는 경우에는 변화가 즉각적으로 반영되지 않는다.
ex) 버튼 클릭 시 크기가 변하거나 위치가 이동
시스템은 layout이나 position이 바뀌는 View를 체크하고, 이런 View들의 값을 update cycle에서 바꿔주면서 position/layout의 변화를 적용시킨다.
👉 position/layout 값을 변경하는 코드와 실제 변경이 적용되는 시점에는 시간차가 존재한다. ⇒ 매우 짧은 시간차라 사용자는 체감할 수 없지만, 분명히 차이가 있기 때문에 개발자는 이를 인지하고 정확하게 코드를 짤 수 있어야 한다‼️
layoutSubViews()View의 값을 호출한 즉시 변경시켜주는 메서드
시스템에 의해서 View의 값이 재계산되는 적절한 시점(update cycle)에 자동으로 호출됨 ⇒ UI 변경 작업은 비용이 크기 때문에 이런 방식으로 관리
호출되면 해당 View의 모든 SubView들의 layoutSubViews()도 연달아 호출됨
⇒ 비용 ⬆️ (직접 호출 지양)
⇒ 그렇기 때문에 layoutSubViews()를 유도할 수 있는 여러 방법이 존재함 (≈ update cycle에서 layoutSubViews의 호출을 예약)
UIViewController 내의 뷰가 재계산되어 다시 그려지는 행위가 발생하면(≈ layoutSubViews()가 호출되고 뷰의 값이 갱신괴도 나면)