# 면접 답변 정리 **1. Bounds 와 Frame 의 차이점을 설명하시오.** 가장 기본적인 차이는 어떤 좌표계가 기준이 되는가라고 할 수 있습니다. Frame의 경우는 상위뷰의 좌표계가 기준이 되며, Bounds는 자체 좌표계가 기준이 된다. 두번째로는 뷰를 회전하였을때의 값이 다르다는 것입니다. Frame의 같은 경우 해당 뷰를 감쌀 수 있을 만큼 값이 커지지만, Bounds는 변화가 없습니다. 두가지의 대표적인 사용 예시로는 Frame은 UIView의 위치나 크기를 설정하는 경우가 있고, Bounds는 대표적으로 ScrollView에서 사용이 됩니다. **2. 실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오.** 시뮬레이터를 사용할 수 있습니다. 시뮬레이터는 신속한 개발을 위한 좋은 장치이며 변경결과를 빠르게 확인할 수 있게 도와주고, 오류를 디버깅하고, 테스트를 진행할 수 있습니다. 하지만 시뮬레이터와 실제 디바이스간에는 차이가 있습니다. 대표적으로 두가지 차이점이 있습니다. 첫번째로는 하드웨어의 차이 입니다. 실제 기기와는 다르게 시뮬레이터는 카메라, 블루투스 등을 사용할 수 없습니다. 두번째로는 API의 차이가 있습니다. 애플의 푸시알림, Media Player등을 사용 할 수 없게 됩니다. 이외에도 맥을 기반으로 실행 되기 때문에 근본적인 성능 및 용량의 차이가 있습니다. **3. struct와 class와 enum의 차이를 설명하시오.** class는 참조타입이고 struct와 enum은 값타입 입니다. class는 참조타입이기 때문에 메모리 주소가 전달되고 heap영역에 저장이 됩니다. struct와 enum은 값타입이기 때문에 값의 복사가 이루어지고 stack영역에 저장이 됩니다. 상속의 가능여부도 가장 대표적인 차이점 입니다. 클래스만 상속이 가능합니다. 메모리에서 해제 되는 과정에서도 차이를 보입니다. Class는 ARC를 통해 참조 카운트가 0이 되었을때 힙영역에서 메모리 해제 되며 이때 순환참조에 의한 메모리누수에 유의를 해야합니다. 나머지 두개의 타입은 스택영역에서 자동으로 해제됩니다. 개인적으로는 상속과 값을 공유해야하는 참조가 필요한 것이 아니라면 기본적으로 구조체를 사용하며, enum은 연관된 값들의 모임을 만들 때 주로 사용합니다. **4. 앱의 콘텐츠나 데이터 자체를 저장/보관하는 특별한 객체를 무엇이라고 하는가?** 데이터베이스라고 생각한다. 제가 사용해본 데이터베이스는 UserDefault가 있다. 또한 데이터베이스는 아니지만 CoreData 프레임 워크도 사용해 봤다. UserDefault는 [데이터,키(key]형태로 데이터를 저장하는데, 사용자 기본 설정과 같은 단일 데이터 저장에 적합하다. CoreData는 디바이스에 permanent data를 저장할 수 있도록 해주는 Framework이다. CoreData의 기능 중 하나인 Persistence(SQLite를 지원받음)를 사용 하여 저장을 한다. **5. class의 성능을 향상 시킬 수 있는 방법들을 나열해보시오.** class는 상속이 가능하기 때문에 하위클래스에서 메서드가 오버라이드 될 가능성이 존재한다. 그렇기 때문에 Dynamic Dispatch 방식으로 메서드를 호출한다. Dynamic Dispatch는 런타임시에 일어나기 때문에 성능상 손해를 보게 된다. 하지만 final 키워드를 붙여주게 되면 상속의 가능성을 배제할 수 있기 때문에 Static Dispatch로 함수를 호출하게 된다. 결과적으로 컴파일 타임에 함수를 호출하게 되고, 성능은 올라가게 된다. 또한 private 키워드를 사용할 경우 참조할 수 있는 곳이 현재 파일로 제한 되기 때문에 컴파일러는 자동적으로 private 키워드가 참조될 수 있는 곳에서 오버라이딩이 되는지 안되는지 판단 가능하다. 쉽게 말해 private키워드가 있는 객체는 final 키워드가 없더라도 오버라이딩이 되지 않고 있다면, 자동적으로 static dispatch로 동작한다. **6. Copy On Write는 어떤 방식으로 동작하는지 설명하시오.** 프로그래밍에서 복사 동작을 할 때, 실제 원본이나 복사본이 수정되기 전까지는 복사를 하지 않고 원본 리소스를 공유했다가, 원본이나 복사본에서 수정이 일어날 경우, 그때 복사 작업을 하는 것입니다. 이 방식을 사용하는 이유는 복사는 했으나, 수정을 진행하지 않는 경우 불필요한 메모리의 낭비를 방지하기 위해서 입니다. **7. App thinning에 대해서 설명하시오.** 앱 스토어와 운영체제가 사용자의 기기 환경에 맞게 앱의 설치를 최적화 하는 것을 앱 시닝이라고 한다. 앱 시닝을 통해 기기의 대부분의 특성들을 사용하고 최소한의 디스크 공간을 차지하며 Apple이 추후에 적용할 업데이트를 수용할 수 있는 앱을 생성할 수 있다. 기타 리소스가 있는 범용 앱(universal app) 하나를 업로드 하면, 앱스토어에서 슬라이스가 발생하게 됩니다. 앱스토어가 디바이스의 특성을 보고, 위 그림처럼 필요한것만 조합해서 별도의 IPA를 만듭니다. **8. Convenience init에 대해 설명하시오.** 지정생성자보다 적은 갯수의 파라미터로 보다 편리하게 생성하기 위한 서브(Sub)개념의 생성자를 말한다. 편의 생성자(convenience)는 지정 생성자(designated)에 의존 및 호출(지정생성자가 저장 속성 초기화)하며, 초기화 과정을 간편하게 제공하기 위해서 사용된다. - 상속했을때, 편의생성자의 경우 서브클래스에서 재정의를 못함(하위에서 호출불가가 원칙) 
 - 편의생성자는 다른 편의생성자를 호출하거나, 지정생성자를 호출해야함 (궁극적으로는 지정생성자를 호출) **9. AnyObject에 대해 설명하시오.** 모든 클래스가 암시적으로 준수하는 프로토콜을 말한다. AnyObject로 선언된 값은 클래스만 할당 가능하다. 런타임 시점에 타입이 결정나기 때문에, 만약 오류가 난다면 런타임 오류로 빠지게 되어 앱이 꺼질 수 있음 **10. 앱이 시작할 때 main.c 에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?** object-c 1.앱이 실행되면서 맨 처음 main()함수가 실행된다 2.main()함수는 UIApplicationMain()함수를 호출한다 3.UIApplicationMain()함수가 UIApplication객체를 생성한다. 이 객체는 앱의 본체에 해당. 4.UIApplication객체는 info.plist 파일로부터 앱 구성에 필요한 정보들을 로드한다. 5.이벤트 루프 및 초기설정을 진행한다. 6.실행 완료 직전에 앱 델리게이트의 application(_:didFinishLaunchingWithOptions:)메소드가 호출된다. swift : 스위프트는 main 함수가 없지만 @main 이라는 어노테이션 표기가 있다. 이 표기를 통해서 object-c의 1-5 과정이 대체된다 @main 어노테이션을 찾고 그 클래스를 실행한다 AppDelegate클래스의 application(:didFinishLaunchingWithOptions:)메소드를 호출한다(앱이 실행될때 처리할 내용이 있으면 여기에 작성) 이벤트루프 실행, 작성한 코드들이 실행 앱이 종료될때 앱에대한 메모리 제거를 위해서 pplicationWillTerminate(:)메소드를 호출(앱이 종료될떄 처리할 내용이 있으면 어기에 작성) ### UIApplication 객체 기능 - 들어오는 터치 이벤트를 일시적으로 중단 → beginIgnoringInteractionEvents() - 원격 알림 등록 → registerForRemoteNotifications() - UI 실행 취소-다시 실행 트리거 → applicationSupportsShakeToEdit - URL 체계를 처리하기 위해 등록된 앱이 설치되어 있는지 확인 → canOpenURL(_:) - 백그라운드에서 작업을 완료 할 수 있도록 앱 실행 확장 → beginBackgroundTask(expirationHandler:), beginBackgroundTask(withName:expirationHandler:) - 로컬 알림 예약 및 취소 → scheduleLocalNotification(:), cancelLocalNotification(:) - 원격 제어 이벤트 수신 조정 → beginReceivingRemoteControlEvents(), endReceivingRemoteControlEvents() - 앱 수준 상태 복원 작업 수행 (상태 복원 동작 관리 작업 그룹의 방법) **11. Optional 이란 무엇인지 설명하시오.** Optional은 변수의 값이 nil일 수 있다는 것을 표현합니다. Swift는 안전한 코딩을 할 수 있게 해주는 언어입니다. 이때 이 안전성의 기본 바탕에 있는 중요한 요소 중 하나가 Optional입니다. Swift는 기본적으로 non-optional을 지원하면서 갖는 큰 장점이 있는데, nil에 대한 컴파일 에러를 통해 개발자는 nil에 대해 명확한 예외처리가 강제되며, 런타임에 nil로 인한 문제를 컴파일 단계에서 예방할 수 있습니다. 그래서 Swift가 잠재적 오류에 대해 안전하다는 말도 합니다. **12. Struct 가 무엇이고 어떻게 사용하는지 설명하시오.** 객체지향 프로그래밍을 할 수 있도록 도와주는 요소로 코드를 추상화 하기 위해 사용한다. 쉬게 말해 연관있는 데이터를 묶어서 관리할 수 있게 해주는 문법이다. 구조체 안에는 상수, 변수, 함수를 선언해서 사용할 수 있고, Value type으로 대입 시에는 값이 복사된다 **13. @Main에 대해서 설명하시오.** @main은 어디서부터 이 앱이 최초 실행되고 시작될지를 명시해주는 키워드(UIKit프레임워크에 존재하는 main() 함수를 사용한다는 의미) **14. Subscripts에 대해 설명하시오.** 클래스, 구조체 그리고 열거형에서 스크립트를 정의해 사용할 수 있다. 서브스크립트란 콜렉션, 리스트, 시퀀스 등 집합의 특정 멤버 요소에 간단하게 접근할 수 있는 문법이다. 서브스크립트를 이용하면 추가적인 메소드 없이 특정 값을 할당(assign)하거나 가져올 수(retrieve) 있다. **15. String은 왜 subscript로 접근이 안되는지 설명하시오.** Swift의 String은 Struct타입이고, characters의 collection이다. 즉 Array<Element>의 element가 Character인 배열이다. 하지만 Swift에서 String은 subscript, 즉 str[0]같이 Int로 접근하지 못하고, String.index로 접근해야한다. 그 이유는 Swift에서 Character는 1개 이상의 Unicode Scalar로 이루어져 있다. 즉 크기가 가변적이다.(스위프트가 메모리 최적화를 하기 때문에) applicationWillResignActive : active -> inactive 상태로 전환시 inactive전환 직전 실행 : 잠시 전환되는 경우 applicationDidEnterBackground : background 상태전환 직후 applicationWillEnterForeground : background -> foreground 상태로 전환시 foreground직전 applicationDidBecomeActive : active상태직후 : 화면으로 돌아올 때마다 실행 applicationWillTerminate : 앱 종료시 willFinishLaunching : didFinish전에 호출되는 함수 didFinishLaunching : 앱 실행시 1번만 실행되는 함수 # 앱의 생명 주기 여러가지 앱을 사용하다 보면 앱이 비활성화되거나 다른앱으로 또는 백그라운드로의 전환, 종료 될 수 있다. 이때 실행 시점을 파악하기 위해 앱의 생명주기 공부가 필요. 만약 게임을 하던 도중 전화가 왔을때 데이터가 저장이 안되서 다 날라 갈 수 있음 이때 필요한 개념 [앱델리게이트가 관장] Not Running ForeGround 화면을 점유하고 있는 상태 - Active: 앱이 실행 중 - Inactive: 문자 메세지 등으로 잠시 앱 컨트롤 불가 BackGround 화면을 점유하고 있지 않은 상태 제한적 실행만 가능하도록 os에서 통제 (음악앱 정도만 허용) 데이터를 저장하거나 점유하고 있는 공유 자원을 해제하는 등 종료되기 전에 필요한 준비 작업을 진행 Suspended 대기상태 각 상황에서 App의 상태는 어떻게 변화할까요? 1. 핸드폰을 처음 켜고 App을 실행했을 때 - Not Running -> didFinishLaunchingWithOptions-> sceneWillEnterForeground(Froeground) -> Inative -> sceanDidBecomeActive -> Active 2. App 실행 화면에서 멀티태스킹 화면으로 이동했을 때 - Active -> sceneWillResignActive -> Inactive 3. App 실행 화면에서 이전 앱으로 전환했을 때 - Active -> sceneWillREsignActive -> Inactive -> sceneDidEnterBackground -> Background -> sceneDidDisconect -> Suspended 4. 앱 실행 중 전화 알림이 왔을 때, 상단 바에 알림창이 떠있는 경우 (앱 전체를 안가리는 경우) - Active -> sceneWillResignActive -> Inactive 5. 앱 실행 중 전화 알림이 왔을 때, 전화 화면이 전체 화면으로 뜨는 경우 (앱 전체를 가리는 경우) - Active -> sceneWillREsignActive -> Inactive -> sceneDidEnterBackground -> Background -> sceneDidDisconect -> Suspended 씬/윈도우 원래는 윈도우(하나) 아이패드가 생기면서 신이라는 개념 생김 (멀티 윈도우)구현위해 ## Singleton 디자인 패턴을 활용하는 경우를 예를 들어 설명해주시오. + `UIApplication` , `NotificationCenter` , `URLSession`, `URLCache` + 혹시 다른 클래스에서 NSCache 타입의 변수를 선언하면 클래스가 메모리에서 해제되거나 초기화될 때 캐시도 초기화되므로 싱글톤을 통해서 실수로 초기화하는 일이 없게 하기 위해서 + NotificationCenter.default를 사용하면 앱 전체에서 해당 알림을 광범위하게 관찰할 수 있기 때문에 defualt는 Singleton 패턴으로 구현되어 있다. + UIApplication은 앱에서 하나만 존재해야 하기 때문에 싱글톤 패턴으로 구현되어 있다. ## 싱글턴 디자인 패턴의 장단점을 설명해주세요 - 장점 - 인스턴스를 최초 1회만 생성하므로 메모리와 성능 측면에서 효율이 좋다 - 클래스 간 데이터 공유가 쉽다. - 인스턴스가 1개라는 것을 보증받는다.(Thread Safe) - 단점 - 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 개방-폐쇄 원직을 위배하게 된다. ⇒ 수정과 테스트가 어려워진다. ### 꼬리 질문 Q1. 싱글톤 패턴으로 구현된 객체를 인스턴스화하지 않기 위해서는 어떤 방법을 사용해야 할까요? - private init을 사용한다. Q2. 인스턴스들 간에 결합도를 낮추기 위해서는 어떻게 해야 할까? - 추상화된 객체를 의존하게 만들면 결합도를 낮출 수 있다. AppDelegate은 2가지 역할을 했는데, application에게 process level의 이벤트 발생을 알려주었고 UI의 상태변화를 알려주었다. iOS 12 이하 버전의 AppDelegate UI의 상태변화를 메소드들을 통해 application에게 알리는 역할을 한다. 기존 AppDelegate들이 갖고 있던 메소드들과 거의 1:1 mapping이 가능하다. 2. 모델 객체의 어떤 값이 변경되었을 경우 이를 UI에 반영하기 위해서 컨트롤러는 모델 객체에 Observing을 도입하여 델리게이트에 특정 메시지를 보내 처리할 수 있도록 하는 것 즉, 변수에 코드를 붙여 변수가 변경될 때마다 코드가 실행되도록 하는 방법을 의미한다. property observers(willset , didSet)과 아주 유사한데 KVO는 타입 정의 밖에서 observe를 추가한다는 점이 다르다. KVO는 순수 스위프트 코드로는 그리 좋지 않은데, 그 이유는 Objective-c 런타임에 의존 하고 있기 때문이다. 그래서 NSObject를 상속받기 위해 @objc 를 반드시 붙여줘야 한다. 특히 KVO는 속성 각각에 @objc dynamic 을 붙여줘야 한다. https://neph3779.github.io/ios/DelegateVsNotification/ - GCD API 동작 방식과 필요성에 대해 설명하시오. 업(Task)을 “대기행렬”에 보내기만 하면, 큐(Queue) 우리의 iOS(운영체제시스템)가 알아서 여러쓰레드로 나눠서 분산처리를 한다. 항상 선입선출 (FIFO)로 동작 - Global DispatchQueue 의 Qos 에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오. ![](https://i.imgur.com/3sVdUm6.png) ![](https://i.imgur.com/mrAvWli.png) - NSOperationQueue 와 GCD Queue 의 차이점을 설명하시오. NSOperationQueue → 동시에 실행할수있는 연산의 최대수 지정가능 → Key Value Observing(KVO)를 사용할수있는 많은 프로퍼티들이 있음 → 일시중지, 다시시작, 취소가능 → 디폴트 concurrent GCD Queue → C기반 → 가벼움 → 디폴트 serial Operation Queue : 비동기적 실행작업을 객체 지향적인 방법으로 사용하는데 적합 Dispatch Queue : 작업이 복잡하지않고 간단하게 처리하거나 특정유형 시스템이벤트 비동기처리시 적합(ex: 타이머, 프로세스 ) - 멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명하시오. 멀티 스레딩을 사용하는 이유 시간이 오래걸리는 작업 진행 시 어플리케이션의 실행을 방해하면 안되기에 멀티 코어에서 큰 작업을 여러개로 분할하여 진행해야 하기에 메모리 공간과 시스템 자원 절약하기 위해서 고려해야할 점 어떤 작업을 글로벌 큐에 넣어야 할지 정확히 알아둬야 함 글로버 큐에 작업을 배치할 때, 작업에 따라 QoS를 적절하게 사용해야함 동기로 할지 비동기로 할지를 명확하게 정의해야함 상황에 따라 작업간의 인과관계를 설정하거나 특정 시간 이후에 처리하도록 설정해야함 직접적으로 스레드를 관리하지 않고 Queue를 활용하여 작업을 분산 처리하고 GCD, Operation을 이용하여 iOS에서 알아서 스레드 숫자를 관리한다. 그리고 다른 스레드에서 작업들이 "비동기적으로 동작"하도록 만든다. (GCD Queue, NSOperationQueue QoS란 global queue를 사용할때, 작업마다 중요도를 매겨서 순위에 따라 처리하는 것 User-interactive: 즉시 완료해야하는 작업을 나타냄. UI 업데이트, 이벤트 처리 등에 사용. 메인 스레드에서 실행되어야 함. User-initiated: 사용자 상호 작용을 계속하는 데 필요한 작업을 기다리고 있을 때 사용. Utility: 사용자에게 표시되는 진행률 표시가 있는 장기 실행 작업을 나타냄. 계산, I/O, 네트워킹, 연속 데이터 피드 및 유사한 작업에 사용. 우선 순위가 낮은 글로벌 큐에 매핑 Background: 사용자가 직접 알지 못하는 작업을 나타냄. 유저 관리 및 사용자 상호 작용이 필요하지 않고 시간에 민감하지 않은 기타 작업에 사용. - iOS 앱을 만들고, User Interface를 구성하는 데 필수적인 프레임워크 이름은 무엇인가? UI KIT `UI(User Interface)`라는 이름에서 알 수 있듯이, UIKit 프레임워크는 사용자의 인터페이스를 관리하고, 이벤트를 처리하는게 주 목적인 프레임워크다. 사실 `iOS`이전의 `macOS`에서는 비슷한 개념으로 `Application kit`줄여서 `Appkit`이라는 프레임워크를 사용했었지만, iOS로 넘어오면서 비슷한 개념을 가진 `UIkit`으로 대체되었다. `UIkit`에서 주로 처리하는 사용자 이벤트로는 `제스처 처리`, `애니메이션`, `그림 그리기`, `이미지 처리`, `텍스트 처리` 등이 있다. 또한 테이블뷰, 슬라이더, 버튼, 텍스트 필드, 얼럿 창 등 애플리케이션의 화면을 구성하는 요소도 포함한다. 그렇기 때문에, 자주 사용하는 `UIViewController`, `UIView`(당연히 이를 상속하는 버튼, 텍스트 필드 등도 포함), `UIAlertController`등 앞에 `UI`가 붙는 클래스들을 사용하려면 반드시 `UIkit`을 상속해야 한다. - Foundation Kit은 무엇이고 포함되어 있는 클래스들은 어떤 것이 있는지 설명하시오. Foundation Kit은 Cocoa Touch framework에 포함되어 있는 프레임워크 중 하나 String, Int 등의 원시 데이터 타입과 컬렉션 타입 및 운영체제 서비스를 사용해 앱의 기본적인 기능을 관리하는 프레임워크 Foundation 내에 포함된 클래스들은 앞에 NS가 붙는다. 주로 사용하는 기능들 ### 기본 `Number, Data, String`: 원시 데이터 타입 사용 `Collection`: Array, Dictionary, Set 등과 같은 컬렉션 타입 사용 `Date and Time`: 날짜와 시간을 계산하거나 비교하는 작업 `Unit and Measurement`: 물리적 차원을 숫자로 표현 및 관련 단위 간 변환 기능 `Data Formatting`: 숫자, 날짜, 측정값 등을 문자열로 변환 또는 반대 작업 `Filter and Sorting`: 컬렉션의 요소를 검사하거나 정렬하는 작업 ### 애플리케이션 지원 `Resources`: 애플리케이션의 에셋과 번들 데이터에 접근 지원 `Notification`: 정보를 퍼뜨리거나 받아들이기는 기능 지원 `App Extension`: 확장 애플리케이션과의 상호작용 지원 `Error and Exceptions`: API와의 상호작용에서 발생할 수 있는 문제 상황에 대처할 수 있는 기능 지원 ### 파일 및 데이터 관리 `File System`: 파일 또는 폴더를 생성하고 읽고 쓰는 기능 관리 `Archives and Serialization`: 속성 목록, JSON, 바이너리 파일들을 객체로 변환 또는 반대 작업 관리 `iCloud`: 사용자의 iCloud 계정을 이용해 데이터를 동기화하는 작업 관리 ### 네트워킹 `URL Loading System`: 표준 인터넷 프로토콜을 통해 URL과 상호작용하고 서버와 통신하는 작업`Bonjour`: 로컬 네트워크를 위한 작업 ![](https://i.imgur.com/mhcKO2i.png) 이 중 `UIKit`은 가장 위인 `Cocoa Touch` 계층이고 그보다 두단계 `Foundation`은 `Core Service` 계층이다. 그렇기 때문에 `UIkit`이 `Foundation` 프레임워크를 상속했을 가능성이 높다. 결과적으로 `UIkit`을 상속하는 것 만으로, `Foundation`도 함께 상속한 결과를 낼 수 있다. - UIKit 클래스들을 다룰 때 꼭 처리해야하는 애플리케이션 쓰레드 이름은 무엇인가? ![](https://i.imgur.com/SmibA55.png) - App Bundle의 구조와 역할에 대해 설명하시오. - MyApp: 실제 앱 이름에서 .app 확장자를 뗀 것이 곧 실행파일(executable)이다. 번들 구조에 반드시 있어야 한다. - Application icons: MyAppIcon.png, MySearchIcon.png, MySettingsIcon.png이 여기에 속한다. 아이콘은 알려져있듯 앱을 나타내는데 사용된다. 홈 화면에서, 혹은 앱을 검색했을 때에 아이콘이 가장 먼저 보여지는 정보이므로 꼭 포함해야한다. - Info.plist: 번들 ID, 버전 넘버, 디스플레이 네임 등과 같은 앱의 컨피규레이션 정보를 담고 있는 파일로 꼭 포함되어야 한다. - Launch Images: 위 구조에서는 Default.png이며 앱의 initial interface를 보여주는 이미지이다. 시스템은 제공된 런치 이미지 중 하나를 앱이 윈도우와 유저 인터페이스를 로드할 동안 임시 배경으로 사용한다. 만약 런치 이미지가 없다면 검은 화면이 보여질 것이다. - MainWindow.nib: 앱의 main nib file은 런치타임에 앱을 로드하기 위한 기본 인터페이스 오브젝트를 포함한다. 보통 앱의 메인 윈도우 객체와 앱 델리게이트 객체를 갖고 있다. - Settings.bundle: 앱의 specific preferences를 포함하는 특별한 타입의 플러그인이다. 이 번들은 preferences를 configure하고 디스플레이하기 위한 property list와 다른 리소스 파일들을 포함한다. - Custom resource files: non-localized 리소스들은 탑 레벨 디렉토리에, localized 리소스는 language-specific 서브 디렉토리에 위치한다. 잠시 정리를 해보자. 번들은 결국 하나의 앱을 구성하는 여러가지 요소(실행파일, 리소스, 컨피규레이션 파일 등)를 한 곳에 묶어서 관리하는 하나의 디렉토리, 모음이다. 그리고 이 모음에는 필수적으로 포함되어야 하는 것과 필수는 아니지만 권장되는 여러 요소들이 있고 각각의 요소들은 저마다의 역할이 있다 - 모든 View Controller 객체의 상위 클래스는 무엇이고 그 역할은 무엇인가? 먼저 UIViewController가 뭐냐 간단히 말하면, 앱에서 View 계층을 관리하는 객체입니다. ViewController의 주요 역할을 살펴보면 아래와 같습니다. https://beenii.tistory.com/166 - ViewController의 생명주기를 설명하시오. https://one10004.tistory.com/121 - MVC 구조에 대해 블록 그림을 그리고(말로 설명하고), 각 역할과 흐름을 설명하시오 https://velog.io/@hayeon/MVC-%EA%B5%AC%EC%A1%B0%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B0%81-%EC%97%AD%ED%95%A0%EA%B3%BC-%ED%9D%90%EB%A6%84%EC%9D%84-%EC%84%A4%EB%AA%85%ED%95%98%EC%8B%9C%EC%98%A4 - Hashable이 무엇이고, Equatable을 왜 상속해야 하는지 설명하시오. https://velog.io/@hayeon/Hashable%EC%9D%B4-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-Equatable%EC%9D%84-%EC%99%9C-%EC%83%81%EC%86%8D%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94%EC%A7%80-%EC%84%A4%EB%AA%85%ED%95%98%EC%8B%9C%EC%98%A4 UIView 에서 Layer 객체는 무엇이고 어떤 역할을 담당하는지 설명하시오 image based 켄텐츠를 관리할 수 있고 애니메이션을 제공하는 역할을 합니다. 컨텐츠의 크기, 위치 및 변형정보를 보관하며, 뷰는 레이어를 만들면서 자동으로 자기 자신을 레이어의 delegate로 할당합니다. 각 뷰마다 하나의 루트 Layer가 존재하는데 UIView는 레이아웃과 터치 이벤트 처리 등 작업을 담당하게 되고 실제로 뷰 위의 컨텐츠나 애니메이션을 그리는 행위는 Core Animation 계층에게 양도하게 되는데 이러한 역할들을 CALayer가 담당하게 됩니다.