---
# System prepended metadata

title: 1. iOS 앱의 상태 변화에 따라 호출되는 메서드 종류에 대해 설명해주세요.

---

# 1. iOS 앱의 상태 변화에 따라 호출되는 메서드 종류에 대해 설명해주세요.
## App Delegate와 Scene Delegate의 역할 차이는 무엇인가요?
SceneDelegate는 기존 AppDelegate에서 총괄하던 기능이 분리된것입니다. AppDelegate는 앱시작과 같은 애플리케이션 수준 이벤트 처리 SceneDelegate는 UISceneSession의 장면 생성, 파괴 및 상태 복원과 같은 장면의 생명주기 이벤트를 담당합니다. 

### 추가질문1) App Delegate와 Scene Delegate가 분리된 이유는 무엇인가요?
iPad-OS 에 도입된 새로운 다중 창 지원기능이 적용된 결과입니다. 그결과 AppDelegate의 작업을 두개로 분할합니다. AppDelegate는 애플리케이션 life Cycle 및 설정을 담당합니다. SceneDelegate는 화면 (Windows 또는 Scenes)에 표시되는 내용을 처리하고 앱이 표시되는 방식을 관리합니다.

### 추가질문2) 그럼 각자 하는 일은 뭔가요?
- AppDelegate의 역할
   - 앱의 중앙 데이터 구조 초기화하기
   - 앱의 장면 구성하기
   - 메모리 부족 경고, 다운로드 완료 알림 등과 같은 앱 외부에서 발생하는 알림에 응답하기
   - 앱 자체를 대상으로 하고 앱의 장면, 뷰 또는 뷰 컨트롤러에 국한되지 않는 이벤트에 응답합니다.
   - Apple 푸시 알림 서비스와 같은 출시 시 필요한 서비스에 등록하기

- SceneDelegate의 역할
    - 씬에 영향을 주는 상태 전이에 대한 응답 방법 정의 (전경으로 들어가서 활성화되거나 백그라운드로 진입할때와 같이)

### 추가질문3) Scene이 뭔가요?
- Scene은 기기에서 실행되는 앱의 UI인스턴스를 말합니다.
* 사용자에게 보여지는 뷰 계층(view hierarchy)를 가지고 있는 하나의 컨테이너
* 하나의 앱이 여러개의 Scene을 가질 수 있으며, 각각의 Scene이 서로 다른 객체이므로 독립적인 생명주기를 가지게 된다.

### 추가질문4) Scene의 생명주기에 대해 설명해주세요
* Unattached: Scene이 만들어 지지 않은 상태로 이후 AppDelegate내에서 설정을 하여 SceneDelegate가 생명주기를 관리
* Inactive: 앱이 실행중이지만, 앱 내부의 이벤트를 받지 못하는 상태
* active: 앱이 실행중이며 앱 내부의 이벤트를 받을 수 있는 상태
* Background: 앱 사용 중 다른 앱 실행, 홈 화면 등 앱 외부로 갔을 경우 백그라운드 상태로 넘어가고 백그라운드에서 실행 될 작업이 있으면 현재 상태에서 머무릅니다.(예시 음악)
* Suspended: 백그라운드 진입 후 추가적인 작업이 없을 경우 곧바로 Suspended상태로 넘어 갑니다. 추후 앱을 다시 실행할 경우 빠른실행을 위해 메모리에 남아 있는 상태지만, 메모리가 부족한 상황이 될 경우 메모리에서 해제시킵니다.

### 추가질문5) 앱이 Active -> InActive로 가는 예시를 들어주세요
* 배터리 부족 알림이 뜰 경우
* 외부 알림이 올 경우


# 2. GCD와 Operation의 차이에 대해 설명해주세요.
* Operation은 GCD기반으로 추상화한 객체로 취소, 순서, 상태확인 등의 다양한 기능을 가지고 있음
* 진행죽인 작업을 취소하는 등의 행위를 하기위해서는 Operation을 사용하여 구현해야함
* GCD와 Operation은 동시성 프로그래밍을 위해 사용되며 Operation은 GCD를 객체지향적으로 추상화시킨 조금 더 높은 수준의 동시성 프로그래밍을 지원합니다.

## 어떤 경우에 각각의 기술을 선택할지 자신의 선택 기준에 대해 알려주세요.
- 단순 작업일 경우에 GCD를 사용할 것이고 Operation은 작업 간의 관계나 취소, 상태 관리가 필요한 복잡한 작업에 사용할 것 같습니다.
- 그리고 Operation은 객체지향적 API이기 때문에 Swift 언어에 더 적절하다고 생각합니다.
- 예를들어 복잡한 작업이라면 단일 네트워크 요청이 아니라 여러개의 네트워크 요청을 수행하는 경우가 있을 것 같습니다.

## 각각의 기술을 사용할 때 작업을 취소하면 곧바로 취소가 되나요? - 작업을 취소할 때 벌어지는 일에 대해서 설명해주세요.

![](https://user-images.githubusercontent.com/73867548/153431140-fe224946-dbe3-4167-8569-0543a653308b.png)

- GCD는 디스패치큐에 추가된 작업을 제거하는 방법으로 취소를 하고 dispath handler를 이용해서 취소합니다.
- Operation은 현재 실행중이 Operation은 동작을 직접 취소하는 것이 아니라 isCancelled 프로퍼티의 값을 True로 변경해줍니다. 따라서 isCancelled 프로퍼티를 추적해서 작업을 관리합니다.
- Operation은 작업 중간에 중단할 수 있습니다.
- GCD는 작업 중일 경우 중단할 수 없다.

### 추가질문1)동기와 비동기에 대해 설명해주세요.
동기와 비동기는 하나의 스레드 내에서 작업을 수행하는 방식의 차이를 의미한다.

일반적인 동기와 비동기에 대한 설명은 다음과 같다:

| **동기 Synchronous** | **비동기 Asynchronous** |
| --- | --- |
|   -   큐에 보낸 태스크들이 완료될 때까지 기다린 후 다음 태스크를 실행하는 것을 의미한다. -   요청과 그 결과가 동시에 일어난다는 것이다. -   바로 요청을 하면 시간이 얼마나 걸리든 요청한 자리에서 결과가 주어져야한다. -   순서에 맞춰 진행되는 장점이 있지만, 여러가지 요청을 동시에 처리할 수 없다. -   설계가 매우 간단하고 직관적이라는 장점이 있다. -   결과가 주어질 때까지 아무것도 못하고 대기해야한다는 단점이 있다.   |   -   큐로 보낸 태스크의 완료 여부에 상관 없이 바로 다음 태스크를 수행하는 것을 비동기라고 한다. -   요청과 결과가 동시에 일어나지 않는다는 것이다. -   하나의 요청에 따른 응답을 즉시 처리하지 않아도, 그 대기 시간동안 또 다른 요청에 대해 처리 가능한 방식이다. -   결과가 주어지는데 시간이 걸리더라도 그 시간 동안에 다른 작업을 할 수 있으므로 자원들을 효율적으로 사용할 수 있다는 장점이 있다. -   설계가 동기에 비해 복잡하다는 단점이 있다.   |

### 추가질문2)동시성 프로그래밍시 발생할 수 있는 문제 중 하나인 race condition에 대해 설명해주세요
* 하나의 데이터에 대해서 여러 프로세스가 동시에 접근하여 읽고 쓰기를 수행할 때 어떠한 작업이 먼저 실행되고 끝남에 따라 실행결과가 달라질 수 있는 문제

### 추가질문3)race condition을 해결할 수 있는 방법에 대해 설명해주세요.
* DispatchSemaphore를 사용하여 특정 인스턴스에 대하여 접근 가능 쓰레드 수를 제한
* Serial Queue를 만들어 해당 객체는 특정 쓰레드에서만 동작하도록 구현

### 추가질문4) 동시성 프로그래밍하고 병렬프로그래밍 설명해주세요.
- 동시성 프로그래밍은 하나의 CPU가 여러작업을 동시에 하는것
- 병렬 프로그래밍은 여러개의 CPU가 하나의 작업을 분담해서 처리하는 

### 추가질문5) 아까 OperationQueue는 객체지향적 API라고 하셨는데, 객체지향적이라는게 뭔지 설명해주세요.
- 객체지향적이라는 것은 현실에서 표현할 수 있는, 즉 정의할 수 있는 것을 소프트웨어의 구성 요소로 모델링하는 개념입니다. 객체들 간의 상호작용으로 프로그램을 개발하는 방식입니다.