## 면접질문
### vetto
1. 오토레이아웃은 bounds를 다루는 걸까요? frame을 다루는 걸까요?
Frame
- iOS 화면 체계에서 bounds 와 frame의 차이를 설명해주세요
- frame은 Super View 좌표계에서 View의 위치와 크기를 나타냄
- bounds는 자신의 좌표계에서 View의 위치와 크기를 나타냄
- 가장 중요한 차이 : frame은 자기자신의 view를 이동, bouds는 viewport를 이동하여 subview들을 반대방향으로 이동한 것 처럼 보이게 한다.
- bounds를 활용해본 경험이 있나요? bounds는 언제 활용해볼 수 있을까요?
- ScrollView의 ContentOffset에서 사용(스크롤할 때)
- View를 회전한 후 View의 실제 크기를 알고 싶을 때
- View 내부에 그림을 그릴 때 (drawRect)
- 사각형의 view를 회전시켰을 경우 bounds와 frame 둘 중의 어떤 size가 변화하나요?
- frame의 크기가 달라진다. frame은 그 뷰를 감싸고 있는 사격형 형태의 틀이기 때문
2. Convinience init
- Convinience init에 대해 설명해주세요
- 지정생성자(init)보다 적은 갯수의 파라미터로 보다 편리하게 생성하기 위한 서브(Sub)개념의 생성자
- 편의 생성자(convenience)는 지정 생성자(designated)에 의존 및 호출(지정생성자가 저장 속성 초기화)
- 상속했을때, 편의생성자의 경우 서브클래스에서 재정의를 못함(하위에서 호출불가가 원칙)
- 편의생성자는 다른 편의생성자를 호출하거나, 지정생성자를 호출해야함 (궁극적으로는 지정생성자를 호출)
- Convinience init은 구조체에서 사용할 수 있나요?
- 사용할 수 없다.
- 구조체의 경우, convenience키워드를 붙이지 않아도 다른 생성자를 호출 가능하기 때문에 필요가 없다. (또한 Convinience init은 상속과 관련된 생성자이므로 상속이 없는 구조체에서는 사용할 수 없다.)
- Convinience init이 필요한 이유가 무엇인가요
- 초기화 과정을 간편하게 제공하기 위함이다.
- 실질적으로 가능한 지정생성자의 갯수를 줄이고, 편의생성자에서 지정생성자 호출하도록 하는 것이 바람직하다.
- 추가 질문
- Convinience init은 자동 상속이 되거나 재정의가 가능한가요?
- 재정의는 불가능하다. 다만, 특정 상황에서 자동 상속은 된다.
- Convinience init이 자동 상속 되는 상황을 설명해주세요
- 상위 지정생성자를 모두 상속하는 경우에 자동 상속 된다. 이는 지정생성자가 모두 자동 상속이 되는 경우와 지정생성자를 모두 재정의하는 경우이다.
## 리지
### 1. iOS 앱의 상태 변화에 따라 호출되는 메서드 종류에 대해 설명해주세요.
#### App Delegate와 Scene Delegate의 역할 차이는 무엇인가요?
SceneDelegate는 기존 AppDelegate에서 총괄하던 기능이 분리된것입니다. AppDelegate는 앱시작과 같은 애플리케이션 수준 이벤트 처리 SceneDelegate는 UISceneSession의 장면 생성, 파괴 및 상태 복원과 같은 장면의 생명주기 이벤트를 담당합니다.
- AppDelegate의 역할
- 앱의 중앙 데이터 구조 초기화하기
- 앱의 장면 구성하기
- 메모리 부족 경고, 다운로드 완료 알림 등과 같은 앱 외부에서 발생하는 알림에 응답하기
- 앱 자체를 대상으로 하고 앱의 장면, 뷰 또는 뷰 컨트롤러에 국한되지 않는 이벤트에 응답합니다.
- Apple 푸시 알림 서비스와 같은 출시 시 필요한 서비스에 등록하기
- SceneDelegate의 역할
- 씬에 영향을 주는 상태 전이에 대한 응답 방법 정의 (전경으로 들어가서 활성화되거나 백그라운드로 진입할때와 같이)
#### App Delegate와 Scene Delegate가 분리된 이유는 무엇인가요?
- iPadOS 에 도입된 새로운 다중 창 지원기능이 적용된 결과입니다. iOS13버전 이후 나뉘게 되었습니다.
#### Scene이 뭔가요?
- Scene은 기기에서 실행되는 앱의 UI인스턴스를 말합니다.
- 사용자에게 보여지는 뷰 계층(view hierarchy)를 가지고 있는 하나의 컨테이너
- 하나의 앱이 여러개의 Scene을 가질 수 있으며, 각각의 Scene이 서로 다른 객체이므로 독립적인 생명주기를 가지게 된다.
#### Scene의 생명주기에 대해 설명해주세요
- Unattached: Scene이 만들어 지지 않은 상태로 이후 AppDelegate내에서 설정을 하여 SceneDelegate가 생명주기를 관리
- Inactive: 앱이 실행중이지만, 앱 내부의 이벤트를 받지 못하는 상태
- active: 앱이 실행중이며 앱 내부의 이벤트를 받을 수 있는 상태
- Background: 앱 사용 중 다른 앱 실행, 홈 화면 등 앱 외부로 갔을 경우 백그라운드 상태로 넘어가고 백그라운드에서 실행 될 작업이 있으면 현재 상태에서 머무릅니다.(예시 음악)
- Suspended: 백그라운드 진입 후 추가적인 작업이 없을 경우 곧바로 Suspended상태로 넘어 갑니다. 추후 앱을 다시 실행할 경우 빠른실행을 위해 메모리에 남아 있는 상태지만, 메모리가 부족한 상황이 될 경우 메모리에서 해제시킵니다.
#### 앱이 Active -> InActive로 가는 예시를 들어주세요
- 배터리 부족 알림이 뜰 경우
- 외부 알림이 올 경우
### 2. GCD와 Operation의 차이에 대해 설명해주세요.
GCD와 Operation은 동시성 프로그래밍을 위해 사용되며 Operation은 GCD를 객체지향적으로 추상화시킨 조금 더 높은 수준의 동시성 프로그래밍을 지원합니다.
- Operation은 GCD기반으로 추상화한 객체로 취소, 순서, 상태확인 등의 다양한 기능을 가지고 있음
- 진행중인 작업을 취소하는 등의 행위를 하기위해서는 Operation을 사용하여 구현해야함
#### 어떤 경우에 각각의 기술을 선택할지 자신의 선택 기준에 대해 알려주세요.
단순 작업일 경우에 GCD를 사용할 것이고 Operation은 작업 간의 관계나 취소, 상태 관리가 필요한 복잡한 작업에 사용할 것 같습니다.
그리고 Operation은 객체지향적 API이기 때문에 Swift 언어에 더 적절하다고 생각합니다.
예를들어 복잡한 작업이라면 단일 네트워크 요청이 아니라 여러개의 네트워크 요청을 수행하는 경우가 있을 것 같습니다.
#### 각각의 기술을 사용할 때 작업을 취소하면 곧바로 취소가 되나요? - 작업을 취소할 때 벌어지는 일에 대해서 설명해주세요.
GCD는 디스패치큐에 추가된 작업을 제거하는 방법으로 취소를 하고 dispath handler를 이용해서 취소합니다.
Operation은 현재 실행중이 Operation은 동작을 직접 취소하는 것이 아니라 isCancelled 프로퍼티의 값을 True로 변경해줍니다. 따라서 isCancelled 프로퍼티를 추적해서 작업을 관리합니다.
Operation은 작업 중간에 중단할 수 있습니다.
GCD는 작업 중일 경우 중단할 수 없다.

#### 동기와 비동기에 대해 설명해주세요.
| **동기 Synchronous** | **비동기 Asynchronous** |
| --- | --- |
| - 큐에 보낸 태스크들이 완료될 때까지 기다린 후 다음 태스크를 실행하는 것을 의미한다. - 요청과 그 결과가 동시에 일어난다는 것이다. - 바로 요청을 하면 시간이 얼마나 걸리든 요청한 자리에서 결과가 주어져야한다. - 순서에 맞춰 진행되는 장점이 있지만, 여러가지 요청을 동시에 처리할 수 없다. - 설계가 매우 간단하고 직관적이라는 장점이 있다. - 결과가 주어질 때까지 아무것도 못하고 대기해야한다는 단점이 있다. | - 큐로 보낸 태스크의 완료 여부에 상관 없이 바로 다음 태스크를 수행하는 것을 비동기라고 한다. - 요청과 결과가 동시에 일어나지 않는다는 것이다. - 하나의 요청에 따른 응답을 즉시 처리하지 않아도, 그 대기 시간동안 또 다른 요청에 대해 처리 가능한 방식이다. - 결과가 주어지는데 시간이 걸리더라도 그 시간 동안에 다른 작업을 할 수 있으므로 자원들을 효율적으로 사용할 수 있다는 장점이 있다. - 설계가 동기에 비해 복잡하다는 단점이 있다. |
#### 동시성 프로그래밍시 발생할 수 있는 문제 중 하나인 race condition에 대해 설명해주세요
* 하나의 데이터에 대해서 여러 프로세스가 동시에 접근하여 읽고 쓰기를 수행할 때 어떠한 작업이 먼저 실행되고 끝남에 따라 실행결과가 달라질 수 있는 문제
#### race condition을 해결할 수 있는 방법에 대해 설명해주세요.
* DispatchSemaphore를 사용하여 특정 인스턴스에 대하여 접근 가능 쓰레드 수를 제한
* Serial Queue를 만들어 해당 객체는 특정 쓰레드에서만 동작하도록 구현
#### 동시성 프로그래밍하고 병렬프로그래밍 설명해주세요.
- 동시성 프로그래밍은 하나의 CPU가 여러작업을 동시에 하는것
- 병렬 프로그래밍은 여러개의 CPU가 하나의 작업을 분담해서 처리하는
#### 아까 OperationQueue는 객체지향적 API라고 하셨는데, 객체지향적이라는게 뭔지 설명해주세요.
- 객체지향적이라는 것은 현실에서 표현할 수 있는, 즉 정의할 수 있는 것을 소프트웨어의 구성 요소로 모델링하는 개념입니다. 객체들 간의 상호작용으로 프로그램을 개발하는 방식입니다.
----
----
### sehong
1. Singleton 디자인 패턴을 활용하는 경우를 예를 들어 설명해주세요
- 싱글톤 패턴은 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을때 사용합니다.
예를 들어서 사용자 정보를 저장하는 클래스를 만들고 사용자 정보는 여러화면에서 접근할 수 있어야하고 일관된 정보를 유지해야하는데 각 화면이 별도의 사용자인스턴스를 생성하고 사용한다면 각 인스턴스는 서로 다른 정보를 가질 수 있어서 일관성을 유지하는데 어려운데 이런 상황에서 싱글톤 패턴을 사용하면 사용자 정보인스턴스는 단 한번만 생성되고, 여러 화면이 공유해서 사용할 수 있게 된다. 주로 환경설정, 네트워크 관리등과 같이 한번만 생성되어야하고 여러 객체에서 접근할 필요가 있는 객체에 대해 사용됩니다.
### 꼬리질문
1-1. 싱글턴 디자인 패턴의 장단점을 설명해주세요
- 장점: 메모리 낭비를 방지할 수 있고, 전역인스턴스로 자원공유가 쉽다.
- 단점: 싱글톤 인스턴스가 너무 많은 일을 하거나, 많은 데이터를 공유시킬경우 다른 클래스의 인스턴스들 간 결합도가 높아져서 객체지향 설계원칙(개방-폐쇄)에 어긋나고, 수정과 테스트가 어려워진다.
1-2. 싱글톤 패턴으로 구현된 객체를 인스턴스화하지 않기 위해서는 어떤 방법을 사용해야 할까요?
- 객체의 생성자를 private으로 설정하여 외부에서 인스턴스화를 막을 수 있습니다, private init() 사용
1-3. swift에서 싱글톤을 사용하는 예시가 뭐가 있나요?
- UIScreen, UserDefaults, UIApplication, FileManager,Notification 이 있다고 합니다
https://babbab2.tistory.com/66
----
2. View Contoller의 View의 상태변화에 따른 메서드의 호출순서를 이야기해보세요
- loadView() -> viewDidLoad() -> viewWillAppear() -> viewDidAppear()> viewWillDisappear() -> viewDidDisappear() 순서로 호출
### 꼬리질문
2-1. viewWillAppear와 viewDidAppear에서 무엇을 하면 좋을까요?
- viewWillAppear - view가 나타날거라는 신호를 controller에게 알리고 화면이 나타날때마다 수행하는 작업을 진행한다. 예를 들어서 데이터 불러오기.
- viewDidAppear - view가 나타났다는 것을 controller에게 알리는 역할을하고, view가 나타났을때 수행할 추가작업을 진행합니다. 애니메이션 적용.
2-2. loadView와 viewDidLoad의 차이가 뭘까요?
- loadView: 뷰 컨트롤러가 자신의 뷰를 로드할 때 호출되는 메서드입니다. 뷰 컨트롤러가 자신의 뷰에 처음으로 접근할 때 시스템에 의해 자동으로 호출됩니다. 뷰 컨트롤러의 메인 뷰를 생성하고, 해당 뷰의 속성을 설정하고, 그 뷰를 뷰 컨트롤러의 뷰 속성에 할당합니다.
- viewDidLoad: 뷰 컨트롤러의 뷰가 메모리에 완전히 로드된 후에 호출되는 메서드입니다. 일반적으로 추가적인 초기화 작업을 수행하며, 뷰의 배경색을 설정하거나 데이터를 로드하는 등의 작업을 합니다. 뷰 컨트롤러의 생명 주기에서 한 번만 호출되기 때문에, 한 번만 수행해야 하는 작업은 여기에서 처리하는 것이 적절합니다.
https://mrgamza.tistory.com/279
https://yagom.net/forums/topic/loadview와-viewdidload-차이에-대한-질문입니다/
https://medium.com/yay-its-erica/viewdidload-vs-loadview-swift3-47f4ad195602
https://zeddios.tistory.com/43
----
3. 스위프트 언어의 String에서 subscript를 통해 문자에 접근할 수 없는 이유에 대해 설명해주세요.
- String에서 subscript를 통해 문자에 접근할 수 없는 이유는 String이 Unicode를 기반으로 하며, 그 문자열의 요소가 가변적인 크기를 가지기 때문입니다.
### 꼬리질문
3-1. 스위프트에서 문자열의 특정 위치에 접근하려면 어떻게 해야하나요?
- String.Index 활용
```swift
let name = "sehong"
let index = name.index(name.startIndex, offsetBy: 1)
print(name[index])
```
https://velog.io/@hansangjin96/Swift-String%EC%9D%80-%EC%99%9C-subscriptInt%EB%A1%9C-%EC%A0%91%EA%B7%BC%EC%9D%B4-%EC%95%88%EB%90%A0%EA%B9%8C
https://jeong9216.tistory.com/556#extension-%ED%95%B4%EC%84%9C-%EB%B0%B0%EC%97%B4%EC%B2%98%EB%9F%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
오토레이아웃 - 슈퍼뷰와 다른뷰와의 관계
어떤걸 중점적으로 조작하게될까 ?
프레임? 그렇지않을까요?
프레임을 베이스로 움직이는 친구라서
사전적인 의미인 bounds와 프레임의 차이를
view programming guide에서 이해해봐라
xcode들어가보면 요소를 누른뒤에인슽펙터 보면 frame과 연관되어잇다.
###### tags: `면접`