## 1. 오토레이아웃은 bounds를 다루는 걸까요? frame을 다루는 걸까요?
- 오토레이아웃을 통한 제약을 기준으로 frame의 좌표와 크기를 결정함
### iOS 화면 체계에서 bounds 와 frame의 차이를 설명해주세요
- frame은 슈퍼 뷰 좌표계 기준으로 자신의 위치와 크기를 나타내고 bounds는 자신의 좌표계 기준으로 자신의 위치와 크기를 나타낸다.
### bounds를 활용해본 경험이 있나요? bounds는 언제 활용해볼 수 있을까요?
- frame으로 뷰의 위치를 잡아야하는 경우 슈퍼뷰의 bounds를 기준으로 잡을 수 있다.
### 오토레이아웃과 frame의 차이에 대해 설명해주세요
- frame은 슈퍼 뷰의 좌표계에서 뷰의 원점, 높이, 너비를 정의한다. UI 배치를 위해 뷰 계층 구조의 모든 뷰에 대한 크기와 위치를 계산해야 한다. 화면 회전 등의 변경 사항이 생기면 영향을 받는 모든 뷰에 대해 프레임을 다시 계산해야 한다. 하지만 직접 위치를 잡기 때문에 성능은 좋다.
- 오토레이아웃은 constraint를 통해 각 뷰의 크기와 위치를 계산한다. 이는 내부 및 외부 변경 사항 모두에 동적으로 대응하는 레이아웃을 생성한다. constraint는 두 뷰 간의 관계를 나타낸다.
### Intrinsic content size에 대해 설명해주세요
- 뷰의 현재 컨텐츠를 기반으로 크기가 정해진다. 레이블, 버튼 등은 표시되는 텍스트 양과 글꼴에 따라 결정되고 이미지 뷰는 이미지의 크기로 결정된다.
### CHCR에 대해 설명해주세요
- content hugging priority는 뷰가 늘어나지 않기 위한 우선 순위
- compression resistance priority는 뷰가 줄어들지 않기 위한 우선 순위
### Superview와 Safe Area에 제약을 줄 때 각각의 차이점을 설명해주세요
- Safe Area에 제약을 줄 때는 뷰가 디바이스의 안전한 표시 영역 내에서 레이아웃됨
- 뷰의 상위 컨테이너로서 Superview에 제약을 줄 때는 해당 뷰가 Safe Area를 고려하지 않고 전체 Superview에 대한 레이아웃을 설정함
## 2. Convenience init에 대해 설명해주세요
- 클래스를 위한 이니셜라이저. 일부 파라미터에 기본 값을 사용하여 designated 이니셜라이저를 호출한다. 특정 유즈케이스나 인풋값을 위해 만들 수도 있다. 공통 초기화 패턴에 대한 시간을 절약하거나 클래스 초기화 의도를 더 명확하게 만들 때 사용한다.
### Convenience init은 구조체에서 사용할 수 있나요?
- convenience init은 클래스를 위한 이니셜라이저이기 때문에 값 타입에서 사용할 수 없다.
### 왜 구조체에서 사용할 수 없나요?
- convenience init은 클래스를 위한 이니셜라이저이기 때문에 값 타입에서 사용할 수 없다. 구조체는 이니셜라이저를 designated와 convenience로 나누지 않는다.
### Convenience init이 필요한 이유가 무엇인가요?
- 공통 초기화 패턴에 대한 시간을 절약하거나 클래스 초기화 의도를 더 명확하게 만들 때 사용한다.
### Memberwise init에 대해 설명해주세요
- struct는 사용자 정의 이니셜라이저를 정의하지 않은 경우 자동으로 모든 프로퍼티를 초기화할 수 있는 이니셜라이저를 받는다.
### default init에 대해 설명해주세요
- class든 struct든 모든 프로퍼티에 기본값이 있고 이니셜라이저가 정의되어 있지 않은 경우 디폴트 이니셜라이저를 제공한다(init())
### 이니셜라이저 delegation rule(위임 호출) 3가지에 대해 설명해주세요
- 1. designated 이니셜라이저는 슈퍼 클래스의 designated 이니셜라이저를 호출해야 한다.
- 2. convenience 이니셜라이저는 같은 클래스 내의 다른 이니셜라이저를 호출해야 한다.
- 3. convenience 이니셜라이저는 궁극적으로 designated 이니셜라이저를 호출해야 한다.
### Failable Initializer(옵셔널 이니셜라이저)에 대해 설명해주세요
- 이니셜라이저가 초기화를 실패할 수 있는 경우에 사용됩니다. 초기화에 실패하면 nil을 반환하며, 성공하면 옵셔널 값이나 일반 객체를 반환합니다. 이를 통해 초기화 과정에서 오류가 발생할 수 있는 상황에서 안전하게 처리할 수 있습니다.
<!-- ### Two phase initialization에 대해 설명해주세요
- 스위프트의 클래스 초기화는 2단계 프로세스이다.
- 1단계에서 모든 저장 프로퍼티에 초기값이 할당된다.
- 지정 또는 편의 초기화가 클래스에서 호출됩니다.
- 해당 클래스의 새 인스턴스에 대한 메모리가 할당됩니다.
- 메모리가 아직 초기화되지 않았습니다.
- 해당 클래스의 지정된 초기화 프로그램은 해당 클래스에 의해 도입된 모든 저장 속성에 값이 있는지 확인합니다.
- 이제 이러한 저장된 속성에 대한 메모리가 초기화되었습니다.
- 지정된 초기화는 자신의 저장된 속성에 대해 동일한 작업을 수행하기 위해 슈퍼클래스 초기화로 전달됩니다.
- 이는 체인의 맨 위에 도달할 때까지 클래스 상속 체인을 계속 진행합니다.
- 체인의 맨 위에 도달하고 체인의 마지막 클래스가 모든 저장된 속성에 값이 있음을 확인하면 인스턴스의 메모리가 완전히 초기화된 것으로 간주되어 1단계가 완료됩니다.
- 2단계에서 클래스의 새 인스턴스가 사용할 준비가 된 것으로 간주하기 전에 저장된 프로퍼티를 추가로 사용자 정의할 수 있는 기회가 제공된다.
- 체인의 맨 위에서 아래로 작업하면 체인의 각 지정된 이니셜라이저에는 인스턴스를 추가로 사용자 정의할 수 있는 옵션이 있습니다. 이제 초기화 프로그램은 self에 액세스할 수 있고 해당 속성을 수정하고 인스턴스 메서드를 호출하는 등의 작업을 수행할 수 있습니다.
- 마지막으로 체인의 모든 편의 초기화에는 인스턴스를 사용자 정의하고 자체적으로 작업할 수 있는 옵션이 있습니다.
- 2단계 초기화 프로세스(two phase initialization)을 통해 프로퍼티 값이 초기화되기 전에 액세스되는 것을 방지하고 프로퍼티 값이 다른 이니셜라이저에 의해 예기치 않게 다른 값으로 설정되는 것을 방지한다.
### Two phase initialization의 safety check에 대해 설명해주세요
- 스위프트의 컴파일러는 2단계 초기화(two phase initialization)가 오류 없이 완료되었는지 확인하기 위해 4가지 세이프티 체크를 수행한다.
- 1. designated 이니셜라이저는 슈퍼 클래스의 이니셜라이저를 호출하기 전에 모든 프로퍼티가 초기화 되어야 한다. (객체에 대한 메모리는 모든 저장 프로퍼티의 초기 상태가 알려진 후에만 완전히 초기화된 것으로 간주한다. 이 규칙을 충족하려면 designated 이니셜라이저가 체인을 전달하기 전에 모든 프로퍼티가 초기화 되었는지 확인해야 한다.)
- 2. designated 이니셜라이저는 상속된 프로퍼티에 값을 할당하기 전에 슈퍼 클래스 이니셜라이저를 호출해야 한다. 그렇지 않은 경우 designated 이니셜라이저가 할당한 새 값은 슈퍼 클래스에 의해 덮어 쓰여진다.
- 3. convenience 이니셜라이저는 모든 프로퍼티에 값을 할당하기 전에 다른 초기화를 호출해야 한다. 그렇지 않은 경우 convenience 이니셜라이저가 할당한 새 값은 designated 이니셜라이저에 의해 덮어쓰여진다.
- 4. 이니셜라이저는 1단계 초기화가 완료되기 전에 인스턴스 메서드를 호출하거나 인스턴스 프로퍼티의 값을 읽거나, self를 값으로 참조할 수 없다. -->