TIL
🌱 난 오늘 무엇을 공부했을까?
📌 면접스터디
📍 1. 앱이 시작할 때 main.c 에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?
sharedApplication을 사용하여 액세스하는 싱글톤 UIApplication 객체를 생성
- UIApplication 객체는 앱의 메인 이벤트 루프를 실행하고 앱의 전체 수명 주기를 관리
- UIApplication 객체는 앱 실행, 메모리 부족 경고 및 앱 종료와 같은 중요한 런타임 이벤트를 Delegate에게 알려 적절하게 대응할 수 있는 기회를 제공
- UIApplication 클래스는 UIApplicationDelegate 프로토콜을 준수하고 프로토콜의 일부 메서드를 구현해야 하는 대리자를 정의
🔗 앱 시작 시 main() -> UIApplicationMain 함수의 흐름 설명
- 시스템은 Xcode가 제공하는 main() 함수를 실행
- main() 함수는 UIApplicationMain을 호출
- 정수 반환 유형이 지정되어도 이 함수는 반환하지 않습니다.
- 응용 프로그램 개체를 인스턴스화
- 클래스에서 대리자(있는 경우)를 인스턴스화, 응용 프로그램에 대한 대리자를 설정
- 애플리케이션의 런 루프를 포함하여 메인 이벤트 루프를 설정하고 이벤트 처리를 시작(UIApplication)
- nib 파일을 로드
- UIApplication 및 앱 대리자의 인스턴스를 생성
- UIKit은 앱의 Info.plist 파일이나 Xcode 프로젝트 편집기의 대상 사용자 지정 iOS 대상 속성 탭에서 지정한 기본 스토리보드를 로드, 스토리보드가 없으면 건너뜀
- UIKit은 AppDelegate에서 application:willFinishLaunchingWithOptions: 메서드를 호출합니다.
- Delegate에게 실행 프로세스가 거의 완료되었으며 앱을 실행할 준비가 거의 완료되었음을 알림.
- 특정 이유로 시스템에서 앱을 시작한 경우 launchOptions Dictionary에는 시작 이유를 나타내는 데이터가 포함.
- 이 메서드가 호출될 때 앱은 inactive 상태.
-
초기 실행
-
앱 실행과 종료 과정
🔗 Event Loop
🔗 전체적인 Delegate 호출 메서드 순서
- Launch time
- application: didFinishLaunchingWithOptions: -> Bool
- 이 콜백 메소드는 애플리케이션이 실행을 완료하고 상태를 복원할 때 호출, UI 생성과 같은 최종 초기화를 수행.
- applicationWillEnterForeground
- 전화를 받거나 기타 시스템이 중단된 후 앱이 다시 활성화 될때 실행.
- applicationDidBecomeActive
- Foreground로의 전환이 완료된 후 실행.
- Termination time
- applicationWillResignActive
- 앱이 비활성화되려고 할 때 호출(예: 전화가 걸려오거나 사용자가 홈 버튼을 눌렀을 때).
- applicationDidEnterBackground
- 앱이 비활성화된 후 백그라운드 상태가 될 때 호출. 나중에 또는 그 직후 앱이 종료되는 경우에 대비하여 백업해야 하는 작업을 실행하는 데 약 5초가 주어진다.
- applicationWillTerminate
🔗 App 기반 Life Cycle
🔗 @main
-
@main은 프로그램 실행 시작 시 진입점으로 타입을 지정하기 위한 Swift 언어의 기능이다. 사용자는 탑 레벨의 코드를 작성하는 대신 @main단일 유형의 속성을 사용할 수 있고, 라이브러리와 프레임워크는 프로토콜이나 클래스 상속을 통해 맞춤형 진입점 동작을 제공할 수 있다.
-
@main은 어디서부터 이 앱이 최초 실행되고 시작될지를 명시해주는 키워드(UIKit프레임워크에 존재하는 main() 함수를 사용한다는 의미)
-
꼬리질문
- application 설명.
- UIApplication의 동작 흐름
📍 2. Optional 이란 무엇인지 설명하시오.
@frozen enum Optional<Wrapped>
- 값이 있을수도 없을수도 있는 타입(enum)
- Optional.none은 nil 리터럴과 동일.
- Optional.some(Wrapped)은 래핑된 값.
- Swift의 옵셔널을 사용하면 특별한 상수 없이도 모든 유형에 대한 값이 없음을 나타낼 수 있다.
🔗 UnWrapping
- Implicitly Unwrapped Optionals
- 옵션으로 만들려는 유형 뒤에 물음표(문자열?) 대신 느낌표(문자열!)를 배치하여 암시적으로 래핑되지 않은 옵션을 작성.
- !를 사용해 강제로
- nil-coalescing 연산자(??)를 사용하여 기본값을 제공.
- 옵셔널 바인딩을 사용하여 옵셔널에 값이 포함되어 있는지 확인하고, 그렇다면 해당 값을 임시 상수나 변수로 사용할 수 있도록 합니다
- if let
- while let
- guard let
- 옵셔널 체이닝은 하위 property에 optional 값이 있는지 연속적으로 확인하면서, 중간에 하나라도 nil이 발견된다면 nil이 반환되는 형식
🔗 IBOutlet, Action
인터페이스 빌더 데이터는 뷰 컨트롤러가 시작된 후에 로드되므로 콘센트는 초기화 후에 값을 바로 연결할 수 없습니다.
- 초기화 후에만 연결되므로 선택 사항이어야 합니다.
- 그러나 초기화 후에 클래스의 다른 코드가 호출되면 이러한 콘센트가 연결되는 것이 보장됩니다.
- 암시적으로 래핑되지 않은 선택적 속성(이 경우 콘센트)을 사용하면 개체가 시작된 후 속성이 nil이 될 수 있지만 해당 값은 나중에 할당됩니다(nib 또는 스토리보드 로드 후).
- 꼬리질문
- Optional은 어떤 타입으로 이루어져있는지?
- Optional은 어떤 케이스
- 언래핑의 방법
- Optional를 사용했을 때 장점
- UIKit에서 Optional을 기본적으로 사용하고 있는 예
- IBOutlet, Action에서 암시적 옵셔널을 사용하는 이유
📍 3. Struct 가 무엇이고 어떻게 사용하는지 설명하시오.
- 값 타입
- 기본적인 값 타입은 Stack에 실제 데이터가 저장된다. 그렇기 때문에 let으로 선언 시 수정이 불가능하다.
- 참조는 데이터를 힙에 저장하고 스택에는 그 주소값을 저장한다. 그렇기 때문에 let으로 선언해도 데이터 변경은 가능하다.
- 자동으로 생성된 멤버별 이니셜라이저 존재
- 값 유형은 변수나 상수에 할당되거나 함수에 전달될 때 값이 복사되는 유형 (arrays, dictionaries, and strings : COW)
🔗 기능
- 값을 저장할 속성 정의
- 기능을 제공하는 메소드 정의
- subscripts syntax를 사용하여 값에 대한 액세스를 제공하도록 subscripts를 정의합니다.
- 초기 상태를 설정하기 위한 이니셜라이저 정의
- 기본 구현 이상으로 기능을 확장하도록 extension
- 특정 종류의 표준 기능을 제공하는 protocol 준수
🔗 Mutating
- 기본적으로 값 유형의 속성은 인스턴스 메서드 내에서 수정할 수 없다.
- Mutating 키워드를 붙이면 메서드 내에서 속성을 변경(즉, 변경)할 수 있으며 변경 사항은 메서드가 종료될 때 원래 struct에 다시 기록
- 암시적 self 속성에 완전히 새로운 인스턴스를 할당할 수도 있으며 이 새 인스턴스는 메서드가 종료되면 기존 인스턴스를 대체
- 꼬리질문
- Struct의 특징
- class보다 struct를 지향하는 이유
- Mutating의 설명
- let과 var