728x90
반응형
이런식의 단순암기는 지양하지만 급한분들을 위해 가급적 가볍게 작성되었습니다.
제 경험을 바탕해서 작성하였으니 무수한 태클, 피드백, 훈수 부탁드립니다.
작성되지 않은 질문은 작성중입니다.
2024년 08월 05일 작성중
그럼 모두 면접 화이팅!🙇🏻♂️
iOS
- Bounds 와 Frame 의 차이점을 설명하시오.
Frame : SuperView기준의 좌표계에서 x, y, width, height를 부여
Bounds: 자체 좌표계에서 x, y, width, height를 부여 - 실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오.
가상 디바이스의 장점 : 테스트가 용이하여 빠르게 개발이 가능하다.
할 수 없는 것 -푸시 알림, 가속도 센서, 마이크, 전화, 카메라 - 앱의 콘텐츠나 데이터 자체를 저장/보관하는 특별한 객체를 무엇이라고 하는가?
데이터베이스, 그중 UserDefault를 사용 해보았다. - 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체를 무엇이라고 하는가?
UIViewController - App thinning에 대해서 설명하시오.
App Thinning - 앱 시닝
- 애플리케이션이 디바이스에 설치될 때, 앱 스토어와 운영체제가 디바이스 특성에 맞게 설치되도록 하는 최적화 기술을 의미함.
- 구성으로는 슬라이싱(slicing), 비트코드(bitcode), 주문형 리소스(on-demand resource)
- 최소한의 디스크 사용과 빠른 다운로드를 제공
- 앱이 시작할 때 main.c 에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?
UIApplication인스턴스가 생성됨, 이때 이 UIApplication은 사용자로 부터 발생하는 이벤트들을 Appdelegate로 전달하는 역할을 함. - @Main에 대해서 설명하시오.
Swift 컴파일러가 @Main 어노테이션을 통해 AppDelegate에서 전역범위에 있는 코드를 자동으로 인식하게 하고 실행시킴,
프로그램 실행을 시작하기 위한 진입점 - 앱이 foreground에 있을 때와 background에 있을 때 어떤 제약사항이 있나요?
Foreground - 앱이 메모리를 사용하는데 있어서 높은 우선순위를 가짐
Background - 가능한 적은 메모리공간을 사용함 - 상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드들을 설명하시오.
applicationWillResignActive 애플리케이션이 InActive 상태로 전환되기 직전에 호출
applicationDidEnterBackground 애플리케이션이 백그라운드 상태로 전환된 뒤 호출
applicationWillEnterForeground 애플리케이션이 Active상태가 되기 전에 호출
applicationDidBecomeActive 애플리케이션이 Active상태로 전환된 후 호출
applicationWillTerminate 애플리케이션이 종료되기 직전에 호출 - 앱이 In-Active 상태가 되는 시나리오를 설명하시오.
전화나 메시지 같은 인터럽트가 발생하거나, 미리알림 같은 특정 알림창이 화면을 덮어서 앱이 실질적으로 event를 받지 못하는 상태 In-Active 상태가 된다. 앱을 처음켜거나, foreground에서 background, background에서 foreground 상태가 될 때도 in-Active 상태를 거쳐간다. - scene delegate에 대해 설명하시오.
애플리케이션이 화면에 표시되는 방식과 애플리케이션의 생명주기를 담당한다 - UIApplication 객체의 컨트롤러 역할은 어디에 구현해야 하는가?
UIApplicationMain 함수 - App의 Not running, Inactive, Active, Background, Suspended에 대해 설명하시오.
Not running - 앱이 실행되지 않은 상태
Inactive - Foreground 상태, 앱이 실행중이지만 아직 아무런 이벤트를 받지않은 상태(전화가 오거나 알림센터를 내리면 Inactive상태로 전환)
Active - Foreground 상태, 앱이 실행중이고 이벤트를 받고있고 발생한 상태
Background - 앱이 백그라운드에 있고 아직도 실행되는 코드가 있는 상태
Suspended - 앱이 백그라운드에 있고 실행되는 코드가 없는 상태(Cpu나 배터리를 소모하지않음, 언제든지 메모리 부족으로 앱을 종료할수 있음) - NSOperationQueue 와 GCD Queue 의 차이점을 설명하시오.
NSOperationQueue : Obj-c 기반으로 만들어진 high-level API
- operation Queue에 추가된 작업은 작업이 완료될 때까지 대기열에 남아 있다. 작업이 추가된 후에는 대기열에서 직접 제거할 수 없기 때문에 모든 작업이 끝나지 않은 상태에서 Operation queue를 중지시키면 메모리 릭이 발생할 수 있다.
- 하이 레벨이기 때문에 GCD 에서할 수 없는기능(ex: 재개, 취소, 중지)을 제공하지만 구현이 복잡하고 무겁다.
GCD(Grand Central Dispatch) : C 기반의 low-level API
- 복잡하지않고 가볍기 때문에 매우 간단한 동시성을 사용할 수 있다.
Operation Queue : 비동기적 실행작업을 객체 지향적인 방법으로 사용하는데 적합
Dispatch Queue : 작업이 복잡하지않고 간단하게 처리하거나 특정유형 시스템이벤트 비동기처리시 적합(ex: 타이머, 프로세스 ) - GCD API 동작 방식과 필요성에 대해 설명하시오.
GCD란? 백그라운드에서 스레드를 관리해주고 동시적으로 작업을 처리할 수 있게 해주는 저수준 API를 제공해주는 라이브러리.
GCD는 멀티 코어 프로세서 시스템에 대한 응용 프로그램 지원을 최적화하기 위해 사용되는 라이브러리로 스레드 관리와 실행에 대한 책임을 운영체제 레벨로 넘겨 버림으로서 프로그래머가 쉽게 비동기적으로 작업을 처리할 수 있습니다.
실행할 작업을 클로저의 형태로 DispatchQueue에 추가하면 GCD가 스레드를 자동으로 생성하고 실행해주고 스레드를 관리해줍니다. - Global DispatchQueue 의 Qos 에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.
- userInteractive, main thread에서 작업, 사용자 인터페이스(UI) 새로고침 또는 애니메이션 수행과 같이 사용자와 상호작용 하는 작업
- userInitiated, 사용자가 시작한 작업이며, 저장된 문서를 열거나, 사용자 인터페이스에서 무언가를 클릭할 때 작업을 수행하는 것과 같은 즉각적인 결과가 필요
- default, 이 QoS는 개발자가 작업을 분류하는데 사용하기 위한 것이 아님, QoS정보가 할당되지 않은 작업은 Default로 처리되며 GCD global queue는 이 level(default)에서 실행됩니다
- utillity, 작업을 완료하는 데 약간의 시간이 걸릴 수 있으며, 데이터 다운로드 또는 import와 같은 즉각적인 결과가 필요하지 않음
- background, 백그라운드에서 작동하며, indexing, 동기화 및 백업과 같이 사용자가 볼 수 없는 작업
- unspecified, 이는 QoS정보가 없음을 나타내며, 환경 QoS(environmental QoS)를 추론해야 한다는 단서를 시스템에 제공 - iOS 앱을 만들고, User Interface를 구성하는 데 필수적인 프레임워크 이름은 무엇인가?
UIKit
- iOS 애플리케이션의 사용자 인터페이스를 구현하고 이벤트를 관리하는 프레임워크이다.
- UIKit 클래스 중 UIResponder에서 파생된 클래스나 사용자 인터페이스에 관련된 클래스는 애플리케이션의 메인 스레드(혹은 메인 디스패치 큐)에서만 사용한다.
- UIKit은 iOS와 tvOS플랫폼에서 사용 - Foundation Kit은 무엇이고 포함되어 있는 클래스들은 어떤 것이 있는지 설명하시오.
Foundation Kit은 Cocoa Touch framework에 포함되어 있는 프레임워크 중 하나로 String, Int등의 원시 데이터 타입과 컬렉션 타입 및 운영체제 서비스를 사용해 앱의 기본적인 기능을 관리하는 프레임워크. - Delegate란 무엇인지 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오.
Delegate란 객체 지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라 처리해야 할 일 일부를 다른 객체에게 넘기는 것을 의미한다.
retain(유지하다) : 메모리가 해제되지 않아서 낭비되는 현상을 의미(Memory Leak, 메모리 누수)
Delegate는 객체 간의 작업이여서 참조 값을 사용하기 때문에 retain 현상이 일어난다.
해결 방법
weak : 약한 참조
unowned : 약한 참조이고 해제된 메모리 영역에 재접근하지 않는다는 확신이 있을 때 - NotificationCenter 동작 방식과 활용 방안에 대해 설명하시오.
NotificationCenter는 등록된 모든 Observer에게 정보를 전달하는 매커니즘임.
observer는 notification들을 감지하고 있고 sender는 필요할 때 해당 observer에게 notification들을 보내주는 역할을 합니다. 옵저버를 등록하고 등록된 옵저버를 감시하면서 변경사항이 발생하면 등록된 옵저버에게 알려줍니다. - UIKit 클래스들을 다룰 때 꼭 처리해야하는 애플리케이션 쓰레드 이름은 무엇인가?
Main Thread - App Bundle의 구조와 역할에 대해 설명하시오.
앱을 성공적으로 빌드하기 위한 자료들의 집합. 실행파일, 리소스파일, Info.plist 등.. - 모든 View Controller 객체의 상위 클래스는 무엇이고 그 역할은 무엇인가?
모든 View Controller는 UIViewController를 상속. UIViewController는 모든 View Controller에 공통으로 작동하는 행동들이 정의 되있고, 이를 상속받아 메서드를 추가하거나 override할 수 있음. - 자신만의 Custom View를 만들려면 어떻게 해야하는지 설명하시오.
Xib를 이용해서 Storyboard처럼 커스텀 뷰 생성 가능, UIView를 상속 받아 코드로 작성하여 구현 - View 객체에 대해 설명하시오.
View는 사용자 인터페이스의 기본 구성 요소이며 모든 조작은 main thread에서 해야합니다
또한, 화면에 content 표시, 그리기 및 애니메이션, 오토레이아웃, 제스처 인식 등 화면에 관한 것들을 담당하는 객체입니다. - UIView 에서 Layer 객체는 무엇이고 어떤 역할을 담당하는지 설명하시오.
UIView에 CALayer타입인 layer를 가지고 있습니다. 이 Layer 객체는 UIView의 작업 중에서 화면에 그리는 작업들을 받아 수행하는 역할을 하는 객체입니다. - UIWindow 객체의 역할은 무엇인가?
UIWindow는 UIView의 하위 클래스로 앱의 배경과 이벤트를 View로 전달하는 객체이다. 눈에보 보이는 내용은 없지만 앱의 View에 기본 컨테이너를 제공하여 rootViewController에서 관리하는 하나 잇아의 View를 보여주는 역할을 한다. - UINavigationController 의 역할이 무엇인지 설명하시오.
네비게이션 뷰의 스택을 관리하는 Controller, 새 콘텐츠 ViewController를 스택에 쌓거나 스택에서 ViewController제거하는 역할을함. - TableView를 동작 방식과 화면에 Cell을 출력하기 위해 최소한 구현해야 하는 DataSource 메서드를 설명하시오.
열의 갯수를 결정하는 메서드(numberOfRowsInSection), 셀의 모양을 결정하는 메서드(cellForRowAt) - 하나의 View Controller 코드에서 여러 TableView Controller 역할을 해야 할 경우 어떻게 구분해서 구현해야 하는지 설명하시오.
1. tableview마다 tag를 설정해 cellForRowAt에서 분기를 나누어 구현.
2. tableview 별도의 delegate 객체를 만들어 주입해주는 방법으로 구현. - setNeedsLayout와 setNeedsDisplay의 차이에 대해 설명하시오.
setNeedsLayout - 뷰의 하위 뷰들의 레이아웃을 조정하고 싶을 때 메인스레드에서 이 메소드를 호출 이메소드를 호출한 view는 재계산이 필요한 view라고 시스템에게 알려줌.
setNeedsDisplay - 이 메소드를 사용하여 view의 컨텐츠를 다시 그려야한다고 시스템에게 알려줄 수 있음. 이 메서드가 호출 된 후 draw메소드가 호출. - StackView의 장점과 단점에 대해서 설명하시오.
장점 - 복잡한 Constraint없이 구현이 가능.
단점 - 방대한 양의 데이터를 처리할때, TableView는 재사용 셀을 이용하여 앱의 메모리를 효율적으로 사용 할 수 있지만
StackView는 재사용 셀이 없기 때문에 비교적 앱의 메모리를 효율적으로 사용 할 수 없다. - NSCache와 딕셔너리로 캐시를 구성했을때의 차이를 설명하시오.
1. NSCache는 메모리 관리가 기본적으로 제공된다.
- 다른 앱에서 메모리를 더 사용하려고 하면 캐시되어 있던 데이터를 지우고 메모리를 해제한다.
2. NSCache는 Thread-safe 하다.
- 캐시 데이터를 읽고 쓰고 지울때마다 따로 lock을 해줄 필요가 없다.
반면 딕셔너리는 Thread-safe하지 않기 때문에 데이터 접근할 때 따로 처리해줘야 한다.
3. 딕셔너리는 Key값을 copy하지만 NSCache는 retain 카운트만 증가 시킨다.
- 복사를 지원하지 않는 객체까지 포용한다. - URLSession에 대해서 설명하시오.
네트워크 데이터 전달 작업에 연관된 일련의 일을 처리하는 그룹 오브젝트. 또한 URLSession을 통해 iOS 앱이 실행중이지 않을 때에도 백그라운드에서 데이터를 다운로드할 수 있다.
ps. Alamofire 사용 경험에 대해 질문 할 가능성 높음!
Alamofire란 Swift로 작성된 iOS, macOS, watchOS 및 tvOS 앱에서 네트워크 작업을 쉽게 수행할 수 있도록 도와주는 오픈소스 라이브러리. - prepareForReuse에 대해서 설명하시오.
셀 재사용과 관련된 함수, 재사용 되는 셀을 초기화하는 목적으로 사용됨 - 다크모드를 지원하는 방법에 대해 설명하시오.
1. Assets를 이용해서 다크 모드 지원하기
2. 모드 별로 다른 이미지를 정의 하기
만약 모드를 고정하고 싶다면 Info.plist에서 appearance를 Light 혹은 Dark로 고정 시키면 됨. - ViewController의 생명주기를 설명하시오.
loadView - 뷰를 만드는역할, 이 메서드는 직접 호출하면 안됨.
- init(coder:) : ViewController 객체가 생성될 때 호출됩니다. 이 메서드는 Interface Builder에서 ViewController 객체를 로드하는 경우에 호출됩니다. ViewController 객체를 초기화하는 데 사용됩니다.
- loadView() : ViewController의 View가 처음 생성될 때 호출됩니다. 이 메서드는 View를 직접 구성하여 할당하고 초기화합니다. 만약 View를 코드로 구성하는 경우, 이 메서드를 구현하여 View를 로드합니다.
- viewDidLoad() : ViewController의 View가 메모리에 로드된 직후 호출됩니다. 이 메서드는 View가 초기화되었으며 ViewController가 인터페이스 객체와 상호작용하기 전에 수행해야 할 작업을 수행합니다. 이 메서드는 ViewController에 필요한 초기화 작업을 수행하는 데 사용됩니다.
- viewWillAppear(_:) : ViewController의 View가 화면에 표시되기 전에 호출됩니다. 이 메서드는 View가 등장하기 전에 ViewController가 수행해야 하는 모든 작업을 수행합니다. 예를 들어, 화면이 전환될 때 뷰를 업데이트하는 작업을 수행할 수 있습니다.
- viewDidAppear(_:) : ViewController의 View가 화면에 표시된 직후 호출됩니다. 이 메서드는 ViewController가 사용자 인터페이스와 상호작용하기 시작할 때 수행하는 작업을 수행합니다. 예를 들어, 애니메이션 효과를 추가할 수 있습니다.
- viewWillDisappear(_:) : ViewController의 View가 화면에서 사라지기 전에 호출됩니다. 이 메서드는 View가 사라지기 전에 ViewController가 수행해야 하는 작업을 수행합니다. 예를 들어, 변경된 데이터를 저장하는 작업을 수행할 수 있습니다.
- viewDidDisappear(_:) : ViewController의 View가 화면에서 사라진 직후 호출됩니다. 이 메서드는 View가 사라진 후에 ViewController가 수행해야 하는 작업을 수행합니다. 예를 들어, 메모리 관리를 위한 작업을 수행할 수 있습니다.
- viewDidUnload() (Deprecated) : 이전에는 ViewController의 View가 메모리에서 해제될 때 호출되었습니다. 그러나 iOS 6에서 이 메서드는 더 이상 사용되지 않습니다. 대신 viewDidDisappear(_:) 메서드에서 해당 작업을 수행해야 합니다.
- deinit() : ViewController 객체가 메모리에서 해제될 때 호출됩니다. 이 메서드는 객체가 메모리에서 해제될 때 필요한 모든 작업을 수행합니다.
- TableView와 CollectionView의 차이점을 설명하시오.
cell의 차이.
TableView는 하나의 열에 여러 행의 cell을 표현 하는방식
CollectionView는 행과 열을 모두 만들수있음. 즉, cell의 모양을 자유롭게 디자인 가능
Autolayout
- 오토레이아웃을 코드로 작성하는 방법은 무엇인가? (3가지)
NSAutoLayout, Anchor, VFL(Visual Format Language)
하지만 요새 보통 SnapKit을 주로 사용한다고 알고있음. - hugging, resistance에 대해서 설명하시오.
hugging - 우선순위가 높을수록 크기를 유지하려고 하고, 우선순위가 낮을수록 크기가 커지는 성질을 띔
resistance - 우선순위가 높을수록 크기를 유지하려고 하고, 우선순위가 클수록 크기가 작아지는 성질을 띔 - Intrinsic Size에 대해서 설명하시오.
Intrinsic Size는 콘텐츠의 본질적인 크기입니다.
모든 view가 Intrinsic Size를 갖는 것은 아니고, 대표적인 예로는 UILabel, UIButton을 들 수 있습니다.
또한, 각각의 view마다 Intrinsic Size가 적용되는 방식이 다릅니다. - 스토리보드를 이용했을때의 장단점을 설명하시오.
장점 - 결과물을 예측하기 쉽다, 소스를 일일이 확인하지 않아도 UI 확인 가능
단점 - 화면 로딩시 앱이 무거움, 앱이 커지면 커질수록 가독성이 떨어짐 - Safearea에 대해서 설명하시오.
아이폰X가 출시이후로 상단에 노치, 하단에 홈 인디케이터가 생겨 SafeArea라는 영역이 생기게 되었음.
즉, 노치라인, 홈 인디케이터 라인을 포함하는 영역이 SafeArea임. - Left Constraint 와 Leading Constraint 의 차이점을 설명하시오.
Leading Constraint - 어떤 객체의 앞쪽 가장자리를 뜻한다
+ 글씨 시작 시점을 뜻함, 아랍어는 오른쪽부터 시작이므로 아랍에서의 UILabel 객체의 Leading Constraint는 오른쪽을 의미한다.
Left Constraint - 객체 왼쪽을 뜻함
Swift
- struct와 class와 enum의 차이를 설명하시오.
class는 참조타입, struct와 enum은 값타입
class는 상속가능, 나머지는 상속불가
class는 힙 영역에 메모리가 저장되며 ARC가 메모리관리 struct, enum은 값 타입이기 때문에 스택 영역에 저장
+공통점
Extension으로 기능을 확장 할 수 있다.
Protocol 채택이 가능하다.
프로퍼티를 선언할 수 있다.
메서드를 선언할 수 있다.
일반적으로 상속이 필요하지 않은 객체라면 struct와 enum을 사용
+enum의 장점
코드의 가독성이 올라감
컴파일 타임에 에러를 확인할 수 있음. 그렇기 때문에 성능향상(Static Dispatch 호출 방식이기 때문) - class의 성능을 향상 시킬수 있는 방법들을 나열해보시오.
class는 상속이 가능해 하위클래스에서 상속이 가능하여 오버라이드 될 가능성이 있으므로, 일반적으로 상속이 필요하지않는 class들을 final 혹은 private 키워드를 붙여 Dynamic Dispatch -> Static Dispatch로 함수 호출 방식을 변경 - Copy On Write는 어떤 방식으로 동작하는지 설명하시오.
A객체를 B객체에 할당하려고 할때 메모리 공간을 늘려 할당하는게 아니라 A의 메모리 공간을 B와 공유하는 방식을 뜻함. - Convenience init에 대해 설명하시오.
보조이니셜라이저, 이니셜라이저를 보조해주는 역할을 함. - AnyObject에 대해 설명하시오.
AnyObject는 모든 클래스 타입의 인스턴스를 나타낼 수 있습니다.
Any는 함수를 포함한 모든 클래스 타입의 인스턴스를 나타낼 수 있습니다. - Optional 이란 무엇인지 설명하시오.
nil이 될수 도 있는 값. - Struct 가 무엇이고 어떻게 사용하는지 설명하시오.
Struct는 구조체이며. 인스턴트 값을 저장하거나, 기능을 제공하고 이를 캡슐화 할 수 있도록 스위프트가 제공하는 타입임. - Subscripts에 대해 설명하시오.
서브스크립트는 클래스, 구조체, 열거형에서 정의해서 사용하는 스크립트임.
즉 컬렉션, 리스트, 시퀀스 등집합 내 속한 요소에 쉽게 접근할 수 있게 해주는 문법인 셈이고
이를 이용해메서드 구현없이도 단순히 값의 추가 및 획득등이 가능.
대표적인 예시로써 배열의 특정 요소를 접근하는 Array[index] 문법을 들 수 있다.
이 Subscript는오버로드를 통해 다양하게 입맛대로 정의할 수 있다 - String은 왜 subscript로 접근이 안되는지 설명하시오.
Swift에서 String은 각 문자를 이루고 있는 메모리의 크기가 가변적이기 때문에 Int 형식의 Subscript로는 접근이 불가하고, associated index 타입으로 String.index를 통해 접근이 가능하다. - instance 메서드와 class 메서드의 차이점을 설명하시오.
Instance Method - class, enum, struct 형태의 인스턴스에 속한 메소드를 의미한다, 클래스를 통해 호출할 수 없고 클래스의 인스턴스를 만들어 실체화하여 생성된 인스턴스를 통해서 호출할수 있음.
Class Method - 인스턴스를 만들어 실체화 하지 않아도 클래스를 통해 직접적으로 호출할 수 있는 Method. func 키워드 앞에 class 키워드가 붙어 class func methodName형태로 선언, Instance Method와 달리 sturct, enum에서 사용 불가 - class 메서드와 static 메서드의 차이점을 설명하시오.
class 메서드 - 상속 가능
static 메서드 - 상속 불가능 - Delegate 패턴을 활용하는 경우를 예를 들어 설명하시오.
Delegate패턴이란 객체가 해야할일을 다른 객체에 위임하는 것을 뜻함.
ex) tableview.delegate = self 를 통해 셀이 눌렸을때 ViewController 전달하는 역할을 함. - Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오.
인스턴트를 하나의 메모리에만 저장하고 자원을 공유하는 형태를 원할경우 싱글턴 패턴을 활용한다.
ex) UIScreen, UIApplication, NotificationCenter 등... - KVO 동작 방식에 대해 설명하시오.
KVO는 Key-Value Observing으로 특정 키 값의 변화를 감지하고 알려주는 코코아 프로그래밍 패턴입니다. 이 기능은 모델과 뷰처럼 앱의 논리적으로 분리되어 있는 사이 간 변경 사항을 전달하는데 유용하게 쓰입니다. - Delegates와 Notification 방식의 차이점에 대해 설명하시오.
Delegate와 Notification은 iOS 애플리케이션에서 객체 간 통신을 가능하게 하는 패턴입니다. 하지만 Delegate와 Notification은 서로 다른 방식으로 동작합니다.
Delegate는 일대일 통신을 위한 패턴입니다. 하나의 객체는 다른 객체에게 일부 작업을 위임하고, 그 작업이 완료되면 다시 호출 객체에서 결과를 반환합니다. Delegate는 객체 간의 직접적인 연결이 필요하며, 일반적으로 프로톨을 사용하여 통신합니다.
Notification은 일대다 통신을 위한 패턴입니다. 하나의 객체가 다른 객체들에게 이벤트 발생을 알리고, 이벤트에 관심 있는 객체들은 이를 구독하여 수신할 수 있습니다. Notification은 객체 간의 간접적인 연결이 가능하며, Notification Center를 통해 통신합니다.
따라서, Delegate와 Notification은 객체 간의 통신을 위한 두 가지 패턴으로, 각각의 장단점과 사용 시기에 대해 이해하고 적절하게 사용해야 합니다. - 멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명하시오.
고려해야할 점은 어떤 작업을 글로벌 큐에 넣어야 하는지 정확히 알아둬야 하고 글로벌 큐에 작업을 배치할때, 작업에 따라 QoS를 적절하게 사용해야한다. 또한, 동기로 할지, 비도익로 할지를 명확하게 정의한다. - MVC 구조에 대해 블록 그림을 그리고, 각 역할과 흐름을 설명하시오.
https://velog.io/@gkals4417/17.-MVC-구조에-대해-블록-그림을-그리고-각-역할과-흐름을-설명하시오 - 프로토콜이란 무엇인지 설명하시오.
특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진. - Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오.
Protocol Oriented Programming은 프로토콜 중심 프로그래밍, Object Oriented Programming은 객체 중심 프로그래밍입니다.
POP는 프로토콜 확장을 통하여 수평 구조로 타입을 확장하고, OOP는 슈퍼클래스의 상속을 통하여 수직 구조로 타입을 확장하는 방식으로 다형성을 구현 합니다 - Hashable이 무엇이고, Equatable을 왜 상속해야 하는지 설명하시오.
hashable은 hasher를 통해서 Int타입의 해쉬 값을 만들어주는 프로토콜입니다. hash란 해시함수에 의해 얻어지는 값으로 hash함수는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다. 예를 들어 "욱승"이라는 스트링을 해시함수를 통해 정수인 해쉬값으로 변환할 수 있습니다. 해쉬값은 고유값이어야 하므로 고유값인지 식별해 줄 수 있는 "=="함수가 필요합니다. 이 함수는 Equatable 프로토콜 안에 정의되어 있으니 hashable은 equatable프로토콜을 따라야합니다. 기본 데이터 타입도 ==을 통해 비교가 가능하므로 equatable프로토콜을 따릅니다. - mutating 키워드에 대해 설명하시오.
구조체에서, 함수가 내부 변수의 값을 수정하려면 mutating 키워드를 붙여야 한다. - 탈출 클로저에 대하여 설명하시오.
함수 인자로 @escaping 어노테이션이 붙을경우 해당 함수인자(클로저)가 함수 스코프에서 종료되는게 아니라 함수 외부에서도 사용하고 싶을때 사용됨, 주로 비동기식 처리에 사용됨 - Extension에 대해 설명하시오.
존재하는 클래스, 구조체, 열거형, 프로토콜 타입에 새롭게 기능적인 부분을 추가할 수 있고 요구사항을 구현하는 데도 사용할 수 있는 문법 - Extension 내부에서 함수를 override할 수 있는지 설명하시오.
새로운 기능을 정의하는 것은 가능하지만 override할수는 없다.
override는 부모클래스의 메서드를 자식클래스가 재정의하여 사용하는 것을 의미하지만, extension은 수평적인 확장이기 때문에 override라는 개념이 어울리지 않음. - 접근 제어자의 종류엔 어떤게 있는지 설명하시오.
open - 다른 모듈에서도 접근가능 / 상속 및 재정의도 가능 (제한 낮음)
public - 다른 모듈에서도 접근가능(상속/재정의불가)
internal - 같은 모듈 내에서만 접근가능(기본 설정 값)
fileprivate - 같은 파일 내에서만 접근가능
private - 같은 scope내에서만 접근가능 (제한 높음) - defer란 무엇인지 설명하시오.
함수 라이프사이플이 종료되고 실행되는 scope - defer가 호출되는 순서는 어떻게 되고, defer가 호출되지 않는 경우를 설명하시오.
코드블록 순서로 호출되며, 같은 코드블럭일 경우 역순으로 호출됩니다. defer를 읽지 않고 return을 하는 경우 defer가 호출되지 않습니다. - property wrapper에 대해서 설명하시오.프로퍼티 래퍼는 어떤 값이 있으면 이 값을 한 번 감싸서 저장을 위한 로직과 얻어오기 위한 로직을 어느정도 분리해서 반복을 줄여줄 수 있는 방법을 제공하는 속성입니다. 프로퍼티 래퍼를 사용하면 코드의 재사용성을 높여 코드가 짧아지는 효과를 나타낼 수 있습니다.
ref.
https://zeddios.tistory.com/1221 - Generic에 대해 설명하시오.
1. 제네릭이란 타입에 의존하지 않는 범용 코드를 작성할 때 사용한다
2. 제네릭을 사용하면 중복을 피하고, 코드를 유연하게 작성할 수 있다 - some 키워드에 대해 설명하시오.
some키워드는 return값에 불투명한 타입이 있음을 나타냅니다. 불투명한 타입이란 어떠한 타입을 리턴할 지 모른다는 것입니다. some키워드를 사용하면 함수 내부의 리턴 값에 따라 리턴 타입이 지정됩니다. - Result타입에 대해 설명하시오.
네트워크의 성공과 실패를 다루는 열거체. - Codable에 대하여 설명하시오.
Decodable, Encodable을 채택하는 프로토콜 주로 구조체에 쓰이며 JSON형식을 Swift방식에 맞게 데이터 파싱 해주는 역할을 함. - Closure에 대하여 설명하시오.
- 참조타입이다.
- 클로저는 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호“{}”로 구분된 코드의 블럭이며, 일급 객체의 역할을 할 수 있다. - Closure와 함수와의 관계에 대해 설명하시오.
함수는 클로저의 한 형태로, 이름이 있는 클로저이다.
ARC
- ARC란 무엇인지 설명하시오.
Auto Reference Count의 약어로 참조카운트가 0이 아닐때는 메모리를 할당하고 0일때는 메모리를 해제하는 메모리 관리 방식을 뜻함. - Retain Count 방식에 대해 설명하시오.
객체의 레퍼런스 카운트를 감소
컴파일 타임에 자동으로 retiain, release 메소드를 적절한 위치에 넣어서 작동
retain count가 0이 되면 객체가 메모리에서 해제된다. - Strong 과 Weak 참조 방식에 대해 설명하시오.
strong : reference count를 증가시켜 ARC로 인한 메모리 해제를 피하고, 객체를 안전하게 사용하고자 할 때 사용.
weak : 순환 참조에 의해 메모리 누수 문제를 막기 위해 사용.
unowned : 객체의 life cycle이 명확하고 개발자에 의해 제어 가능이 명확한 경우, weak Optional타입 대신하여 사용. - 순환 참조에 대하여 설명하시오.
순환 참조란 두 가지 이상의 객체가 서로에 대한 Strong Reference(강한 참조) 상태를 가지고 있을 때 발생하며, 순환 참조가 발생하게 되면 서로에 대한 참조가 해제되지 않기 때문에 메모리에서 유지되며 이로 인해 메모리 릭이 발생하게 된다. - 강한 순환 참조 (Strong Reference Cycle) 는 어떤 경우에 발생하는지 설명하시오.
두 인스턴스가 서로가 서로를 참조하고 있는 상황.
따라서 하나의 인스턴스를 참조하는 변수가 nil이되어서 메모리가해제가 되어야하는 시점에서도 인스턴스를 참조하고 있는 인스턴스가 있어서 reference count는 여전히 1이기때문에 매모리 해제가 되지않아 메모리 누수가 발생한다,
Functional Programming
- 순수함수란 무엇인지 설명하시오.
순수함수란 사이드 이펙트가 없는 함수, 즉 함수의 실행이 외부에 영향을 끼치지 않는 함수를 뜻한다. - 함수형 프로그래밍이 무엇인지 설명하시오.
컴퓨터 프로그래밍의 한 패러다임으로, 계산을 수학적 함수의 평가로 간주하고 상태와 가변 데이터를 피하는 프로그래밍 스타일을 뜻한다. - 고차 함수가 무엇인지 설명하시오.
하나 이상의 함수(클로저)를 인자로 받거나, 함수(클로저)를 반환하는 함수를 의미합니다. swift의 함수(클로저)는 일급시민이기 때문에, 함수의 전달인자로 전달하거나, 결과값으로 반환할 수 있습니다. 참고로 클로저는 named, unnamed 두 종류가 있고, 함수가 named 클로저입니다. - Swift Standard Library의 map, filter, reduce, compactMap, flatMap에 대하여 설명하시오.
map 함수는 컨테이너 내부의 기존 데이터를 변형(transform)하여 새로운 컨테이너를 생성
filter 함수는 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출, 요소가 반환된 배열에 포함되어야 하는지 여부를 Bool 값으로 반환하는 클로저입니다.
reduce 함수는 컨테이너 내부의 콘텐츠를 하나로 통합
flatMap 함수는 map과 동일하지만, 차원을 한단계 낮춘 새로운 컨테이너를 생성
compactMap 함수는 map과 동일하지만, 결과값에서 nil을 제거하고 옵셔널 바인딩을 적용시킨 새로운 컨테이너를 생성
Architecture
- MVVM, MVI, Ribs, VIP 등 자신이 알고있는 아키텍쳐를 설명하시오.
MVVM
MVI
Ribs
VIP - 의존성 주입에 대하여 설명하시오.
클래스 외부에서 객체를 생성해서 그 객체를 클래스 내부에 주입하는것
클래스 내부에서 객체를 직접 생성하지 않기때문에 객체간 결합도를 낮출 수 있음
의존관계를 없애기 위해서 스위프트에서는 인터페이스 역할을하는 프로토콜을 이용하여 특정 클래스에 대한 의존성 해결가능
결합도가 낮아진다는것은 한 클래스가 변경될 경우 다른클래스가 변경될 필요성이 적어진다는 뜻
SwiftUI
- @State에 대해서 설명하시오.
@State는 상태를 관리하는 데 사용하는 중요한 프로퍼티 래퍼입니다. SwiftUI는 선언적 UI 프레임워크로, 상태 기반 UI 업데이트를 지원합니다. @State는 이러한 상태를 관리하고 UI를 자동으로 업데이트하는 데 사용됩니다.
Combine
- PassthroughSubject에 대해서 설명하시오
PassthroughSubject는 Combine 프레임워크의 퍼블리셔 타입 중 하나로, 데이터와 오류를 발행할 수 있습니다. 주로 이벤트 스트림을 생성하거나 다른 퍼블리셔와 통합할 때 사용됩니다. PassthroughSubject는 두 가지 주요 역할을 수행합니다: - @Published에 대해서 설명하시오
@Published는 Combine 프레임워크의 퍼블리셔를 사용하여 SwiftUI 뷰의 상태를 반응형으로 관리할 수 있게 합니다. @Published 프로퍼티 래퍼는 값이 변경될 때마다 새로운 값을 발행하여 구독자에게 전달합니다. - AnyCancellable에 대해서 설명하시오
AnyCancellable은 Swift의 Combine 프레임워크에서 구독을 관리하는 데 사용되는 클래스입니다. Combine 프레임워크는 비동기 이벤트를 처리하고 데이터 흐름을 관리하기 위한 선언적 API를 제공합니다. AnyCancellable은 구독의 생명 주기를 관리하며, 구독을 취소하거나 해제하는 기능을 제공합니다. - sink에 대해서 설명하시오
AnyCancellable은 Swift의 Combine 프레임워크에서 구독을 관리하는 데 사용되는 클래스입니다. Combine 프레임워크는 비동기 이벤트를 처리하고 데이터 흐름을 관리하기 위한 선언적 API를 제공합니다. AnyCancellable은 구독의 생명 주기를 관리하며, 구독을 취소하거나 해제하는 기능을 제공합니다. - throttle과 debounce의 차이점을 설명하시오.
throttle과 debounce는 둘 다 시간 기반의 이벤트 제어 기법으로, 주로 사용자 입력, 네트워크 요청, 또는 다른 이벤트 스트림의 빈도를 조절하는 데 사용됩니다. 이 두 기법은 비슷해 보일 수 있지만, 서로 다른 용도로 설계되어 있으며, 각자의 특성과 용도가 있습니다.
Throttle (스로틀): 특정 시간 간격 내에서 이벤트가 일정 횟수 이상 발생하지 않도록 제어합니다.
Debounce (디바운스): 일정 시간 동안 이벤트가 발생하지 않을 때 콜백을 실행합니다. - Data를 Binding 하는 방법에 대해서 설명하시오.
Optional
아래부터는 추가로 공부를 하면 좋을 내용들입니다.
Objective-c나 rx는 회사, 팀마다 사용하는곳이 차이가있고 신입이나 주니어기준으로 필수라고 여겨지지않기에 옵셔널에 추가하였습니다.
Rx
- Reactive Programming이 무엇인지 설명하시오.
사용자의 액션에 의해 실시간으로 변하게 하는 *비동기적 데이터 흐름(Async Data Stream)을 이용한 프로그래밍 패러다임 입니다. 즉, 시스템에 이벤트가 발생했을 때 알아서 처리가 되는것. - RxSwift를 왜 사용하는지 설명하시오.
RxSwift는 함수형 프로그래밍인 Swift에서 반응형 프로그래밍이 가능하도록 도와주는 라이브러리입니다.
RxSwift를 사용하면 반응형 패러다임이 제공하는 명확함을 이용하여 비동기 코드를 동기화된 것처럼 작성이 가능해집니다. 일관성이 없는 비동기 코드를 하나의 비동기 코드로 개발할 수 있게 되어 일관성을 높일 수 있으며, 일관된 코드를 통하여 확장할 수 없는 아키텍처 패턴을 해결할 수 있고, 서로 다른 로직을 조합하기 쉬워집니다.
또한, 스레드 처리가 쉬워지며, 복잡한 콜백으로 이루어진 코드를 깔끔하게 바꿀 수 있어 UI 이벤트, 네트워크 처리 등의 데이터 갱신시 처리가 쉬워집니다. - RxSwift의 단점을 설명하시오.
- 러닝커브가 매우 높음
- 클로저 사용이 많기에, 순환 참조 사이클이 일어날 수 있기에 주의 해야함([weak self])
- 디버깅이 어려움, 그래도 debug Operator를 통해서 얼추 가능 - RxSwift에서 Hot Observable과 Cold Observable의 차이를 설명하시오.
Hot Observable 🔥 은 구독 여부에 관계 없이 요소를 방출해주는 Observable,
Cold Observable🧊 은 구독이 되어야지 비로서 요소가 방출이 되는 Observable 이다. - Subject의 종류와 차이점에 대해 설명하시오.
Subject에는 PublishSubject, BehaviorSubject ReplaySubject, AsyncSubject가 있습니다.
이 4개의 서브젝트의 가장 큰 차이점은 구독한 시점에서 데이터를 어떤것을 받냐에 따라서 갈린다.
- PublishSubject는 구독을 하면 그 시점의 데이터를 바로 보내주는 기능
- BehaviorSubject는 PublishSubject와 기능은 같지만 초기값을 가진다. 그렇기에 처음에 값이 없을때 값을 내려보내지는 못하는 PublishSubject와는 다르게 BehaviorSubject는 초기값을 설정하기에 구독자가 값을 가진상태로 시작.
- ReplaySubject의 기능은 PublishSubject와 기능은 비슷하나 누군가가 구독을 하면 구독 시점전의 데이터도 보내줌.
- AsyncSubject는 누군가가 구독을해도 마지막 OnComplete가 되기전까지 보내지 않고 OnComplete가 되면 그때 마지막 데이터를 보내줍니다. - Subject와 Driver의 차이를 설명하시오.
Subject 와 Driver 는 모두 RxCocoa 의 Observable 이지만, 몇가지 차이점이 있습니다.
Subject는 Observer와 Observable의 역할을 모두 수행할 수 있는 클래스
Drvier는 UI 이벤트를 처리하기 위해 설계된 Observable, UI 이벤트는 메인 스레드에서 작동해야 하므로, Drvier는 자동으로 MainScheduler에서 작동됩니다.
또한 Driver는 error이벤트를 방출하지 않으며, 구독이 해제되기 전까지 항상 메모리에 존재합니다. - Single, Completable, Maybe의 차이점에 대해 설명하고, 언제 적용하면 좋을지 설명하시오.
- Single, just Observable과 같이 단일 요소를 방출하지만, Swift에 Result 타입과 유사하게 .success 혹은 .error 이벤트 만을 방출할 수 있습니다. 즉, .completed 이벤트를 따로 방출하지 않습니다.
- Completable이 single과 가장 큰 차이점은 Completable은 아무 요소도 방출하지 않습니다. Completable은 .completed와 .error만을 방출합니다.
- Maybe의 특징은 위에서 설명한 두 Traits의 특징을 모두 가지는 Traits입니다. 때문에 .success, .completed, .error 세 가지 이벤트를 모두 방출할 수 있습니다.
언제 적용하면 좋을지 ?
Single => 네트워크 / Completable => 비동기등 에러처리 / Maybe => 캐시 데이터 얻어오기
MRC
- ARC 대신 Manual Reference Count 방식으로 구현할 때 꼭 사용해야 하는 메서드들을 쓰고 역할을 설명하시오.
Manual Reference Count(MRC) 방식은 객체의 수명을 관리하기 위해 개발자가 직접 레퍼런스 카운트를 증가시키고 감소시키는 방식입니다
retain: 객체의 레퍼런스 카운트를 증가시킵니다.
release: 객체의 레퍼런스 카운트를 감소시킵니다.
autorelease: 객체를 autorelease pool에 넣어 일정 시점에 자동으로 release되도록 합니다.
retainCount: 객체의 현재 레퍼런스 카운트를 반환합니다.
dealloc: 객체가 해제될 때 호출되는 메서드입니다.
이러한 메서드들을 적절하게 사용하여 객체의 수명을 관리함으로써 메모리 누수와 같은 문제를 방지할 수 있습니다. - retain 과 assign 의 차이점을 설명하시오.
retain은 속성이 할당된 객체를 소유한다는 것을 나타냅니다.
속성에 객체가 할당될 때마다 해당 객체의 레퍼런스 카운트를 증가시킵니다.
assign은 속성이 객체를 참조하지만 소유하지 않음을 나타내고,
레퍼런스 카운트를 증가시키지 않습니다. - 특정 객체를 autorelease 하기 위해 필요한 사항과 과정을 설명하시오.
객체를 autorelease 하기 위해서는 객체를 생성한 후에 autorelease 메서드를 호출하여 현재의 autorelease pool에 추가해야 합니다. 이후에는 autorelease pool이 해제될 때 자동으로 객체가 해제됩니다. - Autorelease Pool을 사용해야 하는 상황을 두 가지 이상 예로 들어 설명하시오.
루프 내에서 반복적으로 생성되는 객체, 대용량 데이터 처리에서 autorelease pool을 사용하여 객체를 적절히 해제하면 메모리 누수를 방지하고 사용량을 효율적으로 관리할 수 있습니다. - 다음 코드를 실행하면 어떤 일이 발생할까 추측해서 설명하시오. Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];
alloc 메서드로 객체를 할당하고 init 메서드로 초기화한 후, autorelease 메서드를 호출하여 autorelease pool에 객체를 추가합니다. 객체는 autorelease pool이 해제될 때 자동으로 해제됩니다. (ARC와 같은 개념)
Advanced
- method swizzling이 무엇이고, 어떨 때 사용하는지 설명하시오.
- NSCoder 클래스는 어떤 상황에서 어떻게 써야 하는지 설명하시오.
- Responder Chain 구조에 대해 설명하고, First Responder 역할에 대해 설명하시오.
- NSObject부터 UIButton 까지 상속 과정의 계층과 역할을 설명하시오.
- shallow copy와 deep copy의 차이점을 설명하시오.
- Push Notification 방식에 대해 설명하시오.
- Foundation 과 Core Foundation 프레임워크의 차이점을 설명하시오.
- NSURLConnection 에서 사용하는 Delegate 메서드들에 대해 설명하시오.
- Synchronous 방식과 Asynchronous 방식으로 URL Connection을 처리할 경우의 장단점을 비교하시오.
- Plist 파일 구조와 Plist 파일에 저장된 데이터를 다루기 적합한 클래스를 설명하시오.
- Core Data와 Sqlite 같은 데이터 베이스의 차이점을 설명하시오.
- JSON 데이터를 처리하는 방식과 파서, 객체 변환 방식에 대해 설명하시오.
- 웹 서버와 HTTP 연결을 사용해서 데이터를 주거나 받으려면 사용해야 하는 클래스와 동작을 설명하시오.
- Protocol에서는 왜 var만 되는지 설명하시요.
- DispatchQueue.main.sync를 사용하는 상황을 설명하시오.
- Run Loops에 대해 설명하시오.
Objective-C
- Swift의 클로저와 Objective-C의 블록은 어떤 차이가 있는가?
- Mutable 객체과 Immutable 객체는 어떤것이 있는지 예를 들고, 차이점을 설명하시오.
- dynamic과 property 의미와 차이를 설명하시오.
- @property로 선언한 NSString* title 의 getter/setter 메서드를 구현해보시오.
- @property에서 atomic과 nonatomic 차이점을 설명하고, 어떤것이 안전한지, 어느것이 기본인지 설명하시오.
- @property로 선언한다는 것의 의미를 설명하고, .h에 넣을 경우와 .m에 넣을 경우 차이점을 설명하시오.
- -performSelector:withObject:afterDelay: 메시지를 보내면 인자값의 객체는 retain되는가? 그 이유를 함께 설명하시오.
- Objective-C 에서 캡슐화된 데이터를 접근하기 위한 방법들을 설명하시오.
- Fast Enumeration 이란 무엇인지 설명하시오.
- unnamed category 방식에 대해 설명하시오.
- Category 확장과 Subclass 확장의 차이점을 설명하시오.
- Category 방식에 대해 설명하시오.
- Objective-C 에서 Protocol 이란 무엇인지 설명하시오.
- Objective-C++ 방식이 무엇인지 설명하고, 어떤 경우 사용해야 하는지 설명하시오.
Reference
https://github.com/JeaSungLEE/iOSInterviewquestions
728x90
반응형