1주차 Swift + OS Swift 예상 면접 질문 및 키워드
1. Array 에 대해서 설명해주세요.
Array는 동일한 데이터 타입의 요소들이 순서대로 저장된 컬렉션 타입이다. 배열의 각 요소는 인덱스를 통해 접근할 수 있고, 인덱스는 0부터 시작된다. Swift 에서의 배열은 가변 배열로, 배열의 크기를 조정할 수 있는 형태이다. 배열은 메모리에서 연속된 공간에 저장되므로 인덱스를 이용한 접근이 매우 빠르다.
2.Stack, Queue 의 차이점에 대해서 설명해주세요.
Stack과 Queue는 데이터 저장을 위한 자료 구조이다. 둘 다 요소를 추가하거나 제거할 수 있지만, 그 동작 방식에는 차이가 존재한다.
Stack
Last-in-Firs-out(LIFO) 구조이다. 가장 마지막에 추가된 요소가 가장 먼저 제거된다. 흔히 사용하는 연산은 push(요소 추가) 와 pop(요소 제거)이다.
Queue
FIrst-in-First-out(FIFO) 구조이다. 가장 처음에 추가된 요소가 가장 먼저 제거된다. 흔히 사용하는 연산은 enqueue(요소 추가) 와 dequeue(요소 제거) 이다.
3. iOS 에서 Stack 을 사용하는건 어떤게 있을까요?
iOS 개발에서 Stack은 여러 용도로 사용된다.
- Navigation Stack : UINavigationController 는 뷰 컨트롤러들을 스택 형태로 관리한다. 사용자가 화면을 전환할 때 마다 새로운 뷰 컨트롤러가 스택에 push(요소 추가) 되고, 뒤로가기를 하면 스택에서 pop(요소 제거) 된다.
- Cell Stack: 메서드 호출 시 시스템 내부적으로 호출된 메서드들을 스택으로 관리한다. 메서드가 끝나면 스택에서 제거된다.
4. 저장 프로퍼티와 연산 프로퍼티에 대해서 설명해주세요.
저장 프로퍼티(Stored Property)
객체의 인스턴스와 함께 메모리에 저장되는 실제 값을 가지는 프로퍼티이다. 클래스나 구조체의 인스턴스가 생성될 때 함께 메모리에 할당된다. 예를 들어, 아래와 같은 프로퍼티가 존재할 수 있다.
var name: String = "park"
연산 프로퍼티(Computed Property)
실제로 값을 저장하지 않고, 대신 특정 계산을 통해 값을 반환하는 프로퍼티이다. getter 와 setter 를 사용할 수 있으며, 프로퍼티 값이 접근될 때마다 계산이 수행된다. 예를 들어 아래와 같은 프로퍼티가 존재할 수 있다.
var fullName: String = {
return "\(firstName) \(lastName)"
}
5. lazy 프로퍼티에 대해서 설명해주세요.
lazy 프로퍼티는 처음 접근할 때 초기화되는 저장 프로퍼티이다. 이 프로퍼티는 초기화 비용이 크거나, 인스턴스 초기화 시점에 초기화되지 않아도 되는 경우에 사용된다. 'lazy' 키워드를 사용하여 선언하며, 클로저를 사용해 초기값을 설정할 수 있다. 사용예시는 아래와 같다.
lazy var data = DataLoader() // DataLoader는 크래스나 구조체로 시간이 걸리는 작업을 수행하는 경우
6. Optional에 대해서 설명해주세요.
Optional은 값이 존재할 수도 있고, 존재하지 않을 수도 있는 변수나 상수를 나타낸다. Swift 에서 nil 은 값이 없음을 나타내기 때문에, Optional 타입은 값이 있을때와 없을 때를 모두 처리할 수 있도록 도와준다. Optional은 '?' 를 사용하여 선언하며, 이는 변수나 상수에 값이 있을 수도, 없을 수도 있음을 나타낸다.
7. Optional 을 사용하는 이유에 대해서 설명해주세요.
Optional 을 사용하는 이유는 아래와 같다.
- 안정성 : 프로그램이 잘못된 메모리 접근을 시도하지 않도록 발지한다.
- 명시성 : 값이 있을 수도 없을 수도 있는 상황을 명확하게 표현할 수 있다.
- 유연성 : 값을 나중에 할당하거나 특정 조건에서만 값을 할당할 수 있도록 유연하게 관리할 수 있다.
8. Optional 언래핑 방법에 대해서 아는만큼 설명해주세요.
Optional은 값이 있을 때 안전하게 사용할 수 있도록 언래핑(Unwrapping)해야 한다.
1. 강제 언래핑
강제 언래핑은 Optional 의 값을 강제로 언래핑하는 경우를 말한다. '!' 를 사용하여 언래핑하며 값이 'nil'일 경우 런타임 에러가 발생한다.
let value: Int? = 5
print(value!) // 5
2. 옵셔널 바인딩
옵셔널 바인딩은 if let 이나 guard let 을 사용하여 Optional 을 안전하게 언래핑 하는 방법이다. 값이 존재할 때만 언래핑하고, 그렇지 않은 경우 다른 로직을 수행한다.
let value: Int? = 5
if let actualValue = value {
print(actualValue)
}
// or
guard let actualValue = value else {
return
}
3. nil 병합 연산자
nil 병합 연산자는 Optional 값이 'nil'인 경우 기본 값을 제공하는 방법이다.
let value: Int? = 5
let actualValue = value ?? 0
// value 가 nil 일 경우 0을 리턴한다.
9. Closure 에 대해 설명해 주세요.
Closure는 코드 블록을 캡쳐하여 저장하고, 나중에 호출할 수 있는 기능이다. Swift의 클로저느 함수와 유사하며, 변수나 상수로도 저장될 수 있다. 클로저는 변수나 상수의 캡쳐 기능을 가지며, 간결한 문법으로 사용된다. 클로저는 세 가지 형태가 존재한다.
1. 전역 함수 : 이름이 있고, 캡쳐할 값이 없는 클로저
2. 중첩 함수 : 이름이 있고, 상위 함수의 값을 캡쳐할 수 있는 클로저
3. 클로저 표현식 : 이름이 없고, 주변 문맥의 값을 캡쳐할 수 있는 클로저
10. Escaping Closure에 대해 설명해 주세요.
Escaping Closure는 함수의 인자로 전달되지만, 함수가 종료된 이후에도 실행될 수 있는 클로저이다. 클로저가 함수의 스코프를 탈출할 수 있는 경우 '@escaping' 키워드를 사용하여 명시해야 한다. 주로 비동기 작업에서 사용된다. 예를 들어 네ㅡ워크 요청이 완료된 이후 실행되는 클로저가 '@escaping' 클로저이다.
func performAsyncTask(completion: @escaping () -> Void) {
DispatchQueue.global().async {
// 비동기 작업 수행
completion() // 작업 완료 후 클로저 호출
}
}
11. Extension에 대해 설명해 주세요.
Extension은 기존 클래스, 구조체, 열거형 또는 프로토콜에 새로운 기능을 추가할 수 있는 방법이다. Swift의 확장 기능을 사용하여 기존 타입에 메서드, 초기화, 계산 속성 등을 추가할 수 있지만, 기존 타입의 소스 코드를 수정할 필요는 없다. 이를 통해 코드의 재사용성을 높이고 유지 보수성을 향상시킬 수 있다.
12. Extension을 사용해보셨나요?
주로 UI 쪽에서 delegate 나 dataSource 를 상속받을 때 사용했습니다.
코드를 작성할 경우 delegate 를 상속받아 쓰는 메서드나 dataSource 를 상속받아 작성해야 하는 메서드 들을 따로 분리해서 가독성을 높이려고 사용했었습니다.
a. extension 에서 저장 프로퍼티를 사용할 수 있나요?
Extension에서는 저장 프로퍼티를 사용할 수 없다. 저장 프로퍼티는 메모리에 직접적으로 영향을 주기 때문에 기존 타입의 메모리 구조를 변경할 수 있는 저장 프로퍼티는 확장에서 사용할 수 없다. 대신, 계산 프로퍼티나 메서드를 추가할 수 있다.
'TIL(Today I Learned)' 카테고리의 다른 글
| 2024.10.13 Today I Learned (1) | 2024.10.13 |
|---|---|
| 2024.09.25 Today I Learned (0) | 2024.09.25 |
| 2024.08.01 Today I Learned (1) | 2024.08.01 |
| 2024.07.29 Today I Learned (0) | 2024.07.29 |
| 2024.7.08 Today I Learned (0) | 2024.07.08 |