첫 면접으로 포트폴리오 기준으로 준비를 했지만, 생각 정리가 안되서 만족스러운 대답을 못했던 것 같다 🥲
그래도 부족한 부분을 알 수 있던 좋은 계기라 생각하며, 나름 열심히 정리해보려고 합니다 😁
기술 면접 관련 질문들 📑
final 에 대하여 ▾
사용의 의미
- 재정의 및 상속을 방지합니다.
- 코드의 런타임 성능이 향상됩니다. (= 런타임 오버 헤드가 제거되고 정적 디스패치가 구현됩니다 )
코드의 런타임 성능이 향상된다 ❓
- 런타임에 컴파일러 계산을 피하면 프로그램이 효율적이고 빨라집니다.
- 시스템 관점에서는 클래스 멤버가 참조 될 때마다 런타임에 다음 계산을 수행해야합니다.
- 클래스가 코드의 어느 곳에서나 상속되었는지 or 그 자체가 하위 클래스인지 확인합니다.
- 클래스 멤버가 재정의되었는지와 횟수를 확인합니다.
- 여러 재정의에서 올바른 구현을 가져옵니다.
- 구현 풀에서 올바른 구현을 간접적으로 호출합니다.
- final은 시스템에 "다른 유사한 엔티티가 없다" 라고 알려줍니다. 이러면 시스템의 계산은 당연히 걱정할 필요가 없게 되며, 이는 컴파일 시간에 발생하게 되는데, 이는 런타임 오버 헤드를 제거합니다. → 직접 액세스 || 정적 디스패치 라고 합니다.
- 이로써 런타임 효율성을 증가시킨다고 합니다.
ARC 에 대하여 ▾
ARC(Auto Reference Counting) ❓
- iOS는 앱의 메모리 사용을 추적 및 관리하기 위해 ARC 기능을 사용합니다.
- 참조 메모리 관리를 자동으로 해주는 기능을 뜻합니다.
- 이는 인스턴스가 참조되거나 참조해제될 때 횟수를 카운팅하고, 횟수가 0이 되면 인스턴스를 메모리에서 해제하는 방식으로 수행됩니다.
더 구체적인 기능
- 클래스가 새로운 인스턴스를 생성할 때, ARC는 인스턴스에 대한 정보를 저장할 메모리 청크를 할당합니다.
- 할당한 메모리 청크에는 인스턴스 타입에 대한 정보, 인스턴스와 관련된 프로퍼티 값 등을 저장합니다.
- 더이상 인스턴스가 필요하지 않게 되면 자동으로 메모리에서 비우는 방식으로 메모리를 관라합니다.
- But! ARC가 사용중인데 인스턴스를 해제하면 인스턴스의 프로퍼티나 메소드에 접근할 수 없는데, 이 때 접근하면 앱에서 Crash가 납니다.
- 따라서 인스턴스를 필요로 하는 동안에는 메모리에서 사라지지 않게 하기 위해, 인스턴스 할당 시 strong reference를 연결하고 ARC가 인스턴스의 참조 횟수를 추적합니다.
구체적인 예시 중 weak & unowned 참조 관련한 내용도 포함되어 있어 따로 정리해보려고 합니다.
Delegate Pattern(Delegation) 에 대하여 ▾
정의
- 애플 공식 문서에 따르면 "Delegation이란 일부 클래스의 책임을 다른 클래스의 인스턴스에게 위임 또는 전달할 수 있는 디자인 패턴을 의미한다." 라고 합니다.
- 쉽게 말해 어떤 객체에서 일어나는 이벤트 혹은 전송할 데이터에 관한 코드를 다른 객체에서 작성해주는 것을 말합니다.
- A객체의 일을 B객체에서 대신해주는 일을 위임하는 행위입니다.
- protocol (해야할 일의 목록) && sender (일을 시키는 객체) && receiver (일을 하는 객체)
Process
1. 요구사항을 파악합니다.
- 각각의 Delegate들은 Delegate Protocol에 의해 나열된 그들의 규칙이 있습니다. 이들은 함수 시그니쳐들의 집합으로 해당 protocol을 따르게 된다면 반드시 구현해야하는 함수들입니다.
protocol UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
}
2. Delegation을 따른다/채택한다.
- 클래스 뒤에 SomeDelegate를 작성하여 해당 클래스가 SomeDelegate protocol을 따른다는 것을 표현할 수 있습니다.
class SomeViewController: UIViewContoller, UITableViewDataSource {
/// - method
}
3. Delegate 객체(일을 시키는 객체, sender) 와 연결을 합니다.
/// TableView (선언했다고 가정)
tableView.dataSource = self
4. 요구사항들 구현하기 (대신 구현하기)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return 3
}
API 에 대하여 ▾
정의
- Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스 ▾ [ 위키 백과 ]
- 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻합니다.
장 / 단점
- 장점 🏅
- 비즈니스적 관점에서는 새로운 수익 채널 확보 및 기존 수익 채널 확장할 수 있습니다.
- 비용 및 시간을 줄일 수 있습니다.
- 단점 💣
- 정보 부족 및 정확성이 낮을 수 있고, 확장성이 낮을 수도 있습니다.
- API 손상, 노출, 해킹시 데이터 유출 사고의 원이 되므로 API 보안이 중요합니다.
RESTful API 에 대하여 ▾
REST 정의
- REST(Representational State Transfer)
- 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미합니다.
- HTTP URL(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대하여 CRUD Operation을 적용하는 것을 의미합니다.
REST API 정의 && 특징
- 정의
- REST 기반으로 서비스 API를 구현한 것입니다.
- 특징
- 사내 시스템들도 REST 기반으로 시스템을 분산해 확장성과 재사용성을 높여 유지보수 및 운용을 편리하게 할 수 있습니다.
- REST는 HTTP 표준을 기반으로 구현하므로, HTTP를 지원하는 프로그램 언어로 클라이언트, 서버를 구현할 수 있습니다.
- REST API 제작하면 델파이 클라이언트 뿐 아니라 자바, C#, 웹 등을 이용해 클라이언트를 제작할 수 있습니다.
RESTful 정의 && 목적
- 정의
- 일반적으로 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어입니다.
- RESTful은 REST를 REST답게 쓰기 위한 방법으로, 누군가가 공식적으로 발표한 것은 아닙니다.
- REST 원리를 따르는 시스템은 RESTful 이란 용어로 지칭됩니다.
- 목적
- 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것입니다.
- RESTful한 API를 구현하는 근본적인 목적이 성능 향상에 있는 것이 아니라 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것이 주 동기입니다.
성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 없습니다. 😁
REST의 장 / 단점
- 장점 🏅
- HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구축할 필요가 없습니다.
- HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해줍니다.
- HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능합니다.
- Hypermedai API의 기본을 충실히 지키면서 범용성을 보장합니다.
- REST API 메세지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있습니다.
- 여러가지 서비스 디자인에서 생길 수 있는 문제를 최소화합니다.
- 서버와 클라이언트의 역할을 명확하게 분리합니다.
- 단점 💣
- 표준이 존재하지 않습니다.
- 사용할 수 있는 메소드가 4가지 밖에 없습니다. ( HTTP Method 형태가 제한적입니다. )
- 브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠수 있는 URL보다 Header 값이 더 어렵게 느껴집니다.
- 구형 브라우저가 아직 제대로 지원해주지 못하는 부분이 존재합니다. ▾
- PUT, DELETE를 사용하지 못하는 점 & pushState를 지원하지 않는 점
DispatchQueue 에 대하여 ▾
Queue 에 대해서
- 정의
- Queue는 컴퓨터의 기본적인 자료 구조의 한가지로, 선입선출(FIFO, First In First Out)구조로 저장하는 형식 [ 위키백과 ]
- 종류
- Serial
- 하나의 작업이 끝나야만 다음 작업을(한번에 하나의 작업만) 실행하는 Queue
- Concurrent
- 동시에 여러 작업들을 실행하는 Queue
- Serial
DispatchQueue(GCD) 에 대해서
- 정의
- 앱의 메인 쓰레드나 백그라운드 쓰레드에서 순차적으로 또는 동시에 작업 실행을 관리하는 개체 [Apple Developer]
- 앱에서 Task를 비동기적으로 동시에 수행 할 수 있는 손쉬운 방법입니다.
- GCD
- 자동으로 일부 dispath queues를 제공하지만, 특정 용도로 작성 할 수 있는 다른 큐(queue)를 제공합니다.
- Serial, Concurrent Queue는 Dispatch Queue에 들어갈 수 있습니다. ▾
- Serial Dispatch Queue → Task들을 넣으면 하나의 Task가 끝나고 다음 Task를 실행합니다.
- Concurrent Dispatch Queue → Task들을 넣으면 앞의 Task 완료 여부와 상관 없이 동시에 Task를 실행합니다.
- 종류
- main dispatch queue
- 앱의 main 쓰레드에서 Task를 실행하는(전역적으로 사용 가능한) serial queue
- 앱의 주요 동기화 지점으로 사용됩니다.
- UI와 관련된 Task를 넣어야 합니다.
- global dispatch queue
- 동시에 하나 이상의 Task를 실행하지만 Task는 큐에 추가된 순서대로 계속 시작됩니다. (Concurrent queue)
- 현재 실행중인 Task는 dispatch queue에서 관리하는 고유한 쓰레드에서 실행됩니다.
- main dispatch queue
Dispatch Queue 관련 자료는 여기서 참고하였습니다. 추가적인 자료 또한 이 사이트에서 확인하실 수 있습니다.
'iOS_Swift.zip' 카테고리의 다른 글
[iOS]SDWebImage 에러 (0) | 2022.02.11 |
---|---|
[iOS]카카오 로그인(소셜) (0) | 2022.01.25 |
[iOS]CollectionView Layout (0) | 2022.01.11 |
[iOS]HIG(Human Interface Guide) (0) | 2022.01.10 |
[iOS]SOLID 원칙 (0) | 2022.01.07 |