# 활동학습 준비
### View Controller의 View의 상태변화에 따른 메서드의 호출순서를 이야기해보세요
* 직접 호출되는 것이 아닌, view의 상태가 변할 때마다 약속된 메소드가 호출되는 것!
* 왜 super.*** 를 해줄까?
: View Controller는 UIViewController를 상속하는 class인데, UIViewController가 기밀이라 발생 할 수 있는 충돌을 예방하기 위해서.
---
0.loadView
: view 프로퍼티의 값이 nil일 때 호출되어
View Controller가 관리하는 view를 만드는 역할을 한다
해당 메소드 안에선?
: 이 메소드 안에서 새로운 뷰를 만들어서 뷰 컨트롤러의 메인 뷰로 설정해줘도 된다. 뷰 컨트롤러의 기본 뷰를 커스텀 뷰로 사용하고자 할 때 유용. 스토리보드를 쓰면 어차피 스토리보드에 있는 뷰를 가져와 쓸 테니 굳이 필요하지 않다.
---
1.viewDidLoad
: view의 초기화가 이루어진다.
viewDidLoad() 는 뷰가 모두 생성되고 메모리에 처음 stack으로 로드될 때 호출된다.
화면에 보여지지 않는 순간에 내부에 적힌 코드가 실행될 수 있다.
해당 메소드 안에선?
: 초기값을 설정하거나 옵져버를 등록하는 등 뷰의 초기화 작업을 진행한다.
---
2.viewWillAppear
: view가 view 계층에 추가, 즉 화면에 표시되기 직전에 수행된다. 화면이 보일 때 마다 내부 코드가 수행된다.
해당 메소드 안에선?
: 뷰에 보여질 데이터를 불러온다. (데이터가 갱신이 되는 경우)
---
3.viewDidAppear
: view가 화면에 표시된 이후 수행된다.
해당 메소드 안에선?
: view 나타날 때 수행할 추가작업을 진행한다. 보통 다른 view에 있다가 돌아오는 경우 실행 되어야하는 작업들이다.
ex:) 사용자 환영 애니메이션, 배경음악 재생
---
4.viewWillDisappear
: view가 사라지기 직전에 호출된다
해당 메소드 안에선?
: 배경음악 중지 작업 같이 화면이 사라지려고 하는 순간 진행되어야하는 작업을 내부에 적는다
---
5.viewDidDisappear
: view가 제거되었음을 알린다.
해당 메소드 안에선?
: 옵져버 구독 중단 등 view가 제거되고 나서 진행되어야하는 작업을 내부에 적는다.
---
### viewWillAppear와 viewDidAppear에서 무엇을 하면 좋을까요?
viewWillAppear
- view 계층에 추가되기 직전에 호출된다
- 화면에 보이기 전에 호출된다
- view의 bounds가 정의되지만 위치는 정의되지 않은 상태이다
viewWillLayoutSubviews
- bounds가 최종적으로 결정된다.
- view controller의 view의 subview들이 로드될때마다 호출된다
layoutSubviews
- subview를 배치한다
- 직접 호출되지 않는다
viewDidLayoutSubviews
- view controller에게 subview들이 설정되었음을 알린다.
- 마찬가지로 view controller의 view의 subview들이 로드될때마다 호출된다
- layoutSubviews 의 실행이 완료되면 콜백으로 호출된다.
viewDidAppear
- view 계층에 추가되고, 화면에 보이고 난 후 호출된다
- UIView의 layoutSubviews 메서드가 호출되고나서 불린다
#### UIView의 layoutSubviews 메서드는 viewWillAppear보다 먼저 호출되나요? 그렇게 생각한 이유는 무엇인가요?
아니요. viewWillAppear 이후에 호출됩니다.
layoutSubviews 메서드가 호출되기 전에
우선 뷰가 생성되고 메모리에 로드 되어야한다고 생각합니다. 그 후 viewWillAppear와 viewDidAppear 사이에서
view가 계층에 추가되고 subview들이 설정이 되어야 viewDidAppear에서 view가 보여질 수 있지 않을까 생각합니다.
### 스위프트 언어의 String에서 subscript를 통해 문자에 접근할 수 없는 이유에 대해 설명해주세요.
Sting은 [int]로 접근하지 못하고 String.index로 접근해야한다.
이유: Character가 1개 이상의 unicode scalar로 이루어져있어 크기가 가변적이다.
String: Character의 Collection(Array)
Character가 1개 이상의 unicode scalar로 이루어져있어 크기가 가변적이다. -> 무엇을 기준으로 인덱싱을 지원해야하는 지가 애매하다.
-> 같은 타입의 자료로 이루어진 배열이라고 받아들이기 어렵다.
#### 스위프트 언어는 왜 Character가 unicode scalar로 이뤄지도록 하였나요?
-> 유니코드 문자들이 깨지지 않은 상태로 보여줌
-> character 단위 문자열 처리에 비용이 많이 든다