[iOS / macOS] Swift 면접 질문 1
2024. 12. 30. 13:42ㆍ🍏/Others
문제 리스트 가져온 곳
- Swift에서 옵셔널(Optional)이란 무엇이며, 언제 사용해야 하나요?
- 옵셔널 바인딩과 강제 언래핑의 차이점은 무엇인가요?
- 옵셔널 체이닝의 동작 원리는 무엇이며, 어떻게 사용하나요?
- 암시적 언래핑 옵셔널(Implicitly Unwrapped Optional)은 어떤 경우에 사용해야 하나요?
-
더보기- 옵셔널이란 값이 있을 수도 없을 수도 있는 값을 일컫는다. (null)
- 옵셔널 바인딩이란 if let, guard let과 같이 옵셔널을 꺼내오는 방법. nil을 체크하고 안전한 값을 추출하게 한다.
- 옵셔널 강제 언래핑은 값이 있다고 책임질 수 있는 상황에서 사용 -> nil일 경우 런타임 에러가 발생.
- 옵셔널이 nil이 아닌 경우 값을 언래핑하여 사용
- 옵셔널이 체이닝은 여러 중첩된 옵셔널 값이 있을 때, 각 값이 nil인지 확인하며 안전하게 호출하거나 접근하는 방식. 옵셔널이 nil이면 체이닝 전체가 nil을 반환하며, 에러 없이 종료된다.
- 암시적 언래핑 옵션은 값이 항상 존재한다고 보장할 수 있는 경우에 사용. (초기화 시 값이 반드시 설정되며 이후 nil이 될 가능성이 없는 경우. 외부에서 값을 주입받아 항상 값이 있다고 보장되는 경우 사용)
- iOS 앱의 생명주기(App Life Cycle)에 대해 설명해주세요.
- 앱의 각 상태(Not Running, Inactive, Active, Background, Suspended)에서 가능한 작업은 무엇인가요?
- 상태 변화에 따라 호출되는 AppDelegate 또는 SceneDelegate 메서드는 무엇인가요?
- 백그라운드에서 작업을 완료하기 위한 방법은 어떤 것이 있나요?
- Auto Layout을 사용하는 이유와 장점은 무엇인가요?
- 제약 조건(Constraints)의 우선순위(Priority)는 어떻게 동작하나요?
- Intrinsic Content Size란 무엇이며, 어떻게 활용되나요?
- Ambiguous Layout과 Unsatisfiable Constraints는 무엇이며, 어떻게 해결하나요?
- Swift에서 클로저(Closure)란 무엇이며, 어떻게 사용하나요?
- 클로저의 캡처(Capture) 기능은 무엇인가요?
- @escaping 클로저와 non-escaping 클로저의 차이점은 무엇인가요?
- 트레일링 클로저(Trailing Closure) 문법은 어떤 경우에 유용한가요?
- iOS에서 Delegate 패턴은 무엇이며, 어떤 상황에서 사용되나요?
- Delegate 패턴과 Notification, KVO의 차이점은 무엇인가요?
- 프로토콜을 활용한 Delegate 패턴 구현 방법을 설명해주세요.
- Swift의 기본 데이터 타입과 컬렉션(Collection) 타입에는 어떤 것들이 있나요?
- 값 타입(Value Type)과 참조 타입(Reference Type)의 차이점은 무엇인가요?
- 구조체(Struct)와 클래스(Class)의 사용 시기는 어떻게 구분하나요?
- 열거형(Enum)의 원시값(Raw Value)과 연관값(Associated Value)은 무엇인가요?
-
더보기기본 데이터 타입 : int, double, float, bool, string 등
컬렉션 타입 : array set dictionary
값 타입 : 데이터를 복사해서 저장. 서로 다른 메모리 공간을 사용, 하나의 값이 변경되어도 다른 값에 영향을 미치지 않음
주요 값 타입들 : 기본 데이터 타입, struct, enum, array, set, dictionary
참조 타입 : 데이터를 참조하여 저장
여러 객체가 동일한 메모리 주소를 참조하기 때문에, 한쪽에서 값을 변경하면 다른 참조에도 영향을 미침
주요 참조 타입 : 클래스, 클로저
Struct vs Class
https://chanhhh.tistory.com/135
원시값 (Raw Value)
열거형의 각 케이스에 기본값(리터럴 값)을 지정할 수 있습니다.
모든 케이스는 동일한 데이터 타입의 원시값을 가질 수 있습니다.
사용 사례: 특정 값에 고유한 식별자를 부여해야 할 때.
기본값으로 매핑해야 할 때.
연관값 (Associated Value)
열거형의 각 케이스에 동적으로 관련된 값을 저장할 수 있습니다.
서로 다른 데이터 타입을 가질 수 있습니다.
사용 사례: 열거형 케이스와 관련된 추가 데이터를 저장해야 할 때.
- Xcode에서 디버깅 시 자주 사용하는 기능은 무엇인가요?
- 중단점(Breakpoint)의 종류와 활용 방법을 설명해주세요.
- LLDB 콘솔에서 유용한 명령어는 어떤 것이 있나요?
-
더보기breaking point, po, print, hierarchy
1. 조건부 중단점 (Conditional Breakpoint)
- 특정 조건이 참일 때만 실행을 멈춤.
- 조건을 설정하여 디버깅 범위를 줄이고 효율성을 높임.
중단점에서 edit breakpoint를 사용하여 index == 5 처럼 조건을 걸 수 있음
2. 예외 중단점 (Exception Breakpoint)
예외(Exception)가 발생했을 때 프로그램 실행을 멈춤.
런타임 크래시나 예외 처리를 디버깅하는 데 유용.
활용 방법: Breakpoint Navigator → "+" → Add Exception Breakpoint.
모든 예외 또는 특정 예외 유형 선택.
3. 로그 메시지 중단점 (Log Message Breakpoint)
중단점에 도달할 때 메시지를 출력하고, 프로그램 실행을 멈추지 않음.
디버깅 로그를 남기는 데 유용.
활용 방법: 중단점 추가 후 우클릭 → Edit Breakpoint.
"Log Message" 입력.
LLDB 주요 명령어:
po: 객체 값 출력.
print: 변수 값 출력.
bt: 호출 스택 출력.
expr: 변수 값 변경 또는 코드 실행.
thread: 스레드 정보 출력 및 선택.
- iOS 앱에서 데이터를 저장하는 방법에는 어떤 것들이 있나요?
- UserDefaults의 사용 시 주의할 점은 무엇인가요?
- Keychain은 어떤 데이터를 저장하기에 적합한가요?
- Core Data와 SQLite의 차이점은 무엇이며, 각각 언제 사용하면 좋나요?
-
더보기userdefaults - 키-값 데이터 API
주의할 점 :
1. plist 형태로 저장되므로 보안에 주의 해야합니다.
2. 데이터 크기의 제한이 있습니다.
3. 디스크 액세스 이므로 빈번한 읽기/쓰기 작업에는 적합하지 않다.
keychain - 보안이 중요한 민감한 데이터 저장소 (iOS 보안 프레임워크를 사용한 암호화 데이터 저장)
core data - 코어데이터는 db + orm 프레임워크다. (객체지향데이터관리 프레임워크) 관계형 데이터와 대규모 데이터
sqlite - 경량 sql db이다. 구조화된 데이터의 직접 관리에 적합
파일시스템 - 파일형식으로 데이터를 저장 json, xml, csv, 이미지, 비디오 (경로 documents, caches, temporary)
CloudKit - iCloud와 연동하여 데이터 저장. 데이터 기기 간 동기화, 공유
Realm - Core Data 대안 경량 객체 데이터베이스 (외부 라이브러리) 빠르고 간단한 api 제공
https://chanhhh.tistory.com/335
- Swift에서 프로토콜(Protocol)이란 무엇이며, 어떻게 활용하나요?
- 프로토콜의 요구사항은 무엇인가요?
- 프로토콜 확장(Protocol Extension)을 사용하는 이유는 무엇인가요?
- 프로토콜 지향 프로그래밍(Protocol-Oriented Programming)의 장점은 무엇인가요?
- Swift의 접근 제어자(Access Control Levels)에 대해 설명해주세요.
- open과 public의 차이점은 무엇인가요?
- internal, fileprivate, private의 사용 시기는 어떻게 결정하나요?
- 접근 제어자를 사용하는 이유는 무엇인가요?
- iOS 앱에서 네트워크 통신을 하는 방법에는 어떤 것들이 있나요?
- URLSession의 기본 사용 방법을 설명해주세요.
- 네트워크 요청 시 에러 처리는 어떻게 하나요?
- 서드파티 라이브러리(예: Alamofire)를 사용하는 이유는 무엇인가요?
-
더보기https://chanhhh.tistory.com/247
url을 사용해서 네트워크 요청을 생성한뒤, 작업을 실행합니다. 사용자 정의 설정을 위해 세션 설정을 사용합니다.
에러 핸들링으로 따로 처리를 할 수 있습니다.
또는 http 상태 코드에 따라 적절한 로직을 추가 할 수도 있습니다.
alamofire를 사용하는 이유는 urlsession보다 코드 작성이 간단하며 가독성이 좋습니다.
보다 추상화 되어있으며, 요청관리가 자동화되어 있습니다.
- 의존성 관리 도구(CocoaPods, Carthage, Swift Package Manager)의 종류와 차이점은 무엇인가요?
- 각 도구의 사용 방법과 장단점을 설명해주세요.
- 의존성 관리를 통해 얻을 수 있는 이점은 무엇인가요?
-
더보기https://chanhhh.tistory.com/200
https://chanhhh.tistory.com/201
CocoaPods - 가장 오래된 의존성 관리도구. ruby .xcworkspace를 생성하고 프로젝트에 의존성을 통합. 많은 라이브러리들을 갖고 있음. 커뮤니티와 문서가 풍부
Carthage - Xcode 프로젝트를 수정하지 않음. 대신 의존성 라이브러리를 빌드하고 프레임워크로 제공. 수동으로 Xcode 프로젝트에 프레임워크를 추가해야합니다. 가볍고 유연하며, 필요에 따라 커스터마이징 가능
SPM - 애플이 공식적으로 지원하는 도구, Xcode에 통합. 빠른속도와 간결한 설정이 장점이나 상대적으로 적은 라이브러리들을 갖고 있음 (얼마안됨), 복잡한 종속성 트리 관리가 부족할 수 있음
의존성 관리를 통해 얻을 수 있는 이점
1. 생산성 향상: 외부 라이브러리를 쉽게 추가, 업데이트, 제거 가능.
2. 의존성 충돌 방지: 각 라이브러리의 호환성을 관리하고, 명시적 버전 제어를 통해 충돌 최소화.
3. 프로젝트 크기 감소: 필요 없는 라이브러리를 제거하거나, 사용하지 않는 부분을 최소화 가능.
4. 유지보수성 증가: 의존성 관리 도구를 통해 프로젝트 내 라이브러리를 한눈에 파악.
5. 커뮤니티 및 생태계 활용: 수많은 라이브러리와 도구를 쉽게 통합하여 프로젝트 개발 속도를 높임.
- Swift의 고차 함수(Higher-Order Functions)에 대해 설명해주세요.
- map과 flatMap의 차이점은 무엇인가요?
- filter, reduce 함수는 어떤 경우에 사용하나요?
- compactMap은 어떤 역할을 하나요?
-
더보기고차 함수는 하나 이상의 함수(또는 클로저)를 매개변수로 받거나, 함수를 반환하는 함수.
map vs flatMap => map은 중첩 배열이 가능(2차원배열 등), flat map은 평탄화하여 단일 배열로 반환해줌.
flatmap은 nil값도 없애줌. map은 optional을 안까줌.
compactMap => nil값을 아예 없애주는 map
filter는 컬렉션 요소 중 조건을 만족하는 요소만 남겨 새로운 배열로 반환
reduce는 컬렉션 요소를 하나의 결과 값으로 축약. 초기값과 축약 연산을 매개변수로 받음 (합계, 곱셈, 문자열 결합등)
let numbers = [1, 2, 3, 4]
let add = numbers.reduce(0, +)
let multi = numbers.reduce(1, *)
let stringAdd = numbers.reduce("") { String($0) + String($1) }
print(add, multi, stringAdd) // 10 24 1234
- Git에서 브랜치(Branch)를 사용하는 이유와 장점은 무엇인가요?
- 브랜치를 병합(Merge)하는 방법에는 어떤 것들이 있나요?
- 브랜치 전략(예: Git Flow, GitHub Flow)에 대해 설명해주세요.
- 충돌(Conflict)이 발생했을 때 해결 방법은 무엇인가요?
-
더보기개발 작업의 독립성유지, 안정성 확보, 팀 협업 증가등의 이유로 브랜치를 쓰고 장점으로는 병렬작업, 롤백 용이성, 가시성 향상등이 있다.
브랜치 병합의 방법들
1. Fast-Forward Merge (대상 브랜치에 새 커밋이 없을 경우, 헤드를 단순히 이동하여 병합.)
히스토리가 간결해지지만, 브랜치의 독립적인 작업 기록이 사라집니다.
2. 3-Way Merge
- 두 브랜치가 모두 커밋 이력을 갖고 있는 경우 공통 조상을 기준으로 병합.
- 병합 커밋이 생성되어 이력을 보존
3. Rebase
- 브랜치의 커밋 이력을 메인 브랜치 위로 재배치
- 히스토리가 깔끔해지지만, 충돌 발생 시 해결이 복잡할 수 있습니다.
4. Squash and Merge
- 브랜치 모든 커밋을 하나로 합친 후 메일 브랜치에 병합
브랜치 전략
Git Flow - main, 기능 구현, hotfix 등으로 나눈다.
작은 프로젝트에는 과도할 수 있으나, 복잡한 프로젝트에 적합하고 명확한 릴리즈 주기를 지원한다.
Github Flow - 단순화된 브랜치 전략, main과 기능 브랜치로 구성.
GitLab Flow - 프로덕션, 스테이징 환경을 추가.
Trunk-Based Development - 모든 개발자가 main 브랜치에 작은 단위의 작업을 병합
- Swift의 에러 처리 방법에 대해 설명해주세요.
- throws, try, catch 키워드의 사용 방법은 무엇인가요?
- 옵셔널을 사용한 에러 처리와 do-catch를 사용하는 에러 처리의 차이는 무엇인가요?
- 에러를 전파하는 방법은 무엇인가요?
- 메모리 관리에서 강한 참조(Strong Reference)와 약한 참조(Weak Reference)의 차이점은 무엇인가요?
- 순환 참조(Retain Cycle)가 발생하는 경우와 해결 방법은 무엇인가요?
- 클로저에서 [weak self]와 [unowned self]의 차이는 무엇인가요?
- iOS 앱에서 Multi-threading을 구현하는 방법은 무엇인가요?
- DispatchQueue와 OperationQueue의 차이점은 무엇인가요?
- 동시성 프로그래밍에서 Race Condition을 방지하는 방법은 무엇인가요?
- 메인 스레드에서 UI 업데이트를 해야 하는 이유는 무엇인가요?
- UIKit에서 TableView와 CollectionView의 차이점은 무엇인가요?
- 셀(Cell)의 재사용(Reusability)은 어떻게 구현되나요?
- 동적인 셀 높이(Dynamic Cell Height)를 설정하는 방법은 무엇인가요?
- CollectionView의 레이아웃을 커스터마이징하는 방법은 무엇인가요?
- ARC(Automatic Reference Counting)의 동작 원리는 무엇인가요?
- Retain Cycle이 발생하지 않도록 방지하는 방법은 무엇인가요?
- deinit 메서드는 언제 호출되며, 어떤 역할을 하나요?
- 상속(Inheritance)과 프로토콜(Protocol)의 차이점은 무엇인가요?
- 클래스 상속을 사용할 때의 장단점은 무엇인가요?
- 다중 상속(Multiple Inheritance)이 불가능한 이유는 무엇인가요?
- 프로토콜 준수(Conformance)를 통해 다형성을 구현하는 방법은 무엇인가요?
- 사용자 인터페이스(UI) 테스트와 단위(Unit) 테스트의 차이점은 무엇인가요?
- XCTest 프레임워크를 사용하여 테스트를 작성하는 방법은 무엇인가요?
- 테스트 주도 개발(TDD)의 장점은 무엇인가요?
- 의존성 주입(Dependency Injection)을 활용하여 테스트 가능한 코드를 작성하는 방법은 무엇인가요?
- Xcode에서 Instruments를 사용하여 앱의 성능을 분석하는 방법은 무엇인가요?
- Time Profiler를 사용하여 성능 이슈를 찾는 방법을 설명해주세요.
- Allocations Instrument를 사용하여 메모리 누수를 탐지하는 방법은 무엇인가요?
- Leaks Instrument를 사용하여 메모리 누수를 찾는 방법은 무엇인가요?
- Swift의 제네릭(Generic)에 대해 설명해주세요.
- 제네릭을 사용하는 이유는 무엇인가요?
- 제네릭 타입 파라미터와 제약 조건을 설정하는 방법은 무엇인가요?
- 제네릭을 사용할 때의 장점과 주의할 점은 무엇인가요?
- Swift의 클로저와 함수의 차이점은 무엇인가요?
- 클로저가 일급 객체(First-Class Citizen)인 이유는 무엇인가요?
- 함수형 프로그래밍 패러다임에서 클로저가 어떻게 활용되나요?
- 동시성 프로그래밍에서 동기(Synchronous)와 비동기(Asynchronous)의 차이점은 무엇인가요?
- iOS에서 비동기 작업을 처리하는 방법은 무엇인가요?
- 세마포어(Semaphore)와 뮤텍스(Mutex)의 차이점은 무엇인가요?
- GCD(Grand Central Dispatch)의 주요 개념과 사용 방법을 설명해주세요.
- 직렬(Serial) 큐와 동시(Concurrent) 큐의 차이는 무엇인가요?
- 글로벌 큐(Global Queue)와 메인 큐(Main Queue)는 어떻게 다르나요?
- DispatchWorkItem을 사용하는 방법은 무엇인가요?
'🍏 > Others' 카테고리의 다른 글
[iOS / macOS] Swift 면접 질문 2 (1) | 2024.12.31 |
---|---|
암호화와 보안의 기본 개념, 그리고 iOS 앱 보안을 위한 방안 (2) | 2024.12.27 |
수병아... 니가 밉다... (미지의 공간 탈출 c++) (0) | 2024.11.18 |
[Tuist] TCA 프레임워크 적용하기 (0) | 2024.11.07 |
[Developer] 앱 사라짐 / 멤버십 만료 / 멤버십 갱신 (3) | 2024.11.04 |