1. Bounds와 Frame의 차이점을 설명하시오
Bounds와 Frame은 모두 CGRect 타입이며 원점을 나타내는 데이터(origin)와 size를 나타내는 데이터를 갖고 있다.
Bounds는 자신만의 좌표시스템에서의 View의 위치와 크기 값이고 origin은 디폴트로 (0,0)으로 설정되어 있으며 주로 View 내부에 그림을 그릴 때 drawRect를 사용한다.
Frame은 superView(한단계 상위 뷰)의 좌표시스템 안에서 view의 위치와 크기 값이고 주로 View의 위치나 크기를 설정하는 경우 사용한다.
2. 실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오.
시뮬레이터는 Mac에서 실행되는 앱이기 때문에 CPU, 메모리 및 네트워크 연결을 비롯한 컴퓨터 리소스에 엑세스할 수 있지만 실제 디바이스의 메모리 및 네트워크 속도와 다르기 대문에 실제 디바이스가 없다면 정확한 성능 테스트가 불가능
실제 맥에서는 부드럽게 실행되던 앱이 실제 디바이스로 테스트했을 때 부드럽지 않을 수 있다.
페이스 아이디를 이용할 때 직접 얼굴 인식이 안됨. 그러나 인식됨, 안됨 처리를 해볼 수는 있음
하드웨어적으로는 가속도, 가압계, 주변광, GPS 등 여러 센서 기능을 이용할 수 없음.
카메라, 마이크, 전화 기능도 사용할 수 없음.
마우스로 시뮬레이터를 터치하기 때문에 두 손가락으로 하는 줌 아웃 테스트 불가능
API측면에서도 apple의 푸시 알림 받기와 보내기 지원하지 않음
3. Core data란?
앱의 콘텐츠나 데이터 자체를 저장/보관 하는 특별한 개체를 뜻함.
4. 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체는 무엇인가?
UIVIew
화면 위의 콘텐츠를 관리하기 위한 사각형 영역 객체를 UIVIew라고 정의한다.
즉 사용자에게 보일 UILabel, UIButton과 같은 화면 구성요소들을 모두 UIView라고 하지만 이러한 객체들을
관리하기 위한 객체가 UIViewController이다.
5. App Thinning에 대해서 설명하시오
애플리케이션이 디바이스에 설치될 때, 앱 스토어와 운영체제가 디바이스의 특성에 맞게 설치되도록 하는 설치 최적화 기술을 의미
최소한의 디스크 사용과 빠른 다운로드를 제공할 수 있음.
구성으로는 슬라이싱, 비트코드, 주문형 리소스가 있음.
5-1. 슬라이싱이란?
다양한 기기와 운영체제 버젼에 대해 여러 가지 app bundle의 변형을 생성하고 전달하는 과정이다.
5-2. 비트코드란?
비트코드는 컴파일된 프로그램의 중간표현이다.
비트코드가 포함된 앱스토어 커넥트에 업로드한 앱은 앱스토어에서 컴파일 및 연결된다.
5-3. 주문형 리소스란?(on-demand resource)
주문형 리소스는 이미지나 사운드 같은 리소스를 키워드로 태그 할 수 있고, 태그별로 그룹을 요청할 수 있습니다.
게임으로 예를 들면, 현재 레벨에 필요한 데이터들을 다운로드하고, 그 위의 레벨의 데이터는 필요하지 않으므로,
사용자의 레벨이 필요할 때 데이터를 다운로드 하는 것.
6. 앱이 시작할 때 main.c에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?
7. @Main에 대해서 설명하시오
@Main은 프로그램 실행 시작 시 진입점으로 타입을 지정하기 위한 Swift언어의 기능.
사용자는 탐 레벨의 코드를 작성하는 대신 @main단일 유형의 속성을 사용할 수 있고, 라이브러리와 프레임워크는
프로토콜이나 클래스 상속을 통해 맞춤형 진입점 동작을 제공할 수 있다.
8. 앱이 foreground에 있을 때와 background에 있을 때 어떤 제약사항이 있나?
foreground에 있을 때에는 메모리 및 기타 시스템 리소스에 대해서 background보다 높은 우선순위를 가지며
시스템은 이러한 리소스를 사용할 수 있도록 필요에 따라 background 앱을 종료합니다.
background에 있을 때는 가능한 적은 메모리 공간을 사용해야 하며 자원 할당에 있어 foreground 상태보다
우선순위가 낮습니다.
9. 상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드들을 설명하시오.
10. 앱이 In-Active 상태가 되는 시나리오를 설명하시오.
전화나 메세지 같은 인터럽트가 발생하거나, 미리 알림 같은 특정 알림창이 화면을 덮어서 앱이 실질적으로 event를
받지 못하는 상태에 In-Active상태가 된다. 앱을 처음켜거나, foreground에서 background, background에서
foreground 상태가 될 때도 In-Active 상태가 된다.
Not Running -> Inactive -> Active -> Background -> Suspended
10-1. Not running상태란?
앱이 실행되지 않았거나 완전히 종료되었을 때 상태입니다.
10-2. In-Active상태란?
앱이 실행되면서 foreground에 진입하지만 어떠한 이벤트도 받지 않는 상태입니다.
10-3. Active 상태란?
앱이 실행 중이며 포어그라운드에 있고 이벤트를 받고 있는 상태입니다.
10-4. Background 상태란?
앱이 백그라운드에 있으며 다른 앱으로 전환되었거나 홈버튼을 눌러 밖으로 나갔을 때의 상태입니다.
10-5. Suspended란?
백그라운드에서 특별한 작업이 없을 경우 전환되는 상태입니다.
10-6. foreground란?
App이 실행되어 클라이언트에게 보여지고 있는 상태.
특징으로는 메모리 및 기타 시스템 리소스에 높은 우선순위를 가지며 시스템은 이러한 리소스를
사용할 수 있도록 필요에 따라 background 앱을 종료합니다.
10-7. background란?
앱이 백그라운드에 있는 상태이지만 여전히 실행되고 있는 코드가 있는 상태
특징으로는 가능한 적은 메모리 공간을 사용해야함.
사용자 이벤트를 받기 어렵고 공유 시스템 리소스를 해제하고 이미지 객체 참조 등 메모리 제한
11. scene delegate에 대해 설명하시오.
iOS 13 이후 UI 생명주기에 관한 이벤트를 처리하기 위해 사용하는 객체입니다.
앱을 실행하면 UIKit이 일반적으로 UIScene의 서브클래스인 UIWindowScene 객체를 생성합니다.
즉, SceneDelegate란 UI 상태에 따른 이벤트처리를 하기 위한 객체입니다.
12. UIApplication 객체의 컨트롤러 역할은 어디에 구현해야 하는가?
13. NSOperationQueue와 GCD Queue의 차이점을 설명하시오
- NSOperationQueue
14. GCD API 동작 방식과 필요성에 대해 설명하시오
15. Global DispatchQueue의 Qos에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.
16. iOS 앱을 만들고, UI를 구성하는 데 필수적인 프레임워크 이름은 무엇인가?
cocoa touch framework가 UIKit을 포함하는데 이 UIKit이 사용자 인터페이스를 구성하는데 필수적이다.
16-1. iOS 기본구조
1. cocoa touch
앱의 다양한 기능 구현에 필요한 다양한 핵심프레임워크를 포함하는 최상위 레벨의 프레임워크
2. media
그래픽 관련 서비스나 오디오 혹은 비디오 같은 멀티미디어 관련 서비스 제공
3. core services
문자열 처리, 데이터 집합, 네트워크 등의 서비스를 제공
4. core os
하드웨어와 네트워크에 관련된 low-level의 서비스를 제공
17. Foundation Kit은 무엇이고 포함되어 있는 클래스들은 어떤 것이 있는지 설명하시오
Foundation Kit은 Cocoa Touch Framework에 포함되어 있는 프레임워크 중 하나이다.
String, Int 등의 원시 데이터 타입과 컬렉션 타입 및 운영체제 서비스를 사용해 앱의 기본적인 기능을
관리하는 프레임워크이다.
또한 iterator, jsonEncoder, jsonDecoder와 같은 데이터 관련 클래스가 정의되어 있다.
17-1. iterator란?
배열이나 그와 유사한 자료 구조의 내부 요소를 순회하는 객체이다
17-2. jsonEncoder란?
데이터 유형의 인스턴스에서 JSON 개체로 변환하는 객체
17-3. jsonDecoder란?
JSON 개체에서 데이터 유형의 인스턴스로 변환하는 객체
18. Delegate란 무엇인지 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오.
delegate란 객체 지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라 처리해야 할 일
중 일부를 다른 객체에게 넘기는 것을 의미한다.
delegate는 객체 간의 작업이어서 참조 값을 사용(왜..참조값이지?)하기 때문에 retain 현상이 일어난다
해결 방법으로는 weak, unowned가 있다.
18-1. retain이란?
메모리가 해제되지 않아서 낭비되는 현상을 말함 즉 Memory Leak
18-2. weak과 unowned의 차이
weak 참조는 인스턴스에 대해 약한 참조 상태를 유지한다.
즉, 해당 인스턴스에 대한 참조가 ARC에 카운팅 되지 않는다는 것이다.
만약 다른 객체가 특정 인스턴스에 대해 강한 참조를 가지지 않는다면, 해당 인스턴스는 할당 해제가 된다.
unowned 참조는 참조 대상에 대해 강한 참조를 유지하지 않는다는 점은 weak참조와 비슷하다.
unowned 참조는 weak 참조와 동일한 목적으로 사용된다.
즉, 강한 참조 사이클을 회피하기 위해 사용된다.
차이점은 unowned참조의 경우 언제나 값이 존재할 것이라고 가정한다는 점.
weak 참조의 경우에는 특정 인스턴스의 참조가 할당 해제된 경우에는 참조를 nil로 설정하게 된다.
weak 참조의 경우 항상 optional로 선언되기 때문에, 해당 값에 접근하기 전에 언래핑 과정이 필요하다.
weak 참조의 경우 nil로 설정될 수 있기 때문에, 항상 optional로 선언된다.
이것이 weak 참조와 unowned 참조의 두번째 차이점이다.
weak 참조의 값은 접근하기 위해 언래핑해야 되지만, unowned 참조의 경우에는 언래핑 없이 바로
접근이 가능하다.
하지만 unowned 참조가 적용된 인스턴스에서 해당 unowned 참조가 할당 해제된 경우에도 해당 인스턴스는
nil로 설정되지 않기 때문에, 만약 해당 객체에 접근하려 할 경우 fatal error가 발생한다.
19. NotificationCenter 동작 방식과 활용 방안에 대해서 설명하시오.
NotificationCenter는 등록된 모든 Observer에게 정보를 전달하는 메커니즘입니다. observer는 notification들을 감지하고 있고 sender는 필요할 때 해당 observer에게 notification들을 보내주는 역할을 합니다. 옵저버를 등록하고 등록된 옵저버를 감시하면서 변경사항이 발생하면 등록된 옵저버에게 알려줍니다.
20. UIKit 클래스들을 다룰 때 꼭 처리해야 하는 애플리케이션 쓰레드 이름은 무엇인가?
Main 쓰레드
21. App Bundle의 구조와 역할에 대해 설명하시오.
애플리케이션 번들은 애플리케이션의 성공적인 작동에 필요한 모든 것을 저장한다.
앱 번들은 앱의 코드를 포함하고 있는 실행 가능한 파일인 my app
앱을 표시하는 application icons,bundle id, 버전 번호 등 앱에 대한 구성 정보를 포함하고 있는 파일인 info.plist
앱의 시작 인터페이스를 보여주는 이미지인 launch images
앱 런치 시간에 앱을 로드하기 위한 기본 인터페이스 객체(App delegate 객체의 인스턴스)를 포함한 MainWindow.nib
기본 설정을 구성하고, 표시할 프로퍼티 리스트와 기타 리소스 파일이 포함되어 있는 Settings.bundle
이미지나 사운드 및 애플리케이션에 필요한 기타 커스텀 데이터 파일로 구성된 커스텀 리소스 파일로 구성된다.
22. 모든 ViewController 객체의 상위 클래스는 무엇이고, 그 역할은 무엇인가?
모든 View Controller는 UIViewController를 상속받는다.
UIViewController는 모든 ViewController에 공통으로 작동하는 행동들이 정의 되어있고,
이를 상속받아 메서드를 추가하거나 override 할 수 있다.
23. 자신만의 Custom View를 만드려면 어떻게 해야하는가?
[Xib을 이용해 별도의 Storyboard처럼 관리하는 법]
Xib을 생성하고 또한 별도의 UIView를 상속받은 Class를 생성한다. 그리고 Xib에서 owner로 해당 클래스를
임명하고 커스텀 클래스 내에서 초기화 시, Xib 파일을 불러와 view로 임명하는 코드를 추가하고 원하는
작업들을 Storyboard와 동일하게 수행하면 된다.
[UIView을 상속받아 코드로만 구현]
UIView를 상속받는 클래스를 생성해 코드로만 원하는 작업들을 설정한다.
24. View 객체에 대해 설명하시오
화면에 content 표시, 그리기 및 애니메이션, 오토레이아웃, 제스처 인식 등 화면에 관한 것들을 담당하는 객체
View는 사용자 인터페이스의 기본 구성 요소이며 모든 조작은 main thread에서 해야한다.
25. UIView에서 Layer 객체는 무엇이고, 어떤 역할을 담당하는지 설명하시오.
UIView는 화면의 직사각형 모양을 관리하는 객체로, 앱이 사용자와 상호작용하는 주요 방법이다.
UIVIew는 객체에 나타나는 콘텐츠들을 관리하는 CALayer 타입의 Layer를 가지고 있다.
UIVIew는 이미지나 애니메이션들을 직접 제어하지 않고, View에게 작업을 위임합니다.
Layer Core Animation 클래스인 CALayer 타입입니다.
UIView에게 작업을 전달받는 View는 Core Animation 클래스인 CALayer Layer 객체에서 직접 작업을 수행한다.
주로 뷰 위의 콘텐츠, 애니메이션을 그리는 시각적인 행위의 작업을 담당한다.
자세하게는 그림자, 테두리, 3d 변형, 마스킹, 애니메이션 등의 작업을 처리한다.
유연한 커스터 마이징이 가능하다는 특징을 가지고 있다.
26. UIWindow 객체의 역할은 무엇인가?
윈도우는 UIView의 자식 클래스이며 뷰의 계층 구조에서 최상위의 뷰의 역할을 하며 뷰들을 담는 컨테이너 역할.
코드로 화면을 구현할 때에는 window를 직접 생성해야 하며 스트리보드를 통해 화면을 구현할 경우에는
window가 자동 생성
27. UINavigationController의 역할이 무엇인지 설명하시오
네비게이션 스택을 사용하여 뷰 컨트롤러를 순차적으로 보여주는 역할을 한다.
28. TableView의 동작 방식과 화면에 Cell을 출력하기 위해 최소한 구현해야 하는 DataSource 메소드를 설명하시오.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int // cell의 갯수
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // 셀을 정의
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat // 셀의 높의를 정의
29. 하나의 View Controller 코드에서 여러 TableView Controller 역할을 해야 할 경우 어떻게 구분해서 구현해야 하는지 설명하시오.
tableview 메서드에서 매개변수로 받은 tableView가 원하는 tableView가 맞는지 구분해서 구현하면 됩니다. tag를 등록하여 구분하는 방법도 있습니다.
30. setNeedsLayout과 setNeedsDisplay의 차이에 대해 설명하시오.
31. StackView의 장점과 단점
스택뷰는 View들을 일정한 간격으로 배치하기 위해 사용된다.
StackView를 배치한 후 그 내부의 View들을 추가해 사용하면 된다.
View 사이의 관계는 Constraint로 설계할 수 있지만 Stack View를 이용하면 보다 편리하게 배치 가능
31-1. Horizontal StackView
View들을 가로로 배치한다
31-2. Vertical Stack View
View들을 세로로 배치한다.
32. NSCache와 딕셔너리로 캐시를 구성했을 때의 차이를 설명하시오
딕셔너리는 메모리가 부족하면 값을 삭제하는 코드를 작성해야 하지만 NSCache는 메모리를 자동으로 관리.
NSCache 는 Thread-safe하다. 데이터를 쓸 때마다 lock을 해줄 필요가 없음
33. URLSession에 대해서 설명하시오
URLSession은 앱과 서버 간 데이터를 주고 받는 API를 제공하는 클래스이다.
HTTP를 포함한 몇 가지 프로토콜을 지원하고 인증, 쿠키 관리, 캐시 관리 등도 지원한다.
URL Loading System에서 알아봤듯이 URLSession은 자체적으로 비동기적으로 동작하기 때문에 따로
비동기 처리를 할 필요가 없습니다.
34. prepareForReuse에 대해서 설명하시오
prepareForReuse()는 말그대로 테이블뷰에서 셀이 재사용되기 전에 불려서 준비시키는 함수다.
35. 다크모드 지원 방법 모두 설명
- 시스템 컬러를 사용할 경우 Semantic color를 이용해 다른 컬러가 표현된다.
- Assets를 이용해서 지원한다.
- 코드로 지원한다.
36. 앱 생명주기
active inactive 이거임
37. Viewcontroller 생명주기
init
loadView
viewDidLoad
ViewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear
viewDidUnload
38. TableView와 CollectionView의 차이점을 설명하시오
테이블 뷰는 간단하고 보편적인 리스트를 만들어 보여줄 수 있는 반면, 컬렉션 뷰는 특정한 모습으로
커스텀한 목록을 만들어 보여줄 수 있다.
AutoLayout
1. 오토 레이아웃을 코드로 작성하는 방법은 무엇인가 (3가지)
2. hugging, resistance에 대해서 설명하시오.
hugging은 우선순위가 클수록 자신의 크기를 유지하려 하고, 우선순위가 작을수록 크기가 늘어는 속성을 말함.
resistance는 우선순위가 클수록 자신의 크기를 유지하려하고, 우선순위가 작을수록 크기가 작아지려는 속성을 말함.
예로 두 개의 뷰가 서로 붙어있고, 그 크기가 지정되지 않은 상태에서 우선순위가 없다면 hugging이 클수록 작게,
resistance가 클수록 커지게 너비를 가지게 된다.
3. Intrinsic Size에 대해서 설명하시오.
Intrinsic Size는 콘텐츠의 본질적인 크기이다.
UILabel에서 컨텐츠의 길이가 변하면 자동으로 계산해주는 것에 사용되는 것과 같습니다.
4. 스토리보드를 이용했을 때의 장단점을 설명하시오.
장점
코드를 모르더라도 UI를 쉽게 구현할 수 있다.
직관적으로 앱의 흐름을 파악할 수 있다.
뷰의 초기화가 필요없어 만드는데 오랜 시간이 걸리지 않는다.
단점
뷰의 컴포넌트가 많아질수록 스토리보드 파일의 로딩시간이 오래 걸린다.
컴포넌트가 많아질수록 세밀한 조정이 어렵다.
스토리보드 파일의 포맷이 XML이기 때문에 협업 시에 Merge Conflict가 발생하고, 해결하기 어렵다.
뷰의 재사용성이 떨어진다.
스토리보드의 identifier를 항상 지정해줘야하므로, 번거로울 수 있다.
5. SafeArea에 대해서 설명하시오
컨텐츠를 가리지 않는 것이 보장된 역역 status bar, navigation bar, tool bar 등에도 덮이지 않는 뷰를 그리기 위함
6. Left Constraint와 Leading Constraint의 차이점을 설명하시오
Left Constraint와 Right Constraint는 절대적이며 항상 화면 또는 컨트롤의 왼쪽/오른쪽을 참조한다.
Leading Constraint와 Trailing Constraint는 device local의 영향을 받는다.(장치별 국가설정)
Swift
1. struct와 class와 enum의 차이를 설명하시오.
Class
swift에서는 객체라는 용어 대신에 '인스턴스'라는 용어 사용
단일 상속만
(인스턴스/타입) 메서드 or 프로퍼티
참조타입
데이터를 전달할 때 값의 메모리 위치를 전달
주소를 복사하여 이미 존재하는 인스턴스의 위치를 가리킵니다. 참조하는 값이 존재하는 위치를 stack 메모리 영역에, 참조되는 값은 heap 메모리 영역에 저장됩니다.
ios 프레임워크의 대부분이 클래스로 구성되어 있다.
Struct
상속이 불가
(인스턴스/타입) 메서드 or 프로퍼티
값 타입
데이터를 전달할 때 값을 복사하여 전달
값이 복사되어 새로운 인스턴스가 생성되고 이 인스턴스가 stack 메모리 영역에 저장됩니다.
Swift의 대부분의 큰 뼈대는 모두 구조체로 구성되어있다.
언제 사용? 참조가 아닌 복사를 원할 때 or 자신을 상속할 필요가 없거나 상속받을 필요가 없을 때
Enum ( 이늄 ) Enumeration
다른 언어의 열거형과는 많이 다른 존재
유사한 종류의 여러 값을 유의미한 이름으로 한 곳에 모아 정의한 것
열거형 자체가 하나의 데이터 타입
상속이 불가 (인스턴스/타입) 메서드 or 연산 프로퍼티
지정 기존 프로퍼티는 값을 저장하는 역할을 하지만 연산 프로퍼티는 특정한 연산을 통해 값을 리턴해주는 것을 의미합니다.
값 타입
7-1. struct 사용 권장 이유
애플은 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하는 것을 권장
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 value 타입이며 참조하는 것보다 복사하는 것이 합당할때
- 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
2. class의 성능을 향상 시킬 수 있는 방법들을 나열해보시오
방법 1 .heap 보다는 stack 메모리를 할당하려고 노력한다.
class보단 struct나 enum을 사용한다.
class는 heap 할당, struct와 enum은 stack 할당.
방법 2. reference counting을 적게 만든다.
클래스에서 스트링 타입의 변수 사용을 줄인다.
string은 struct 타입이지만 문자열의 콘텐츠를 heap에 저장하기 때문
방법 3. dynamic dispatch(런타임에 정해지고 다형성 때문에 사용)보다 static dispatch(컴파일 타임에 정해짐)
을 지향한다.
클래스를 선언할 때 상속되지 않는 클래스에 final을 붙이면 성능이 향상된다.
2-1. heap과 stack 개념
프로그램이 실행되기 위해서는 프로그램이 메모리에 로드 되어야 한다.
프로그램이 운영체제로부터 할당받는 메모리 공간은 4가지가 있음
- 코드 영역
메모리의 코드 영역은 실행할 프로그램의 코드가 저장되는 영역
- 데이터 영역
데이터 영역은 프로그램의 전역 변수와 정적 변수가 저장되는 영역
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
- 스택 영역
스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
스택 영역은 푸시 동작으로 데이터를 저장하고, 팝 동작으로 데이터를 인출한다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
- 힙 영역
힙 영역은 사용자가 직접 관리할 수 있는 "그리고 해야만 하는" 메모리 영역이다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
3. Copy on Write는 어떤 방식으로 동작하는지 설명하시오
Swift에서 큰 값 타입의 데이터를 변수에 대입하거나 매개변수로 넘기게 되면 매우 비싼 복사 연산을 하게 된다.
이 이슈를 최소화하기 위해서 Swift 표준 라이브러리는 배열과 같은 몇몇 값 타입에 대해(두 개 이상의 참조가 있고,
변형에 의해서만 복사가 일어나는) 하나의 참조만 있다면 복사가 아니라 해당 참조 내에서 값 변경이 일어나는
매커니즘을 설계했다.
그래서 배열을 변수에 대입하거나 함수의 매개변수로 넘겨주는 것은 반드시 배열의 모든 데이터를 복사한다는
것을 의미하지 않는다.
한마디로 Copy-on-Write은 데이터 복사 시 실제로 값을 복사하지 않고, 동일한 값을 참조하다가 데이터
변경이 발생될 시에 복사해 값을 변경하는 기법이다.
4. Convenience init에 대해서 설명하시오
swift에서 super class에서 상속받은 프로퍼티들을 포함하여, 모든 저장 프로퍼티가 초기 값을 가질 수
있도록 Class 유형에 대해 두 가지 종류의 초기화를 정의 한다.
두 가지는 init, Convenience init이다.
init 에서는 모든 저장 프로퍼티가 반드시 초기화되어야 함.
Convenience init은 일부 프로퍼티 값이 없더라도 에러가 뜨지 않도록 임의의 값을 지정해주는 보조 이니셜라이저
*init의 보조이기 때문에 미리 선언한 init을 활용해서 사용해야 한다.
5. AnyObject에 대해 설명하시오.
AnyObject는 모든 클래스 타입의 인스턴스를 나타낼 수 있는 프로토콜이다.
AnyObject로 선언 시, "클래스 타입"만 저장할 수 있다.
따라서 클래스 타입이 아닌 구조체, 열거형, Reference Type인 클로저는 AnyObject에 해당하지 않는다
-> 에러 발생
5-1. Any에 대해 설명하시오.
Any는 함수타입을 포함해 모든 타입의 인스턴스를 나타낼 수 있다.
value 타입(struct, enum), Reference 타입(class, closure) 이건 상관 없이 저장이 가능하다.
한마디로 Any는 모든 타입을 포함할 수 있는 범용 타입이다.
장점
Any, AnyObject는 모든 타입, 모든 클래스 타입을 저장할 수 있다는 장점을 가지고 있다.
단점
타입캐스팅. 이 두가지는 매번 타입 체크 및 형변환을 해야하기 때문.
방법으로는 as, as?, as!가 있음
6. optional이란 무엇인지 설명하시오
swift는 안전한 코딩을 할 수 있게 해주는 언어이다. 안정성의 기본 바탕에 있는 중요한 요소 중 하나.
? 키워드를 사용하는 Optional은 변수의 값이 nil일 수 있다는 것을 표현한다.
8. Subscripts에 대해 설명하시오.
class, struct,enum 에서 collection, list, sequence 등 집합의 특정 멤버 요소에 쉽게 접근하기 위한 방법
이것을 이용하면 추가적인 메소드 없이 특정 값을 할당하거나 가져올 수 있음
getter, setter 메서드를 구성하지 않고도 인덱스를 통해 어떤 값을 빠르게 설정하거나 가져올 수 있음
9. String은 왜 subscript로 접근이 안되는지 설명하시오.
다른 언어와 달리 Swift에서는 String에서 Int 형식으로 인덱스 참조가 불가능하다.
String은 Character의 집합인데, Swift에서 Character는 1개 이상의 unicode scalar로 이루어져 있어,
크기가 가변적이기 때문이다.
10. instance 메서드와 class 메서드의 차이점을 설명하시오
Instance 메서드는 Class, struct, enum 형태의 인스턴스에 속한 메서드를 의미한다.
클래스를 통해 호출할 수 없고, 클래스의 인스턴스를 만들어 실체화 하여 생성된 인스턴스를 통해서 호출할
수 있는 메서드이다.
Class 메서드는 인스턴스를 만들어 실체화 하지 않아도 클래스를 통해 직접적으로 호출할 수 있다. (인스턴스 없이 호출할 수 있는 메서드를 타입 메서드라고 함)
func 키워드 앞에 class 키워드가 붙어 class func methodName(){} 형태로 선언한다.
Instance 메서드와 달리 struct, enum에서 사용할 수 없다.
11. class 메서드와 static 메서드의 차이점을 설명하시오
타입 메서드를 선언하기 위해서는 func앞에 static이나 class를 붙여주면 됨.
이 둘의 차이는 메서드 오버라이딩의 차이.
static은 Subclass에서 해당 타입 메서드를 오버라이딩 하는 것을 금지 함.
이와 달리 class는 오버라이딩을 허용함.
12. Delegate 패턴을 활용하는 경우의 예를 들어 설명하시오.
프로토콜을 이용하여 권한을 위임하고 일을 처리하는 방식의 디자인 패턴이다.
delegate 패턴은 클래스나 구조체의 인스턴스에 특정 행위에 대한 책임을 다른 타입의 인스턴스에게 넘기는 방식.
예로 들어 View Controller를 보면, TableView의 특정 셀에 있는 여러 개의 버튼 중 특정 버튼을 눌렀을 경우에
해야할 일을 View Controller로 넘겨주기 위해서 Delegate 패턴을 사용한다.
13. Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오
싱글톤 패턴은 특정 용도로 객체를 하나 생성해서 공용으로 사용하고 싶을 때 사용하는 방법입니다.
즉, 인스턴스가 하나만 존재하는 것을 보증하고 싶을 경우에 사용하게 됨.
주로, 환경설정, 네트워크 객체, 로그인 정보 등을 특정 용도로 생성해둔 객체에 넣어두고 필요할때마다 여러
객체에서 접근 가능하도록 하여 데이터를 사용한다.
데이터를 공유할 수 있다는 대표적인 장점이 있다.
단점으로는 한번 할당된 메모리는 끝날때까지 할당되어 있으므로 메모리 낭비가 존재한다.
14. KVO 동작 방식에 대해 설명하시오
KVO는 A객체에서 B객체의 키의 값이 변화됨을 감지할 수 있는 패턴입니다.
메서드나 다른 액션에서 나타나는 것이 아니라 프로퍼티의 상태에서 반응하는 형태.
모델 객체의 어떤 값이 변경되었을 때 이를 UI에 반영하기 위해서 컨트롤러는 모델 객체에 Observing을
도입해 델리게이트에 특정 메시지를 보내 처리할 수 있도록 하는 것.
즉, 변수에 코드를 붙여 변수가 변경될 때마다 코드가 실행되도록 하는 방법을 의미한다.
KVO는 순수 스위프트 코드로는 좋지 않은데, 그 이유는 Objective-c 런타입에 의존하고 있기 때문이다.
그래서 NSObject를 상속받기 위해 @objc를 반드시 붙여줘야 된다.
특히 KVO는 속성 각각에 @objc dynamic을 붙여줘야 한다.
15. Delegates와 Notification 방식의 차이점에 대해 설명하시오.
delegate는 지정된 객체가 해야하는 메소드들의 원형을 프로토콜 형태로 정해놓은 디자인 패턴이다.
이때 delegate 역할을 하려는 객체는 이 프로토콜을 따르며 원형만 있던 메소드들을 구현합니다.
delegate는 많은 줄의 코드가 필요하고, 많은 객체들에게 이벤트를 알려주는 것이 비효율적이다.
notification은 서로 데이터를 보내주고 통신할 수 있도록 하기 위해 Notification Center라는 싱글턴
객체를 통해 이벤트들의 발생 여부를 옵저버를 등록한 객체들에게 Notification을 post하는 방식으로 사용한다.
이때 Notification name이라는 key 값을 통해 주고 받을 수 있다.
16. 멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명하시오.
고려해야 할 점은 어떤 작업을 글로벌 큐에 넣어야 하는지 정확히 알아둬야 하고, 글로벌 큐에 작업을 배치할 때,
작업에 따라 QoS를 적절하게 사용해야 한다.
또한 동기로 할지, 비동기로 할지를 명확하게 정의하고, 상황에 따라 작업 간 인과관계를 설정하거나, 특정 시간
이후에 처리하도록 설정해야 한다.
직접적으로 스레드를 관리하지 않고 Queue를 활용해 작업을 분산 처리하고 GCD, operation을 이용해 iOS에서
알아서 스레드 숫자를 관리한다.
그리고 다른 스레드에서 작업들이 "비동기적으로 동작" 하도록 만들어야 한다.
KVO vs KVC
Key의 개념
문자열(key)를 의미하고 이 key값을 통해 인스턴스의 프로퍼티 값에 간접적으로 접근하게 해주는 objective-c에서 나온 개념
KVC
인스턴스의 프로퍼티에 접근할 때 key값인 문자열로 접근하는 방법
kvc는 objective-c 런타임에 의존하므로 프로퍼티 앞에 @objc 어노테이션을 붙여서 사용
단 objective-c의 것이기 때문에 NSobject가 가지고 있으므로 NSObject의 서브클래스여야 가능
KVO
kvc와 같이 key값을 가지고 프로퍼티에 접근하는데, 이때 observing 할 수 있는 방법
프로퍼티 키워드에 @objc dynamic을 붙여서 사용
GCD 란?
GCD 는 iOS 에서 멀티코어 프로세서에 코드를 동시에 실행시키게 해주는 프레임워크이다.
GCD는 iOS 에서 멀티 스레드 환경에서 다수의 스레드에 작업을 적절히 분배시키는 방법
GCD 에서 사용하는 Queue 가 Dispatch Queue
프로그래머가 Dispatch Queue 에 작업을 보내면 그에 따라 스레드를 적절히 생성해서 실행하고 작업이 종료되면 스레드를 제거한다.
사용 예
DispatchQueue.global().async { //task } // global dispatch queue 에 작업을 비동기 적으로 보낸다! D
ispatchQueue: iOS에서 동시성 프로그래밍을 돕기 위해 제공하는 queue
global: DispatchQueue의 종류
async: 비동기
16-1. 글로벌 큐란?
DispatchQueue는 작업 항목의 실행을 관리하는 클래스입니다.
DispatchQueue는 장점은 일반 Thread 보다 쉽고 효율적으로 코드를 작성할 수 있습니다. 보통 서버에서 데이터를 받고 이미지 동영상을 외부에서 다운로드 및 처리할 때 CPU 사용량이 많아 처리를 Main Thread가 아닌 별도의 Thread에서 처리한 뒤 Main Thread로 결과만을 전달하여 화면에 표시하도록 하여 CPU를 관리할 수 있습니다.
DispatchQueue의 종류 : Seral / Concurrent
Seral
이전 작업이 끝나면 다음 작업을 순차적으로 실행하는 직렬 형태의 Queue. 하나의 자겁을 실행하고 그 실행이 끝날 때까지 대기열에 있는 다른 작업을 잠시 미루고 있다가 직전의 작업이 끝나면 실행합니다.
Concurrent
이전 작업이 끝날 때 까지 기다리지 않고 병렬 형태로 동시에 실행되는 Queue. 즉 대기열에 있는 작업을 동시에 별도의 Thread를 사용하여 실행합니다.
Main(serial)
Main Tread에서 처리되는 형태이며 Xcode의 UiKit 및 SwiftUI의 모든 요소들은 Main Queue에서 수행되어야 합니다. Global(concurrent)
시스템 전체에 공유되는 concurrent Queue. 병렬적으로 동시에 실행이 되긴 하지만 QoS를 통해 우선순위를 결정해 줄 수 있습니다. 우선순위가 높은 작업은 낮은 순위의 작업보다 더 빨리 실행되며, 이를 잘 이용하면 빠르고 렉 없는 앱을 만들 수 있습니다.
QoS? [ Quality of Service ]
DispatchQueue에서 수행 할 작업을 분류하기 위해 사용됩니다. QoS를 지정해줘서 중요도를 표시하고, 시스템이 우선순위를 정하고 이에 따라 스케쥴링을 하게 됩니다.
DispatchQueue.global(qos: .background) { // some code here }
QoS 종류
DispatchQueue.global(qos: .userInteractive) {} //Main Queue
DispatchQueue.global(qos: .userInitiated) {} //유저가 시작한 작업, 유저가 응답을 기다림
DispatchQueue.global(qos: .default) {} //userInitiated와 utility의 중간
DispatchQueue.global(qos: .utility) {} //시간이 걸리며 즉각적인 응답이 필요하지 않은 경우
DispatchQueue.global(qos: .background) {} //눈에 보이지 않는 부분의 작업. 완료 시간 중요X
DispatchQueue.global(qos: .unspecified) {}
18. 프로토콜이란 무엇인지 설명하시오
특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진(자세한 계획을 일컫는다) 프로토콜은 class나 struct의 행동을 정의하는 역할을 합니다.프로토콜은 행동을 정의하기만 할 뿐 구현하지 않습니다. 어떠한 클래스나 구조체가 해당 프로토콜을 따른다는 것은 프로토콜에 정의된 행동들을 구현해야함을 의미합니다.
19. Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오.
POP는 Protocol Oriented Programming 약자입니다. OOP는 Object Oriented Programming 약자입니다. POP는 뜻 그대로 프로토콜 중심 프로그래밍이고 OOP는 객체 중심 프로그래밍입니다
POP는 프로토콜 확장을 통하여 수평 구조로 타입을 확장하고, OOP는 슈퍼클래스의 상속을 통하여 수직 구조로 타입을 확장하는 방식으로 다형성을 구현 합니다.
20. Hashable이 무엇이고, Equatable을 왜 상속해야 하는지 설명하시오
Hashable
- 정수 hash 값을 제공하는 타입
- hash → 해시 함수에 의해 얻어지는 값 → 해시값, 해시코드, 해시 체크섬
- 해시 함수: 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수
- hashValue - 어떠한 데이터를 Hash 함수에 넣게 되면 반환해주는 값
- HashTable에서 hash값을 찾기 위한 key가 필요하고 Unique해야 함.
→ Unique한지 비교하기 위해 Hashable은 Equatable을 채택하고 있음.
Equatable
- 값이 동일한 지 비교할 수 있는 타입
- 이 프로토콜을 준수하는 타입은 == 혹은 !=를 사용하여 비교할 수 있음.
- 기본 데이터 타입 Int, String, Double 등 Hashable 프로토콜을 준수하고 있어 값을 비교할 수 있음.
21. mutating 키워드에 대해 설명하시오
class는 참조 타입이고 struct와 enum은 값 타입이다.
값 타입의 속성은 기본적으로 인스턴스 메서드 내에서 수정할 수 없다.
만약 수정해야 하는 경우 mutating을 붙여주면 된다.
mutating을 선언한 메서드는 메서드 내에서 프로퍼티를 변경할 수 있고, 메서드가 종료될 때 변경한 모든
내용을 원래 strcut에 다시 기록한다. 또한 메서드는 self 프로퍼티에 새 인스턴스를 할당할 수도 있다.
mutating 키워드는 해당 메서드가 호출된다면 실제 복사를 해야한다고 알려주는 역할이다.
22. 탈출 클로저에 대해 설명하시오
함수의 인자로 전달된 클로저가 함수가 반환된 후 실행 되는 클로저를 의미한다.
말 그대로 전달인자로 받은 클로저가 함수 내부 scope안에서 실행되는 것이 아니라 이를 탈출해서
다른 어딘가로 가는 것을 말한다.
다음과 같은 경우를 탈출한다고 볼 수 있다.
- 전달받은 클로저가 클로저 함수 외부로 다시 반환
- 외부 글로벌 변수에 저장되는 경우
이 경우 @escaping을 붙여줘야 하고 그렇지 않으면 컴파일 에러가 발생한다.
이는 기존에 우리가 알고 있던 변수의 scope 개념을 무시한다.
왜냐하면 함수에서 선언된 지역 변수가 지역 변수의 영역을 뛰어넘어 함수 밖에서도 유효하기 때문이다.
이러한 탈출 클로저는 주로 비동기 작업을 하기 위해서 이다.
Alamofire.request(urlRequest).responseJSON { response in}
에서 reponse는 "responseJSON()"에 있는 지역 변수이다.
네트워크 통신은 보통 비동기로 작업하는데 탈출 클로저를 이용해 함수 반환 후에도 response 변수를 계속
잡고, 이후 함수 범위 밖에서도 이를 활용한 작업을 가능하게 해주는 것이다.
23. Extension에 대해 설명하시오
extension은 존재하는 클래스, 구조체, 열거형, 프로토콜 타입에 새롭게 기능적인 부분을 추가할 수 있고,
요구사항을 구현하는데 사용할 수 있는 문법
extension을 활용함으로써 이전의 내부 소스에 접근할 수 없는 원본 타입에 새로운 기능을 부여할 수 있음.
구조체, 클래스, 열거형 추가 구현부, 제약사항, 기능 등을 정의 가능
특정 타입의 기능 및 준수하는 프로토콜별 구현별을 분리해서 보다 코드 가독성을 높일 수 있음
24. Extension 내부에서 함수를 override 할 수 있는지 설명하시오
새로운 기능을 정의하는 것은 가능하지만 override를 할 수는 없다.
override는 부모클래스의 메서드를 자식 클래스가 재정의하는 것을 의미하는데, extension은 수평적인 확장이기 때문이다.
25. 접근 제어자의 종류엔 어떤게 있는지 설명하시오
5가지가 존재하는데 private, filePrivate, internal, public, open이 있다.
- private
가장 한정적인 범위
기능을 정의하고 구현한 범위 내에서만 사용 가능
private로 지정한 기능은 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용 불가
- filePrivate (파일 외부 비공개 접근 수준)
filePrivate로 지정된 요소가 구현된 소스파일 내부에서만 사용 가능
해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용
- internal (내부 접근 수준)
기본적으로 모든 요소에 암묵적으로 저장하는 기본 접근 수준 (표기하지 않을 경우 자동으로 internal)
internal로 지정된 요소는 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있으나 외부 모듈에서는 접근 불가
보통 외부에서 사용할 클래스나 구조체가 아니고, 모듈 내부에서 광역적으로 사용할 경우에 지정한다.
- public (공개 접근 수준)
public으로 지정된 요소는 어디에서든 쓰일 수 있음
주로 프레임워크에서 외부와 연결된 인터페이스를 구현하는데 많이 쓰임
- open 개방 접근 수준
공개 접근수준 이상으로 높은 접근 수준
클래스와 클래스 멤버에서만 사용이 가능
클래스가 정의된 모듈 밖의 다른 모듈에서도 상속할 수 있음
open으로 정의된 클래스 멤버는 정의된 모듈 밖의 다른 모듈에서도 재정의 가능
클래스를 open으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모 클래스로 사용할 목적으로 설계했다는 것을 의미함
25-1. 접근 제어란?
주체와 객체 사이의 정보 흐름을 통제하는 것
코드끼리 상호작용 시 파일 간, 모듈 간에 접근을 제한
불필요한 접근으로 의도치 않은 결과를 초래하거나 꼭 필요한 이상의 코드가 노출될 위험이 있을 때 사용
26. defer란 무엇인지 설명하시오
defer란 현재 코드 블록을 나가기 전에 꼭 실행해야 되는 코드를 작성하여 코드가 블록을 어떻게 빠져 나가든
꼭 마무리해야 되는 작업을 할 수 있게 도와줍니다.
27. defer가 호출되는 순서는 어떻게 되고 defer가 호출되지 않는 경우를 설명하시오
defer가 호출되는 순서는 코드블록 순으로 호출되지만, 같은 코드 블럭에서 여러 defer가 있을 경우 역순으로 호출.
defer가 호출되지 않는 경우는 세가지가 있음
첫째로 throw를 이용해서 오류를 던질 경우 중간에 throw가 발생해서 함수가 종료 될 경우 아래 선언 된 defer에
도달하지 못해 함수가 종료 되어도 defer가 호출되지 않는다.
두번째로 guard 문을 사용해 중간에 함수를 종료하는 경우 guard문을 이용했을 경우에도 위의 throw를 이용해
오류를 던질 경우와 마찬가지로 guard문 이후에 나오는 defer에 도달하기 전에 함수가 종료됨.
세번째로 (Never)비반환함수인 경우
에러가 발생하면서 함수를 반환하지 않고 실행을 종료하기 때문에 defer가 호출되지 않는다.
28. property wrapper에 대해서 설명하시오
어떤 값이 있으면 이 값을 한번 감싸서 저장을 위한 로직과 얻어오기 위한 로직을 어느 정도 분리해서 반복을
줄여줄 수 있는 방법을 제공하는 속성이다.
프로퍼티 래퍼를 사용하면 코드의 재사용성을 높여 코드가 짧아지는 효과를 나타낼 수 있다.
29. Generic에 대해 설명하시오
제네릭 타입이란 "타입을 파라미터화 해서 컴파일 시 구체적인 타입이 결정되도록 하는 것"이라는 뜻.
30. some 키워드에 대해 설명하시오
some 키워드는 리턴 타입을 자동으로 그리고 빠르게 추론할 수 있는 스위치 기능이다.
불투명한 타입은 swift의 중요한 기능이다.
불투명한 타입이라는 것을 나타내는 some 키워드는 computed property 혹은 함수의 구체적인 return type
을 숨기는 것이 가능하다.
이를 통해 유연하고 간결하며 강력한 swift 코드를 작성할 수 있다.
예시 var body: some View{}
31. result 타입에 대해 설명하시오
result 타입은 Generic Enumeration으로 선언되어 있고, 경우에 따른 연관값을 포함하며, 성공과 실패를 나타내는 값
주로 api 통신 때 사용되어 성공했을 땐 success, 실패하면 error가 리턴되면 failure를 사용함.
32. Codable에 대해 설명하시오
자신을 변환하거나 외부 표현으로 변환할 수 있는 타입.
외부 표현은 JSON이라고 생각하면 된다.
33. Closure에 대해 설명하시오
클로저는 익명 함수라고 불리우며 func로 선언하는 것이 아니라 함수를 변수에 선언하는 형태이다.
"실행 가능한 코드 블럭"
.map {$0} 이런식으로 쓰여서 코드를 간결하게 나타낼 수 있음
34. Closure와 함수와의 관계에 대해 설명하시오
ARC
1. ARC란 무엇인지 설명하시오
swift는 프로그램 메모리 사용을 관리하기 위해 메모리 관리 기법인 ARC(Automatic Reference Counting)
을 사용한다.
컴파일 시 코드를 분석해서 자동으로 retain, release 코드를 생성해주는 것
참조된 횟수를 추적해 더 이상 참조되지 않는 인스턴스를 메모리에서 해제해 주는 것
ARC가 관리해주는 Reference Counting(참조 횟수 계산)은 참조 타입인 클래스의 인스턴스에만 적용된다.
구조체나 열거형은 값 타입으로 다른 곳에서 참조하지 않기 때문에 ARC로 관리할 필요가 없다.
ARC는 자동으로 메모리를 관리해주는 방식이다.
대부분의 경우 메모리 관리는 Swift에서 그냥 작동하기 때문에 개발자는 메모리 관리에 신경을 덜 쓸 수 있음.
ARC는 인스턴스가 더 이상 필요하지 않다면 해당 인스턴스를 메모리에서 해제시킨다.
ARC는 해당 인스턴스를 참조하는 다른 인스턴스의 프로퍼티나 변수, 상수 등의 개수를 세고, 해당 인스턴스에
대한 활성 참조가 1개 이상 존재하는 한 인스턴스를 메모리에 없애지 않는다.
1-1. ARC와 가비지 컬렉션 차이는 뭔가
가장 큰 차이는 참조 카운팅 시점이다.
ARC는 컴파일 시,
가비지 컬렉션은 프로그램 동작 중이다.
2. Retain Count 방식에 대해 설명하시오
3. Strong과 Weak 참조 방식에 대해 설명하시오
strong(강한 참조)
- 해당 인스턴스의 소유권을 가진다
- 자신이 참조하는 인스턴스의 retain count를 증가시킨다
- 값 지정 시점에 retain이 되고 참조가 종료되는 시점에 release가 된다.
- 선언할 때 아무것도 적어주지 않으면 default로 설정된다
weak(약한 참조)
- 해당 인스턴스의 소유권을 가지지 않고, 주소값만을 가지고 있는 포인터 개념이다.
- 자신이 참조하는 인스턴스의 retain count를 증가시키지 않는다. release도 발생하지 않는다.
- 자신이 참조는 하지만 weak 메모리를 해제시킬 수 있는 권한은 다른 클래스에 있다.
- 메모리가 해제될 경우 자동으로 레퍼런스가 nil로 초기화를 해준다
- weak 속성을 사용하는 객체는 항상 optional 타입 이어야 한다(해당 객체가 nil일 수 있기 때문)
unowned(미소유 참조)
- 해당 인스턴스의 소유권을 가지지 않는다.
- 자신이 참조하는 인스턴스의 retain count를 증가시키지 않는다.
- nil이 될 수 없다. (optional로 선언하면 안된다)
4. 순환 참조에 대해 설명하시오
순환 참조란 두 가지 이상의 객체가 서로에 대한 강한 참조 상태를 가지고 있을 때 발생하며,
순환 참조가 발생하게 되면 서로에 대한 참조가 해제되지 않기 때문에 메모리에서 유지되며 이로 인해
메모리 누수가 발생하게 된다.
5. 강한 순환 참조는 어떤 경우에 발생하는지 설명하시오
Functional Programming
1. 순수 함수란 무엇인지 설명하시오
순수 함수란 외부 상태에 의존적이지 않고, 어떠한 사이드 이펙트도 발생시키지 않는 함수.
순수 함수는 언제 얼마나 많이 호출해도 항상 같은 input에 대해 같은 output을 반환한다.
이러한 순수 함수의 이점으로는
- 테스트가 용이하고, 재사용성이 올라감
- 예측가능성이 높아짐
이 있다.
2. 함수형 프로그래밍이 무엇인지 설명하시오
스위프트는 함수형 프로그래밍 페러다임을 지향한다.
함수형 프로그래밍이란
- 프로그램의 상태의 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 프로그래밍
- 값이나 상태의 변화보다는 함수 자체의 응용을 중요하게 여긴다.
- 코드 이해와 실행 결과의 관점에서, 순수하게 함수에 전달된 인자 값만 결과에 영향을 주기 때문에 상태 값을
갖지 않고 순수하게 함수만으로 동작 -> 어떤 상황에서 프로그램 실행해도 일정하게 같은 결과 도출 가능
- 프로그램 동작 과정에서 값이 변하지 않으면 함수 호출이 각각 상호 간섭 없이 실행되므로 병렬처리를 할 때
부작용이 거의 없다는 장점 -> 필요할 만큼 함수를 나누어 처리할 수 있도록 하기 때문에 대규모 병렬 처리에 큰 강점
또 다른 함수형 프로그램의 특징으로는 함수를 일급 객체로 다룬다는 점.
2-1. 일급 객체란?
- 전달인자로 전달할 수 있다
- 동적 프로퍼티 할당이 가능하다
- 변수나 데이터 구조 안에 담을 수 있다
- 변환 값으로 사용할 수 있다
- 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별가능하다.
결국 함수가 일급 객체가 된다는 의미는
다양한 종류의 함수를 호출, 전달, 반환하는 등의 동작만으로도 프로그램을 구현할 수 있다는 것.
3. 고차 함수가 무엇인지 설명하시오
하나 이상의 함수를 인자로 받거나, 함수를 반환하는 함수를 의미한다.
대표적으로 map, filter, reduce가 있다.
4. Swift Standard Library의 map, filter, reduce, compactMap, flatMap에 대해 설명하시오.
*Swift 페러다임 뭐지?
Architecture
1. MVVM, MVI, MVC, Ribs, VIP 등 자신이 알고 있는 아키텍쳐를 설명하시오
2. 의존성 주입에 대하여 설명하시오.
의존성을 가지는 코드가 많아진다면, 재활용성이 떨어지고 매번 의존성을 가지는 객체들을 함께 수정해 주어야 한다는 문제가 발생한다. 이러한 의존성을 해결하기 위해 나온 개념이 바로 Dependency Injection, 의존성 주입이다.
외부에서 객체를 생성해서 넣는 것을 의미한다.
의존성 주입을 하는 이유는 무엇일까?
Unit Test가 용이해진다.
코드의 재활용성을 높여준다.
객체 간의 의존성(종속성)을 줄이거나 없엘 수 있다.
객체 간의 결합도이 낮추면서 유연한 코드를 작성할 수 있다.
SwiftUI
1. @State에 대해서 설명하시오
Combine
1. PassthroughSubject에 대해서 설명하시오
2. @Published에 대해서 설명하시오
3. AnyCancellable에 대해서 설명하시오
4. sink에 대해서 설명하시오
5. throttle과 debounce의 차이점을 설명하시오
6. Data를 Binding 하는 방법에 대해서 설명하시오
-------------------후순위 지식------------------
Rx
1. Reactive Programming이 무엇인지 설명하시오
2. RxSwift를 왜 사용하는지 설명하시오
3. RxSwift의 단점을 설명하시오
4. RxSwift에서 Hot Observable과 Cold Observable의 차이를 설명하시오
5. Subject의 종류와 차이점에 대해 설명하시오
6. Subject와 Driver의 차이를 설명하시오
7. Single, Completable, Maybe의 차이점에 대해 설명하고, 언제 적용하면 좋을지 설명하시오
MRC
1. ARC 대신 Manual Reference Count 방식으로 구현할 때 꼭 사용해야 하는 메서드들을 쓰고 역할을 설명하시오.
2. retain과 assign의 차이점을 설명하시오
3. 특정 객체를 autorelease 하기 위해 필요한 사항과 과정을 설명하시오
4. Autorelease Pool을 사용해야 하는 상황을 두가지 이상 예로 들어 설명하시오.
Advanced
1. method swizzling이 무엇이고, 어떨 때 사용하는지 설명하시오.
2. NSCoder 클래스는 어떤 상황에서 어떻게 써야 하는지 설명하시오.
3. Responder Chain 구조에 대해 설명하고, First Responder 역할에 대해 설명하시오.
4. NSObject부터 UIButton 까지 상속 과정의 계층과 역할을 설명하시오.
5. shallow copy와 deep copy의 차이점을 설명하시오.
6. Push Notification 방식에 대해 설명하시오.
7. Foundation 과 Core Foundation 프레임워크의 차이점을 설명하시오.
8. NSURLConnection 에서 사용하는 Delegate 메서드들에 대해 설명하시오.
9. Synchronous 방식과 Asynchronous 방식으로 URL Connection을 처리할 경우의 장단점을 비교하시오.
10. Plist 파일 구조와 Plist 파일에 저장된 데이터를 다루기 적합한 클래스를 설명하시오.
11. Core Data와 Sqlite 같은 데이터 베이스의 차이점을 설명하시오.
12. JSON 데이터를 처리하는 방식과 파서, 객체 변환 방식에 대해 설명하시오.
13. 웹 서버와 HTTP 연결을 사용해서 데이터를 주거나 받으려면 사용해야 하는 클래스와 동작을 설명하시오.
14. Protocol에서는 왜 var만 되는지 설명하시요.
15. DispatchQueue.main.sync를 사용하는 상황을 설명하시오.
16. Run Loops에 대해 설명하시오.
'CS' 카테고리의 다른 글
[CS] iOS CS Lv.0단계 질문 및 답안 정리 (2) | 2024.08.07 |
---|---|
[CS] 인텔리픽 모의면접 질문 정리 (0) | 2023.03.31 |
[CS] 자료구조 면접 정리 (2) | 2023.03.23 |
[CS] 운영체제 면접 정리 (1) | 2023.03.21 |
[CS] CS 내용 정리 (2) | 2023.03.10 |
1. Bounds와 Frame의 차이점을 설명하시오
Bounds와 Frame은 모두 CGRect 타입이며 원점을 나타내는 데이터(origin)와 size를 나타내는 데이터를 갖고 있다.
Bounds는 자신만의 좌표시스템에서의 View의 위치와 크기 값이고 origin은 디폴트로 (0,0)으로 설정되어 있으며 주로 View 내부에 그림을 그릴 때 drawRect를 사용한다.
Frame은 superView(한단계 상위 뷰)의 좌표시스템 안에서 view의 위치와 크기 값이고 주로 View의 위치나 크기를 설정하는 경우 사용한다.
2. 실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오.
시뮬레이터는 Mac에서 실행되는 앱이기 때문에 CPU, 메모리 및 네트워크 연결을 비롯한 컴퓨터 리소스에 엑세스할 수 있지만 실제 디바이스의 메모리 및 네트워크 속도와 다르기 대문에 실제 디바이스가 없다면 정확한 성능 테스트가 불가능
실제 맥에서는 부드럽게 실행되던 앱이 실제 디바이스로 테스트했을 때 부드럽지 않을 수 있다.
페이스 아이디를 이용할 때 직접 얼굴 인식이 안됨. 그러나 인식됨, 안됨 처리를 해볼 수는 있음
하드웨어적으로는 가속도, 가압계, 주변광, GPS 등 여러 센서 기능을 이용할 수 없음.
카메라, 마이크, 전화 기능도 사용할 수 없음.
마우스로 시뮬레이터를 터치하기 때문에 두 손가락으로 하는 줌 아웃 테스트 불가능
API측면에서도 apple의 푸시 알림 받기와 보내기 지원하지 않음
3. Core data란?
앱의 콘텐츠나 데이터 자체를 저장/보관 하는 특별한 개체를 뜻함.
4. 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체는 무엇인가?
UIVIew
화면 위의 콘텐츠를 관리하기 위한 사각형 영역 객체를 UIVIew라고 정의한다.
즉 사용자에게 보일 UILabel, UIButton과 같은 화면 구성요소들을 모두 UIView라고 하지만 이러한 객체들을
관리하기 위한 객체가 UIViewController이다.
5. App Thinning에 대해서 설명하시오
애플리케이션이 디바이스에 설치될 때, 앱 스토어와 운영체제가 디바이스의 특성에 맞게 설치되도록 하는 설치 최적화 기술을 의미
최소한의 디스크 사용과 빠른 다운로드를 제공할 수 있음.
구성으로는 슬라이싱, 비트코드, 주문형 리소스가 있음.
5-1. 슬라이싱이란?
다양한 기기와 운영체제 버젼에 대해 여러 가지 app bundle의 변형을 생성하고 전달하는 과정이다.
5-2. 비트코드란?
비트코드는 컴파일된 프로그램의 중간표현이다.
비트코드가 포함된 앱스토어 커넥트에 업로드한 앱은 앱스토어에서 컴파일 및 연결된다.
5-3. 주문형 리소스란?(on-demand resource)
주문형 리소스는 이미지나 사운드 같은 리소스를 키워드로 태그 할 수 있고, 태그별로 그룹을 요청할 수 있습니다.
게임으로 예를 들면, 현재 레벨에 필요한 데이터들을 다운로드하고, 그 위의 레벨의 데이터는 필요하지 않으므로,
사용자의 레벨이 필요할 때 데이터를 다운로드 하는 것.
6. 앱이 시작할 때 main.c에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?
7. @Main에 대해서 설명하시오
@Main은 프로그램 실행 시작 시 진입점으로 타입을 지정하기 위한 Swift언어의 기능.
사용자는 탐 레벨의 코드를 작성하는 대신 @main단일 유형의 속성을 사용할 수 있고, 라이브러리와 프레임워크는
프로토콜이나 클래스 상속을 통해 맞춤형 진입점 동작을 제공할 수 있다.
8. 앱이 foreground에 있을 때와 background에 있을 때 어떤 제약사항이 있나?
foreground에 있을 때에는 메모리 및 기타 시스템 리소스에 대해서 background보다 높은 우선순위를 가지며
시스템은 이러한 리소스를 사용할 수 있도록 필요에 따라 background 앱을 종료합니다.
background에 있을 때는 가능한 적은 메모리 공간을 사용해야 하며 자원 할당에 있어 foreground 상태보다
우선순위가 낮습니다.
9. 상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드들을 설명하시오.
10. 앱이 In-Active 상태가 되는 시나리오를 설명하시오.
전화나 메세지 같은 인터럽트가 발생하거나, 미리 알림 같은 특정 알림창이 화면을 덮어서 앱이 실질적으로 event를
받지 못하는 상태에 In-Active상태가 된다. 앱을 처음켜거나, foreground에서 background, background에서
foreground 상태가 될 때도 In-Active 상태가 된다.
Not Running -> Inactive -> Active -> Background -> Suspended
10-1. Not running상태란?
앱이 실행되지 않았거나 완전히 종료되었을 때 상태입니다.
10-2. In-Active상태란?
앱이 실행되면서 foreground에 진입하지만 어떠한 이벤트도 받지 않는 상태입니다.
10-3. Active 상태란?
앱이 실행 중이며 포어그라운드에 있고 이벤트를 받고 있는 상태입니다.
10-4. Background 상태란?
앱이 백그라운드에 있으며 다른 앱으로 전환되었거나 홈버튼을 눌러 밖으로 나갔을 때의 상태입니다.
10-5. Suspended란?
백그라운드에서 특별한 작업이 없을 경우 전환되는 상태입니다.
10-6. foreground란?
App이 실행되어 클라이언트에게 보여지고 있는 상태.
특징으로는 메모리 및 기타 시스템 리소스에 높은 우선순위를 가지며 시스템은 이러한 리소스를
사용할 수 있도록 필요에 따라 background 앱을 종료합니다.
10-7. background란?
앱이 백그라운드에 있는 상태이지만 여전히 실행되고 있는 코드가 있는 상태
특징으로는 가능한 적은 메모리 공간을 사용해야함.
사용자 이벤트를 받기 어렵고 공유 시스템 리소스를 해제하고 이미지 객체 참조 등 메모리 제한
11. scene delegate에 대해 설명하시오.
iOS 13 이후 UI 생명주기에 관한 이벤트를 처리하기 위해 사용하는 객체입니다.
앱을 실행하면 UIKit이 일반적으로 UIScene의 서브클래스인 UIWindowScene 객체를 생성합니다.
즉, SceneDelegate란 UI 상태에 따른 이벤트처리를 하기 위한 객체입니다.
12. UIApplication 객체의 컨트롤러 역할은 어디에 구현해야 하는가?
13. NSOperationQueue와 GCD Queue의 차이점을 설명하시오
- NSOperationQueue
14. GCD API 동작 방식과 필요성에 대해 설명하시오
15. Global DispatchQueue의 Qos에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.
16. iOS 앱을 만들고, UI를 구성하는 데 필수적인 프레임워크 이름은 무엇인가?
cocoa touch framework가 UIKit을 포함하는데 이 UIKit이 사용자 인터페이스를 구성하는데 필수적이다.
16-1. iOS 기본구조
1. cocoa touch
앱의 다양한 기능 구현에 필요한 다양한 핵심프레임워크를 포함하는 최상위 레벨의 프레임워크
2. media
그래픽 관련 서비스나 오디오 혹은 비디오 같은 멀티미디어 관련 서비스 제공
3. core services
문자열 처리, 데이터 집합, 네트워크 등의 서비스를 제공
4. core os
하드웨어와 네트워크에 관련된 low-level의 서비스를 제공
17. Foundation Kit은 무엇이고 포함되어 있는 클래스들은 어떤 것이 있는지 설명하시오
Foundation Kit은 Cocoa Touch Framework에 포함되어 있는 프레임워크 중 하나이다.
String, Int 등의 원시 데이터 타입과 컬렉션 타입 및 운영체제 서비스를 사용해 앱의 기본적인 기능을
관리하는 프레임워크이다.
또한 iterator, jsonEncoder, jsonDecoder와 같은 데이터 관련 클래스가 정의되어 있다.
17-1. iterator란?
배열이나 그와 유사한 자료 구조의 내부 요소를 순회하는 객체이다
17-2. jsonEncoder란?
데이터 유형의 인스턴스에서 JSON 개체로 변환하는 객체
17-3. jsonDecoder란?
JSON 개체에서 데이터 유형의 인스턴스로 변환하는 객체
18. Delegate란 무엇인지 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오.
delegate란 객체 지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라 처리해야 할 일
중 일부를 다른 객체에게 넘기는 것을 의미한다.
delegate는 객체 간의 작업이어서 참조 값을 사용(왜..참조값이지?)하기 때문에 retain 현상이 일어난다
해결 방법으로는 weak, unowned가 있다.
18-1. retain이란?
메모리가 해제되지 않아서 낭비되는 현상을 말함 즉 Memory Leak
18-2. weak과 unowned의 차이
weak 참조는 인스턴스에 대해 약한 참조 상태를 유지한다.
즉, 해당 인스턴스에 대한 참조가 ARC에 카운팅 되지 않는다는 것이다.
만약 다른 객체가 특정 인스턴스에 대해 강한 참조를 가지지 않는다면, 해당 인스턴스는 할당 해제가 된다.
unowned 참조는 참조 대상에 대해 강한 참조를 유지하지 않는다는 점은 weak참조와 비슷하다.
unowned 참조는 weak 참조와 동일한 목적으로 사용된다.
즉, 강한 참조 사이클을 회피하기 위해 사용된다.
차이점은 unowned참조의 경우 언제나 값이 존재할 것이라고 가정한다는 점.
weak 참조의 경우에는 특정 인스턴스의 참조가 할당 해제된 경우에는 참조를 nil로 설정하게 된다.
weak 참조의 경우 항상 optional로 선언되기 때문에, 해당 값에 접근하기 전에 언래핑 과정이 필요하다.
weak 참조의 경우 nil로 설정될 수 있기 때문에, 항상 optional로 선언된다.
이것이 weak 참조와 unowned 참조의 두번째 차이점이다.
weak 참조의 값은 접근하기 위해 언래핑해야 되지만, unowned 참조의 경우에는 언래핑 없이 바로
접근이 가능하다.
하지만 unowned 참조가 적용된 인스턴스에서 해당 unowned 참조가 할당 해제된 경우에도 해당 인스턴스는
nil로 설정되지 않기 때문에, 만약 해당 객체에 접근하려 할 경우 fatal error가 발생한다.
19. NotificationCenter 동작 방식과 활용 방안에 대해서 설명하시오.
NotificationCenter는 등록된 모든 Observer에게 정보를 전달하는 메커니즘입니다. observer는 notification들을 감지하고 있고 sender는 필요할 때 해당 observer에게 notification들을 보내주는 역할을 합니다. 옵저버를 등록하고 등록된 옵저버를 감시하면서 변경사항이 발생하면 등록된 옵저버에게 알려줍니다.
20. UIKit 클래스들을 다룰 때 꼭 처리해야 하는 애플리케이션 쓰레드 이름은 무엇인가?
Main 쓰레드
21. App Bundle의 구조와 역할에 대해 설명하시오.
애플리케이션 번들은 애플리케이션의 성공적인 작동에 필요한 모든 것을 저장한다.
앱 번들은 앱의 코드를 포함하고 있는 실행 가능한 파일인 my app
앱을 표시하는 application icons,bundle id, 버전 번호 등 앱에 대한 구성 정보를 포함하고 있는 파일인 info.plist
앱의 시작 인터페이스를 보여주는 이미지인 launch images
앱 런치 시간에 앱을 로드하기 위한 기본 인터페이스 객체(App delegate 객체의 인스턴스)를 포함한 MainWindow.nib
기본 설정을 구성하고, 표시할 프로퍼티 리스트와 기타 리소스 파일이 포함되어 있는 Settings.bundle
이미지나 사운드 및 애플리케이션에 필요한 기타 커스텀 데이터 파일로 구성된 커스텀 리소스 파일로 구성된다.
22. 모든 ViewController 객체의 상위 클래스는 무엇이고, 그 역할은 무엇인가?
모든 View Controller는 UIViewController를 상속받는다.
UIViewController는 모든 ViewController에 공통으로 작동하는 행동들이 정의 되어있고,
이를 상속받아 메서드를 추가하거나 override 할 수 있다.
23. 자신만의 Custom View를 만드려면 어떻게 해야하는가?
[Xib을 이용해 별도의 Storyboard처럼 관리하는 법]
Xib을 생성하고 또한 별도의 UIView를 상속받은 Class를 생성한다. 그리고 Xib에서 owner로 해당 클래스를
임명하고 커스텀 클래스 내에서 초기화 시, Xib 파일을 불러와 view로 임명하는 코드를 추가하고 원하는
작업들을 Storyboard와 동일하게 수행하면 된다.
[UIView을 상속받아 코드로만 구현]
UIView를 상속받는 클래스를 생성해 코드로만 원하는 작업들을 설정한다.
24. View 객체에 대해 설명하시오
화면에 content 표시, 그리기 및 애니메이션, 오토레이아웃, 제스처 인식 등 화면에 관한 것들을 담당하는 객체
View는 사용자 인터페이스의 기본 구성 요소이며 모든 조작은 main thread에서 해야한다.
25. UIView에서 Layer 객체는 무엇이고, 어떤 역할을 담당하는지 설명하시오.
UIView는 화면의 직사각형 모양을 관리하는 객체로, 앱이 사용자와 상호작용하는 주요 방법이다.
UIVIew는 객체에 나타나는 콘텐츠들을 관리하는 CALayer 타입의 Layer를 가지고 있다.
UIVIew는 이미지나 애니메이션들을 직접 제어하지 않고, View에게 작업을 위임합니다.
Layer Core Animation 클래스인 CALayer 타입입니다.
UIView에게 작업을 전달받는 View는 Core Animation 클래스인 CALayer Layer 객체에서 직접 작업을 수행한다.
주로 뷰 위의 콘텐츠, 애니메이션을 그리는 시각적인 행위의 작업을 담당한다.
자세하게는 그림자, 테두리, 3d 변형, 마스킹, 애니메이션 등의 작업을 처리한다.
유연한 커스터 마이징이 가능하다는 특징을 가지고 있다.
26. UIWindow 객체의 역할은 무엇인가?
윈도우는 UIView의 자식 클래스이며 뷰의 계층 구조에서 최상위의 뷰의 역할을 하며 뷰들을 담는 컨테이너 역할.
코드로 화면을 구현할 때에는 window를 직접 생성해야 하며 스트리보드를 통해 화면을 구현할 경우에는
window가 자동 생성
27. UINavigationController의 역할이 무엇인지 설명하시오
네비게이션 스택을 사용하여 뷰 컨트롤러를 순차적으로 보여주는 역할을 한다.
28. TableView의 동작 방식과 화면에 Cell을 출력하기 위해 최소한 구현해야 하는 DataSource 메소드를 설명하시오.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int // cell의 갯수
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // 셀을 정의
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat // 셀의 높의를 정의
29. 하나의 View Controller 코드에서 여러 TableView Controller 역할을 해야 할 경우 어떻게 구분해서 구현해야 하는지 설명하시오.
tableview 메서드에서 매개변수로 받은 tableView가 원하는 tableView가 맞는지 구분해서 구현하면 됩니다. tag를 등록하여 구분하는 방법도 있습니다.
30. setNeedsLayout과 setNeedsDisplay의 차이에 대해 설명하시오.
31. StackView의 장점과 단점
스택뷰는 View들을 일정한 간격으로 배치하기 위해 사용된다.
StackView를 배치한 후 그 내부의 View들을 추가해 사용하면 된다.
View 사이의 관계는 Constraint로 설계할 수 있지만 Stack View를 이용하면 보다 편리하게 배치 가능
31-1. Horizontal StackView
View들을 가로로 배치한다
31-2. Vertical Stack View
View들을 세로로 배치한다.
32. NSCache와 딕셔너리로 캐시를 구성했을 때의 차이를 설명하시오
딕셔너리는 메모리가 부족하면 값을 삭제하는 코드를 작성해야 하지만 NSCache는 메모리를 자동으로 관리.
NSCache 는 Thread-safe하다. 데이터를 쓸 때마다 lock을 해줄 필요가 없음
33. URLSession에 대해서 설명하시오
URLSession은 앱과 서버 간 데이터를 주고 받는 API를 제공하는 클래스이다.
HTTP를 포함한 몇 가지 프로토콜을 지원하고 인증, 쿠키 관리, 캐시 관리 등도 지원한다.
URL Loading System에서 알아봤듯이 URLSession은 자체적으로 비동기적으로 동작하기 때문에 따로
비동기 처리를 할 필요가 없습니다.
34. prepareForReuse에 대해서 설명하시오
prepareForReuse()는 말그대로 테이블뷰에서 셀이 재사용되기 전에 불려서 준비시키는 함수다.
35. 다크모드 지원 방법 모두 설명
- 시스템 컬러를 사용할 경우 Semantic color를 이용해 다른 컬러가 표현된다.
- Assets를 이용해서 지원한다.
- 코드로 지원한다.
36. 앱 생명주기
active inactive 이거임
37. Viewcontroller 생명주기
init
loadView
viewDidLoad
ViewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear
viewDidUnload
38. TableView와 CollectionView의 차이점을 설명하시오
테이블 뷰는 간단하고 보편적인 리스트를 만들어 보여줄 수 있는 반면, 컬렉션 뷰는 특정한 모습으로
커스텀한 목록을 만들어 보여줄 수 있다.
AutoLayout
1. 오토 레이아웃을 코드로 작성하는 방법은 무엇인가 (3가지)
2. hugging, resistance에 대해서 설명하시오.
hugging은 우선순위가 클수록 자신의 크기를 유지하려 하고, 우선순위가 작을수록 크기가 늘어는 속성을 말함.
resistance는 우선순위가 클수록 자신의 크기를 유지하려하고, 우선순위가 작을수록 크기가 작아지려는 속성을 말함.
예로 두 개의 뷰가 서로 붙어있고, 그 크기가 지정되지 않은 상태에서 우선순위가 없다면 hugging이 클수록 작게,
resistance가 클수록 커지게 너비를 가지게 된다.
3. Intrinsic Size에 대해서 설명하시오.
Intrinsic Size는 콘텐츠의 본질적인 크기이다.
UILabel에서 컨텐츠의 길이가 변하면 자동으로 계산해주는 것에 사용되는 것과 같습니다.
4. 스토리보드를 이용했을 때의 장단점을 설명하시오.
장점
코드를 모르더라도 UI를 쉽게 구현할 수 있다.
직관적으로 앱의 흐름을 파악할 수 있다.
뷰의 초기화가 필요없어 만드는데 오랜 시간이 걸리지 않는다.
단점
뷰의 컴포넌트가 많아질수록 스토리보드 파일의 로딩시간이 오래 걸린다.
컴포넌트가 많아질수록 세밀한 조정이 어렵다.
스토리보드 파일의 포맷이 XML이기 때문에 협업 시에 Merge Conflict가 발생하고, 해결하기 어렵다.
뷰의 재사용성이 떨어진다.
스토리보드의 identifier를 항상 지정해줘야하므로, 번거로울 수 있다.
5. SafeArea에 대해서 설명하시오
컨텐츠를 가리지 않는 것이 보장된 역역 status bar, navigation bar, tool bar 등에도 덮이지 않는 뷰를 그리기 위함
6. Left Constraint와 Leading Constraint의 차이점을 설명하시오
Left Constraint와 Right Constraint는 절대적이며 항상 화면 또는 컨트롤의 왼쪽/오른쪽을 참조한다.
Leading Constraint와 Trailing Constraint는 device local의 영향을 받는다.(장치별 국가설정)
Swift
1. struct와 class와 enum의 차이를 설명하시오.
Class
swift에서는 객체라는 용어 대신에 '인스턴스'라는 용어 사용
단일 상속만
(인스턴스/타입) 메서드 or 프로퍼티
참조타입
데이터를 전달할 때 값의 메모리 위치를 전달
주소를 복사하여 이미 존재하는 인스턴스의 위치를 가리킵니다. 참조하는 값이 존재하는 위치를 stack 메모리 영역에, 참조되는 값은 heap 메모리 영역에 저장됩니다.
ios 프레임워크의 대부분이 클래스로 구성되어 있다.
Struct
상속이 불가
(인스턴스/타입) 메서드 or 프로퍼티
값 타입
데이터를 전달할 때 값을 복사하여 전달
값이 복사되어 새로운 인스턴스가 생성되고 이 인스턴스가 stack 메모리 영역에 저장됩니다.
Swift의 대부분의 큰 뼈대는 모두 구조체로 구성되어있다.
언제 사용? 참조가 아닌 복사를 원할 때 or 자신을 상속할 필요가 없거나 상속받을 필요가 없을 때
Enum ( 이늄 ) Enumeration
다른 언어의 열거형과는 많이 다른 존재
유사한 종류의 여러 값을 유의미한 이름으로 한 곳에 모아 정의한 것
열거형 자체가 하나의 데이터 타입
상속이 불가 (인스턴스/타입) 메서드 or 연산 프로퍼티
지정 기존 프로퍼티는 값을 저장하는 역할을 하지만 연산 프로퍼티는 특정한 연산을 통해 값을 리턴해주는 것을 의미합니다.
값 타입
7-1. struct 사용 권장 이유
애플은 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하는 것을 권장
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 value 타입이며 참조하는 것보다 복사하는 것이 합당할때
- 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
2. class의 성능을 향상 시킬 수 있는 방법들을 나열해보시오
방법 1 .heap 보다는 stack 메모리를 할당하려고 노력한다.
class보단 struct나 enum을 사용한다.
class는 heap 할당, struct와 enum은 stack 할당.
방법 2. reference counting을 적게 만든다.
클래스에서 스트링 타입의 변수 사용을 줄인다.
string은 struct 타입이지만 문자열의 콘텐츠를 heap에 저장하기 때문
방법 3. dynamic dispatch(런타임에 정해지고 다형성 때문에 사용)보다 static dispatch(컴파일 타임에 정해짐)
을 지향한다.
클래스를 선언할 때 상속되지 않는 클래스에 final을 붙이면 성능이 향상된다.
2-1. heap과 stack 개념
프로그램이 실행되기 위해서는 프로그램이 메모리에 로드 되어야 한다.
프로그램이 운영체제로부터 할당받는 메모리 공간은 4가지가 있음
- 코드 영역
메모리의 코드 영역은 실행할 프로그램의 코드가 저장되는 영역
- 데이터 영역
데이터 영역은 프로그램의 전역 변수와 정적 변수가 저장되는 영역
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
- 스택 영역
스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
스택 영역은 푸시 동작으로 데이터를 저장하고, 팝 동작으로 데이터를 인출한다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
- 힙 영역
힙 영역은 사용자가 직접 관리할 수 있는 "그리고 해야만 하는" 메모리 영역이다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
3. Copy on Write는 어떤 방식으로 동작하는지 설명하시오
Swift에서 큰 값 타입의 데이터를 변수에 대입하거나 매개변수로 넘기게 되면 매우 비싼 복사 연산을 하게 된다.
이 이슈를 최소화하기 위해서 Swift 표준 라이브러리는 배열과 같은 몇몇 값 타입에 대해(두 개 이상의 참조가 있고,
변형에 의해서만 복사가 일어나는) 하나의 참조만 있다면 복사가 아니라 해당 참조 내에서 값 변경이 일어나는
매커니즘을 설계했다.
그래서 배열을 변수에 대입하거나 함수의 매개변수로 넘겨주는 것은 반드시 배열의 모든 데이터를 복사한다는
것을 의미하지 않는다.
한마디로 Copy-on-Write은 데이터 복사 시 실제로 값을 복사하지 않고, 동일한 값을 참조하다가 데이터
변경이 발생될 시에 복사해 값을 변경하는 기법이다.
4. Convenience init에 대해서 설명하시오
swift에서 super class에서 상속받은 프로퍼티들을 포함하여, 모든 저장 프로퍼티가 초기 값을 가질 수
있도록 Class 유형에 대해 두 가지 종류의 초기화를 정의 한다.
두 가지는 init, Convenience init이다.
init 에서는 모든 저장 프로퍼티가 반드시 초기화되어야 함.
Convenience init은 일부 프로퍼티 값이 없더라도 에러가 뜨지 않도록 임의의 값을 지정해주는 보조 이니셜라이저
*init의 보조이기 때문에 미리 선언한 init을 활용해서 사용해야 한다.
5. AnyObject에 대해 설명하시오.
AnyObject는 모든 클래스 타입의 인스턴스를 나타낼 수 있는 프로토콜이다.
AnyObject로 선언 시, "클래스 타입"만 저장할 수 있다.
따라서 클래스 타입이 아닌 구조체, 열거형, Reference Type인 클로저는 AnyObject에 해당하지 않는다
-> 에러 발생
5-1. Any에 대해 설명하시오.
Any는 함수타입을 포함해 모든 타입의 인스턴스를 나타낼 수 있다.
value 타입(struct, enum), Reference 타입(class, closure) 이건 상관 없이 저장이 가능하다.
한마디로 Any는 모든 타입을 포함할 수 있는 범용 타입이다.
장점
Any, AnyObject는 모든 타입, 모든 클래스 타입을 저장할 수 있다는 장점을 가지고 있다.
단점
타입캐스팅. 이 두가지는 매번 타입 체크 및 형변환을 해야하기 때문.
방법으로는 as, as?, as!가 있음
6. optional이란 무엇인지 설명하시오
swift는 안전한 코딩을 할 수 있게 해주는 언어이다. 안정성의 기본 바탕에 있는 중요한 요소 중 하나.
? 키워드를 사용하는 Optional은 변수의 값이 nil일 수 있다는 것을 표현한다.
8. Subscripts에 대해 설명하시오.
class, struct,enum 에서 collection, list, sequence 등 집합의 특정 멤버 요소에 쉽게 접근하기 위한 방법
이것을 이용하면 추가적인 메소드 없이 특정 값을 할당하거나 가져올 수 있음
getter, setter 메서드를 구성하지 않고도 인덱스를 통해 어떤 값을 빠르게 설정하거나 가져올 수 있음
9. String은 왜 subscript로 접근이 안되는지 설명하시오.
다른 언어와 달리 Swift에서는 String에서 Int 형식으로 인덱스 참조가 불가능하다.
String은 Character의 집합인데, Swift에서 Character는 1개 이상의 unicode scalar로 이루어져 있어,
크기가 가변적이기 때문이다.
10. instance 메서드와 class 메서드의 차이점을 설명하시오
Instance 메서드는 Class, struct, enum 형태의 인스턴스에 속한 메서드를 의미한다.
클래스를 통해 호출할 수 없고, 클래스의 인스턴스를 만들어 실체화 하여 생성된 인스턴스를 통해서 호출할
수 있는 메서드이다.
Class 메서드는 인스턴스를 만들어 실체화 하지 않아도 클래스를 통해 직접적으로 호출할 수 있다. (인스턴스 없이 호출할 수 있는 메서드를 타입 메서드라고 함)
func 키워드 앞에 class 키워드가 붙어 class func methodName(){} 형태로 선언한다.
Instance 메서드와 달리 struct, enum에서 사용할 수 없다.
11. class 메서드와 static 메서드의 차이점을 설명하시오
타입 메서드를 선언하기 위해서는 func앞에 static이나 class를 붙여주면 됨.
이 둘의 차이는 메서드 오버라이딩의 차이.
static은 Subclass에서 해당 타입 메서드를 오버라이딩 하는 것을 금지 함.
이와 달리 class는 오버라이딩을 허용함.
12. Delegate 패턴을 활용하는 경우의 예를 들어 설명하시오.
프로토콜을 이용하여 권한을 위임하고 일을 처리하는 방식의 디자인 패턴이다.
delegate 패턴은 클래스나 구조체의 인스턴스에 특정 행위에 대한 책임을 다른 타입의 인스턴스에게 넘기는 방식.
예로 들어 View Controller를 보면, TableView의 특정 셀에 있는 여러 개의 버튼 중 특정 버튼을 눌렀을 경우에
해야할 일을 View Controller로 넘겨주기 위해서 Delegate 패턴을 사용한다.
13. Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오
싱글톤 패턴은 특정 용도로 객체를 하나 생성해서 공용으로 사용하고 싶을 때 사용하는 방법입니다.
즉, 인스턴스가 하나만 존재하는 것을 보증하고 싶을 경우에 사용하게 됨.
주로, 환경설정, 네트워크 객체, 로그인 정보 등을 특정 용도로 생성해둔 객체에 넣어두고 필요할때마다 여러
객체에서 접근 가능하도록 하여 데이터를 사용한다.
데이터를 공유할 수 있다는 대표적인 장점이 있다.
단점으로는 한번 할당된 메모리는 끝날때까지 할당되어 있으므로 메모리 낭비가 존재한다.
14. KVO 동작 방식에 대해 설명하시오
KVO는 A객체에서 B객체의 키의 값이 변화됨을 감지할 수 있는 패턴입니다.
메서드나 다른 액션에서 나타나는 것이 아니라 프로퍼티의 상태에서 반응하는 형태.
모델 객체의 어떤 값이 변경되었을 때 이를 UI에 반영하기 위해서 컨트롤러는 모델 객체에 Observing을
도입해 델리게이트에 특정 메시지를 보내 처리할 수 있도록 하는 것.
즉, 변수에 코드를 붙여 변수가 변경될 때마다 코드가 실행되도록 하는 방법을 의미한다.
KVO는 순수 스위프트 코드로는 좋지 않은데, 그 이유는 Objective-c 런타입에 의존하고 있기 때문이다.
그래서 NSObject를 상속받기 위해 @objc를 반드시 붙여줘야 된다.
특히 KVO는 속성 각각에 @objc dynamic을 붙여줘야 한다.
15. Delegates와 Notification 방식의 차이점에 대해 설명하시오.
delegate는 지정된 객체가 해야하는 메소드들의 원형을 프로토콜 형태로 정해놓은 디자인 패턴이다.
이때 delegate 역할을 하려는 객체는 이 프로토콜을 따르며 원형만 있던 메소드들을 구현합니다.
delegate는 많은 줄의 코드가 필요하고, 많은 객체들에게 이벤트를 알려주는 것이 비효율적이다.
notification은 서로 데이터를 보내주고 통신할 수 있도록 하기 위해 Notification Center라는 싱글턴
객체를 통해 이벤트들의 발생 여부를 옵저버를 등록한 객체들에게 Notification을 post하는 방식으로 사용한다.
이때 Notification name이라는 key 값을 통해 주고 받을 수 있다.
16. 멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명하시오.
고려해야 할 점은 어떤 작업을 글로벌 큐에 넣어야 하는지 정확히 알아둬야 하고, 글로벌 큐에 작업을 배치할 때,
작업에 따라 QoS를 적절하게 사용해야 한다.
또한 동기로 할지, 비동기로 할지를 명확하게 정의하고, 상황에 따라 작업 간 인과관계를 설정하거나, 특정 시간
이후에 처리하도록 설정해야 한다.
직접적으로 스레드를 관리하지 않고 Queue를 활용해 작업을 분산 처리하고 GCD, operation을 이용해 iOS에서
알아서 스레드 숫자를 관리한다.
그리고 다른 스레드에서 작업들이 "비동기적으로 동작" 하도록 만들어야 한다.
KVO vs KVC
Key의 개념
문자열(key)를 의미하고 이 key값을 통해 인스턴스의 프로퍼티 값에 간접적으로 접근하게 해주는 objective-c에서 나온 개념
KVC
인스턴스의 프로퍼티에 접근할 때 key값인 문자열로 접근하는 방법
kvc는 objective-c 런타임에 의존하므로 프로퍼티 앞에 @objc 어노테이션을 붙여서 사용
단 objective-c의 것이기 때문에 NSobject가 가지고 있으므로 NSObject의 서브클래스여야 가능
KVO
kvc와 같이 key값을 가지고 프로퍼티에 접근하는데, 이때 observing 할 수 있는 방법
프로퍼티 키워드에 @objc dynamic을 붙여서 사용
GCD 란?
GCD 는 iOS 에서 멀티코어 프로세서에 코드를 동시에 실행시키게 해주는 프레임워크이다.
GCD는 iOS 에서 멀티 스레드 환경에서 다수의 스레드에 작업을 적절히 분배시키는 방법
GCD 에서 사용하는 Queue 가 Dispatch Queue
프로그래머가 Dispatch Queue 에 작업을 보내면 그에 따라 스레드를 적절히 생성해서 실행하고 작업이 종료되면 스레드를 제거한다.
사용 예
DispatchQueue.global().async { //task } // global dispatch queue 에 작업을 비동기 적으로 보낸다! D
ispatchQueue: iOS에서 동시성 프로그래밍을 돕기 위해 제공하는 queue
global: DispatchQueue의 종류
async: 비동기
16-1. 글로벌 큐란?
DispatchQueue는 작업 항목의 실행을 관리하는 클래스입니다.
DispatchQueue는 장점은 일반 Thread 보다 쉽고 효율적으로 코드를 작성할 수 있습니다. 보통 서버에서 데이터를 받고 이미지 동영상을 외부에서 다운로드 및 처리할 때 CPU 사용량이 많아 처리를 Main Thread가 아닌 별도의 Thread에서 처리한 뒤 Main Thread로 결과만을 전달하여 화면에 표시하도록 하여 CPU를 관리할 수 있습니다.
DispatchQueue의 종류 : Seral / Concurrent
Seral
이전 작업이 끝나면 다음 작업을 순차적으로 실행하는 직렬 형태의 Queue. 하나의 자겁을 실행하고 그 실행이 끝날 때까지 대기열에 있는 다른 작업을 잠시 미루고 있다가 직전의 작업이 끝나면 실행합니다.
Concurrent
이전 작업이 끝날 때 까지 기다리지 않고 병렬 형태로 동시에 실행되는 Queue. 즉 대기열에 있는 작업을 동시에 별도의 Thread를 사용하여 실행합니다.
Main(serial)
Main Tread에서 처리되는 형태이며 Xcode의 UiKit 및 SwiftUI의 모든 요소들은 Main Queue에서 수행되어야 합니다. Global(concurrent)
시스템 전체에 공유되는 concurrent Queue. 병렬적으로 동시에 실행이 되긴 하지만 QoS를 통해 우선순위를 결정해 줄 수 있습니다. 우선순위가 높은 작업은 낮은 순위의 작업보다 더 빨리 실행되며, 이를 잘 이용하면 빠르고 렉 없는 앱을 만들 수 있습니다.
QoS? [ Quality of Service ]
DispatchQueue에서 수행 할 작업을 분류하기 위해 사용됩니다. QoS를 지정해줘서 중요도를 표시하고, 시스템이 우선순위를 정하고 이에 따라 스케쥴링을 하게 됩니다.
DispatchQueue.global(qos: .background) { // some code here }
QoS 종류
DispatchQueue.global(qos: .userInteractive) {} //Main Queue
DispatchQueue.global(qos: .userInitiated) {} //유저가 시작한 작업, 유저가 응답을 기다림
DispatchQueue.global(qos: .default) {} //userInitiated와 utility의 중간
DispatchQueue.global(qos: .utility) {} //시간이 걸리며 즉각적인 응답이 필요하지 않은 경우
DispatchQueue.global(qos: .background) {} //눈에 보이지 않는 부분의 작업. 완료 시간 중요X
DispatchQueue.global(qos: .unspecified) {}
18. 프로토콜이란 무엇인지 설명하시오
특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진(자세한 계획을 일컫는다) 프로토콜은 class나 struct의 행동을 정의하는 역할을 합니다.프로토콜은 행동을 정의하기만 할 뿐 구현하지 않습니다. 어떠한 클래스나 구조체가 해당 프로토콜을 따른다는 것은 프로토콜에 정의된 행동들을 구현해야함을 의미합니다.
19. Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오.
POP는 Protocol Oriented Programming 약자입니다. OOP는 Object Oriented Programming 약자입니다. POP는 뜻 그대로 프로토콜 중심 프로그래밍이고 OOP는 객체 중심 프로그래밍입니다
POP는 프로토콜 확장을 통하여 수평 구조로 타입을 확장하고, OOP는 슈퍼클래스의 상속을 통하여 수직 구조로 타입을 확장하는 방식으로 다형성을 구현 합니다.
20. Hashable이 무엇이고, Equatable을 왜 상속해야 하는지 설명하시오
Hashable
- 정수 hash 값을 제공하는 타입
- hash → 해시 함수에 의해 얻어지는 값 → 해시값, 해시코드, 해시 체크섬
- 해시 함수: 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수
- hashValue - 어떠한 데이터를 Hash 함수에 넣게 되면 반환해주는 값
- HashTable에서 hash값을 찾기 위한 key가 필요하고 Unique해야 함.
→ Unique한지 비교하기 위해 Hashable은 Equatable을 채택하고 있음.
Equatable
- 값이 동일한 지 비교할 수 있는 타입
- 이 프로토콜을 준수하는 타입은 == 혹은 !=를 사용하여 비교할 수 있음.
- 기본 데이터 타입 Int, String, Double 등 Hashable 프로토콜을 준수하고 있어 값을 비교할 수 있음.
21. mutating 키워드에 대해 설명하시오
class는 참조 타입이고 struct와 enum은 값 타입이다.
값 타입의 속성은 기본적으로 인스턴스 메서드 내에서 수정할 수 없다.
만약 수정해야 하는 경우 mutating을 붙여주면 된다.
mutating을 선언한 메서드는 메서드 내에서 프로퍼티를 변경할 수 있고, 메서드가 종료될 때 변경한 모든
내용을 원래 strcut에 다시 기록한다. 또한 메서드는 self 프로퍼티에 새 인스턴스를 할당할 수도 있다.
mutating 키워드는 해당 메서드가 호출된다면 실제 복사를 해야한다고 알려주는 역할이다.
22. 탈출 클로저에 대해 설명하시오
함수의 인자로 전달된 클로저가 함수가 반환된 후 실행 되는 클로저를 의미한다.
말 그대로 전달인자로 받은 클로저가 함수 내부 scope안에서 실행되는 것이 아니라 이를 탈출해서
다른 어딘가로 가는 것을 말한다.
다음과 같은 경우를 탈출한다고 볼 수 있다.
- 전달받은 클로저가 클로저 함수 외부로 다시 반환
- 외부 글로벌 변수에 저장되는 경우
이 경우 @escaping을 붙여줘야 하고 그렇지 않으면 컴파일 에러가 발생한다.
이는 기존에 우리가 알고 있던 변수의 scope 개념을 무시한다.
왜냐하면 함수에서 선언된 지역 변수가 지역 변수의 영역을 뛰어넘어 함수 밖에서도 유효하기 때문이다.
이러한 탈출 클로저는 주로 비동기 작업을 하기 위해서 이다.
Alamofire.request(urlRequest).responseJSON { response in}
에서 reponse는 "responseJSON()"에 있는 지역 변수이다.
네트워크 통신은 보통 비동기로 작업하는데 탈출 클로저를 이용해 함수 반환 후에도 response 변수를 계속
잡고, 이후 함수 범위 밖에서도 이를 활용한 작업을 가능하게 해주는 것이다.
23. Extension에 대해 설명하시오
extension은 존재하는 클래스, 구조체, 열거형, 프로토콜 타입에 새롭게 기능적인 부분을 추가할 수 있고,
요구사항을 구현하는데 사용할 수 있는 문법
extension을 활용함으로써 이전의 내부 소스에 접근할 수 없는 원본 타입에 새로운 기능을 부여할 수 있음.
구조체, 클래스, 열거형 추가 구현부, 제약사항, 기능 등을 정의 가능
특정 타입의 기능 및 준수하는 프로토콜별 구현별을 분리해서 보다 코드 가독성을 높일 수 있음
24. Extension 내부에서 함수를 override 할 수 있는지 설명하시오
새로운 기능을 정의하는 것은 가능하지만 override를 할 수는 없다.
override는 부모클래스의 메서드를 자식 클래스가 재정의하는 것을 의미하는데, extension은 수평적인 확장이기 때문이다.
25. 접근 제어자의 종류엔 어떤게 있는지 설명하시오
5가지가 존재하는데 private, filePrivate, internal, public, open이 있다.
- private
가장 한정적인 범위
기능을 정의하고 구현한 범위 내에서만 사용 가능
private로 지정한 기능은 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용 불가
- filePrivate (파일 외부 비공개 접근 수준)
filePrivate로 지정된 요소가 구현된 소스파일 내부에서만 사용 가능
해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용
- internal (내부 접근 수준)
기본적으로 모든 요소에 암묵적으로 저장하는 기본 접근 수준 (표기하지 않을 경우 자동으로 internal)
internal로 지정된 요소는 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있으나 외부 모듈에서는 접근 불가
보통 외부에서 사용할 클래스나 구조체가 아니고, 모듈 내부에서 광역적으로 사용할 경우에 지정한다.
- public (공개 접근 수준)
public으로 지정된 요소는 어디에서든 쓰일 수 있음
주로 프레임워크에서 외부와 연결된 인터페이스를 구현하는데 많이 쓰임
- open 개방 접근 수준
공개 접근수준 이상으로 높은 접근 수준
클래스와 클래스 멤버에서만 사용이 가능
클래스가 정의된 모듈 밖의 다른 모듈에서도 상속할 수 있음
open으로 정의된 클래스 멤버는 정의된 모듈 밖의 다른 모듈에서도 재정의 가능
클래스를 open으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모 클래스로 사용할 목적으로 설계했다는 것을 의미함
25-1. 접근 제어란?
주체와 객체 사이의 정보 흐름을 통제하는 것
코드끼리 상호작용 시 파일 간, 모듈 간에 접근을 제한
불필요한 접근으로 의도치 않은 결과를 초래하거나 꼭 필요한 이상의 코드가 노출될 위험이 있을 때 사용
26. defer란 무엇인지 설명하시오
defer란 현재 코드 블록을 나가기 전에 꼭 실행해야 되는 코드를 작성하여 코드가 블록을 어떻게 빠져 나가든
꼭 마무리해야 되는 작업을 할 수 있게 도와줍니다.
27. defer가 호출되는 순서는 어떻게 되고 defer가 호출되지 않는 경우를 설명하시오
defer가 호출되는 순서는 코드블록 순으로 호출되지만, 같은 코드 블럭에서 여러 defer가 있을 경우 역순으로 호출.
defer가 호출되지 않는 경우는 세가지가 있음
첫째로 throw를 이용해서 오류를 던질 경우 중간에 throw가 발생해서 함수가 종료 될 경우 아래 선언 된 defer에
도달하지 못해 함수가 종료 되어도 defer가 호출되지 않는다.
두번째로 guard 문을 사용해 중간에 함수를 종료하는 경우 guard문을 이용했을 경우에도 위의 throw를 이용해
오류를 던질 경우와 마찬가지로 guard문 이후에 나오는 defer에 도달하기 전에 함수가 종료됨.
세번째로 (Never)비반환함수인 경우
에러가 발생하면서 함수를 반환하지 않고 실행을 종료하기 때문에 defer가 호출되지 않는다.
28. property wrapper에 대해서 설명하시오
어떤 값이 있으면 이 값을 한번 감싸서 저장을 위한 로직과 얻어오기 위한 로직을 어느 정도 분리해서 반복을
줄여줄 수 있는 방법을 제공하는 속성이다.
프로퍼티 래퍼를 사용하면 코드의 재사용성을 높여 코드가 짧아지는 효과를 나타낼 수 있다.
29. Generic에 대해 설명하시오
제네릭 타입이란 "타입을 파라미터화 해서 컴파일 시 구체적인 타입이 결정되도록 하는 것"이라는 뜻.
30. some 키워드에 대해 설명하시오
some 키워드는 리턴 타입을 자동으로 그리고 빠르게 추론할 수 있는 스위치 기능이다.
불투명한 타입은 swift의 중요한 기능이다.
불투명한 타입이라는 것을 나타내는 some 키워드는 computed property 혹은 함수의 구체적인 return type
을 숨기는 것이 가능하다.
이를 통해 유연하고 간결하며 강력한 swift 코드를 작성할 수 있다.
예시 var body: some View{}
31. result 타입에 대해 설명하시오
result 타입은 Generic Enumeration으로 선언되어 있고, 경우에 따른 연관값을 포함하며, 성공과 실패를 나타내는 값
주로 api 통신 때 사용되어 성공했을 땐 success, 실패하면 error가 리턴되면 failure를 사용함.
32. Codable에 대해 설명하시오
자신을 변환하거나 외부 표현으로 변환할 수 있는 타입.
외부 표현은 JSON이라고 생각하면 된다.
33. Closure에 대해 설명하시오
클로저는 익명 함수라고 불리우며 func로 선언하는 것이 아니라 함수를 변수에 선언하는 형태이다.
"실행 가능한 코드 블럭"
.map {$0} 이런식으로 쓰여서 코드를 간결하게 나타낼 수 있음
34. Closure와 함수와의 관계에 대해 설명하시오
ARC
1. ARC란 무엇인지 설명하시오
swift는 프로그램 메모리 사용을 관리하기 위해 메모리 관리 기법인 ARC(Automatic Reference Counting)
을 사용한다.
컴파일 시 코드를 분석해서 자동으로 retain, release 코드를 생성해주는 것
참조된 횟수를 추적해 더 이상 참조되지 않는 인스턴스를 메모리에서 해제해 주는 것
ARC가 관리해주는 Reference Counting(참조 횟수 계산)은 참조 타입인 클래스의 인스턴스에만 적용된다.
구조체나 열거형은 값 타입으로 다른 곳에서 참조하지 않기 때문에 ARC로 관리할 필요가 없다.
ARC는 자동으로 메모리를 관리해주는 방식이다.
대부분의 경우 메모리 관리는 Swift에서 그냥 작동하기 때문에 개발자는 메모리 관리에 신경을 덜 쓸 수 있음.
ARC는 인스턴스가 더 이상 필요하지 않다면 해당 인스턴스를 메모리에서 해제시킨다.
ARC는 해당 인스턴스를 참조하는 다른 인스턴스의 프로퍼티나 변수, 상수 등의 개수를 세고, 해당 인스턴스에
대한 활성 참조가 1개 이상 존재하는 한 인스턴스를 메모리에 없애지 않는다.
1-1. ARC와 가비지 컬렉션 차이는 뭔가
가장 큰 차이는 참조 카운팅 시점이다.
ARC는 컴파일 시,
가비지 컬렉션은 프로그램 동작 중이다.
2. Retain Count 방식에 대해 설명하시오
3. Strong과 Weak 참조 방식에 대해 설명하시오
strong(강한 참조)
- 해당 인스턴스의 소유권을 가진다
- 자신이 참조하는 인스턴스의 retain count를 증가시킨다
- 값 지정 시점에 retain이 되고 참조가 종료되는 시점에 release가 된다.
- 선언할 때 아무것도 적어주지 않으면 default로 설정된다
weak(약한 참조)
- 해당 인스턴스의 소유권을 가지지 않고, 주소값만을 가지고 있는 포인터 개념이다.
- 자신이 참조하는 인스턴스의 retain count를 증가시키지 않는다. release도 발생하지 않는다.
- 자신이 참조는 하지만 weak 메모리를 해제시킬 수 있는 권한은 다른 클래스에 있다.
- 메모리가 해제될 경우 자동으로 레퍼런스가 nil로 초기화를 해준다
- weak 속성을 사용하는 객체는 항상 optional 타입 이어야 한다(해당 객체가 nil일 수 있기 때문)
unowned(미소유 참조)
- 해당 인스턴스의 소유권을 가지지 않는다.
- 자신이 참조하는 인스턴스의 retain count를 증가시키지 않는다.
- nil이 될 수 없다. (optional로 선언하면 안된다)
4. 순환 참조에 대해 설명하시오
순환 참조란 두 가지 이상의 객체가 서로에 대한 강한 참조 상태를 가지고 있을 때 발생하며,
순환 참조가 발생하게 되면 서로에 대한 참조가 해제되지 않기 때문에 메모리에서 유지되며 이로 인해
메모리 누수가 발생하게 된다.
5. 강한 순환 참조는 어떤 경우에 발생하는지 설명하시오
Functional Programming
1. 순수 함수란 무엇인지 설명하시오
순수 함수란 외부 상태에 의존적이지 않고, 어떠한 사이드 이펙트도 발생시키지 않는 함수.
순수 함수는 언제 얼마나 많이 호출해도 항상 같은 input에 대해 같은 output을 반환한다.
이러한 순수 함수의 이점으로는
- 테스트가 용이하고, 재사용성이 올라감
- 예측가능성이 높아짐
이 있다.
2. 함수형 프로그래밍이 무엇인지 설명하시오
스위프트는 함수형 프로그래밍 페러다임을 지향한다.
함수형 프로그래밍이란
- 프로그램의 상태의 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 프로그래밍
- 값이나 상태의 변화보다는 함수 자체의 응용을 중요하게 여긴다.
- 코드 이해와 실행 결과의 관점에서, 순수하게 함수에 전달된 인자 값만 결과에 영향을 주기 때문에 상태 값을
갖지 않고 순수하게 함수만으로 동작 -> 어떤 상황에서 프로그램 실행해도 일정하게 같은 결과 도출 가능
- 프로그램 동작 과정에서 값이 변하지 않으면 함수 호출이 각각 상호 간섭 없이 실행되므로 병렬처리를 할 때
부작용이 거의 없다는 장점 -> 필요할 만큼 함수를 나누어 처리할 수 있도록 하기 때문에 대규모 병렬 처리에 큰 강점
또 다른 함수형 프로그램의 특징으로는 함수를 일급 객체로 다룬다는 점.
2-1. 일급 객체란?
- 전달인자로 전달할 수 있다
- 동적 프로퍼티 할당이 가능하다
- 변수나 데이터 구조 안에 담을 수 있다
- 변환 값으로 사용할 수 있다
- 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별가능하다.
결국 함수가 일급 객체가 된다는 의미는
다양한 종류의 함수를 호출, 전달, 반환하는 등의 동작만으로도 프로그램을 구현할 수 있다는 것.
3. 고차 함수가 무엇인지 설명하시오
하나 이상의 함수를 인자로 받거나, 함수를 반환하는 함수를 의미한다.
대표적으로 map, filter, reduce가 있다.
4. Swift Standard Library의 map, filter, reduce, compactMap, flatMap에 대해 설명하시오.
*Swift 페러다임 뭐지?
Architecture
1. MVVM, MVI, MVC, Ribs, VIP 등 자신이 알고 있는 아키텍쳐를 설명하시오
2. 의존성 주입에 대하여 설명하시오.
의존성을 가지는 코드가 많아진다면, 재활용성이 떨어지고 매번 의존성을 가지는 객체들을 함께 수정해 주어야 한다는 문제가 발생한다. 이러한 의존성을 해결하기 위해 나온 개념이 바로 Dependency Injection, 의존성 주입이다.
외부에서 객체를 생성해서 넣는 것을 의미한다.
의존성 주입을 하는 이유는 무엇일까?
Unit Test가 용이해진다.
코드의 재활용성을 높여준다.
객체 간의 의존성(종속성)을 줄이거나 없엘 수 있다.
객체 간의 결합도이 낮추면서 유연한 코드를 작성할 수 있다.
SwiftUI
1. @State에 대해서 설명하시오
Combine
1. PassthroughSubject에 대해서 설명하시오
2. @Published에 대해서 설명하시오
3. AnyCancellable에 대해서 설명하시오
4. sink에 대해서 설명하시오
5. throttle과 debounce의 차이점을 설명하시오
6. Data를 Binding 하는 방법에 대해서 설명하시오
-------------------후순위 지식------------------
Rx
1. Reactive Programming이 무엇인지 설명하시오
2. RxSwift를 왜 사용하는지 설명하시오
3. RxSwift의 단점을 설명하시오
4. RxSwift에서 Hot Observable과 Cold Observable의 차이를 설명하시오
5. Subject의 종류와 차이점에 대해 설명하시오
6. Subject와 Driver의 차이를 설명하시오
7. Single, Completable, Maybe의 차이점에 대해 설명하고, 언제 적용하면 좋을지 설명하시오
MRC
1. ARC 대신 Manual Reference Count 방식으로 구현할 때 꼭 사용해야 하는 메서드들을 쓰고 역할을 설명하시오.
2. retain과 assign의 차이점을 설명하시오
3. 특정 객체를 autorelease 하기 위해 필요한 사항과 과정을 설명하시오
4. Autorelease Pool을 사용해야 하는 상황을 두가지 이상 예로 들어 설명하시오.
Advanced
1. method swizzling이 무엇이고, 어떨 때 사용하는지 설명하시오.
2. NSCoder 클래스는 어떤 상황에서 어떻게 써야 하는지 설명하시오.
3. Responder Chain 구조에 대해 설명하고, First Responder 역할에 대해 설명하시오.
4. NSObject부터 UIButton 까지 상속 과정의 계층과 역할을 설명하시오.
5. shallow copy와 deep copy의 차이점을 설명하시오.
6. Push Notification 방식에 대해 설명하시오.
7. Foundation 과 Core Foundation 프레임워크의 차이점을 설명하시오.
8. NSURLConnection 에서 사용하는 Delegate 메서드들에 대해 설명하시오.
9. Synchronous 방식과 Asynchronous 방식으로 URL Connection을 처리할 경우의 장단점을 비교하시오.
10. Plist 파일 구조와 Plist 파일에 저장된 데이터를 다루기 적합한 클래스를 설명하시오.
11. Core Data와 Sqlite 같은 데이터 베이스의 차이점을 설명하시오.
12. JSON 데이터를 처리하는 방식과 파서, 객체 변환 방식에 대해 설명하시오.
13. 웹 서버와 HTTP 연결을 사용해서 데이터를 주거나 받으려면 사용해야 하는 클래스와 동작을 설명하시오.
14. Protocol에서는 왜 var만 되는지 설명하시요.
15. DispatchQueue.main.sync를 사용하는 상황을 설명하시오.
16. Run Loops에 대해 설명하시오.
'CS' 카테고리의 다른 글
[CS] iOS CS Lv.0단계 질문 및 답안 정리 (2) | 2024.08.07 |
---|---|
[CS] 인텔리픽 모의면접 질문 정리 (0) | 2023.03.31 |
[CS] 자료구조 면접 정리 (2) | 2023.03.23 |
[CS] 운영체제 면접 정리 (1) | 2023.03.21 |
[CS] CS 내용 정리 (2) | 2023.03.10 |