[iOS / macOS] Swift 면접 질문 1

2024. 12. 30. 13:42🍏/Others

문제 리스트 가져온 

 

GitHub - JeaSungLEE/iOSInterviewquestions: 👨🏻‍💻👩🏻‍💻iOS 면접에 나올 질문들 총 정리

👨🏻‍💻👩🏻‍💻iOS 면접에 나올 질문들 총 정리 . Contribute to JeaSungLEE/iOSInterviewquestions development by creating an account on GitHub.

github.com

 

 

레벨 1

  1. Swift에서 옵셔널(Optional)이란 무엇이며, 언제 사용해야 하나요?
    • 옵셔널 바인딩과 강제 언래핑의 차이점은 무엇인가요?
    • 옵셔널 체이닝의 동작 원리는 무엇이며, 어떻게 사용하나요?
    • 암시적 언래핑 옵셔널(Implicitly Unwrapped Optional)은 어떤 경우에 사용해야 하나요?
    • 더보기
      - 옵셔널이란 값이 있을 수도 없을 수도 있는 값을 일컫는다. (null)
      - 옵셔널 바인딩이란 if let, guard let과 같이 옵셔널을 꺼내오는 방법. nil을 체크하고 안전한 값을 추출하게 한다.
      - 옵셔널 강제 언래핑은 값이 있다고 책임질 수 있는 상황에서 사용 -> nil일 경우 런타임 에러가 발생.
      - 옵셔널이 nil이 아닌 경우 값을 언래핑하여 사용
      - 옵셔널이 체이닝은 여러 중첩된 옵셔널 값이 있을 때, 각 값이 nil인지 확인하며 안전하게 호출하거나 접근하는 방식. 옵셔널이 nil이면 체이닝 전체가 nil을 반환하며, 에러 없이 종료된다.
      - 암시적 언래핑 옵션은 값이 항상 존재한다고 보장할 수 있는 경우에 사용. (초기화 시 값이 반드시 설정되며 이후 nil이 될 가능성이 없는 경우. 외부에서 값을 주입받아 항상 값이 있다고 보장되는 경우 사용)
  2. iOS 앱의 생명주기(App Life Cycle)에 대해 설명해주세요.
    • 앱의 각 상태(Not Running, Inactive, Active, Background, Suspended)에서 가능한 작업은 무엇인가요?
    • 상태 변화에 따라 호출되는 AppDelegate 또는 SceneDelegate 메서드는 무엇인가요?
    • 백그라운드에서 작업을 완료하기 위한 방법은 어떤 것이 있나요?
  3. Auto Layout을 사용하는 이유와 장점은 무엇인가요?
    • 제약 조건(Constraints)의 우선순위(Priority)는 어떻게 동작하나요?
    • Intrinsic Content Size란 무엇이며, 어떻게 활용되나요?
    • Ambiguous Layout과 Unsatisfiable Constraints는 무엇이며, 어떻게 해결하나요?
  4. Swift에서 클로저(Closure)란 무엇이며, 어떻게 사용하나요?
    • 클로저의 캡처(Capture) 기능은 무엇인가요?
    • @escaping 클로저와 non-escaping 클로저의 차이점은 무엇인가요?
    • 트레일링 클로저(Trailing Closure) 문법은 어떤 경우에 유용한가요?
  5. iOS에서 Delegate 패턴은 무엇이며, 어떤 상황에서 사용되나요?
  6. 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)
      열거형의 각 케이스에 동적으로 관련된 값을 저장할 수 있습니다.
      서로 다른 데이터 타입을 가질 수 있습니다.
      사용 사례: 열거형 케이스와 관련된 추가 데이터를 저장해야 할 때.

  7. 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: 스레드 정보 출력 및 선택.
  8. 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
  9. Swift에서 프로토콜(Protocol)이란 무엇이며, 어떻게 활용하나요?
    • 프로토콜의 요구사항은 무엇인가요?
    • 프로토콜 확장(Protocol Extension)을 사용하는 이유는 무엇인가요?
    • 프로토콜 지향 프로그래밍(Protocol-Oriented Programming)의 장점은 무엇인가요?
  10. Swift의 접근 제어자(Access Control Levels)에 대해 설명해주세요.
    • open과 public의 차이점은 무엇인가요?
    • internal, fileprivate, private의 사용 시기는 어떻게 결정하나요?
    • 접근 제어자를 사용하는 이유는 무엇인가요?
  11. iOS 앱에서 네트워크 통신을 하는 방법에는 어떤 것들이 있나요?
    • URLSession의 기본 사용 방법을 설명해주세요.
    • 네트워크 요청 시 에러 처리는 어떻게 하나요?
    • 서드파티 라이브러리(예: Alamofire)를 사용하는 이유는 무엇인가요?
    • 더보기
      https://chanhhh.tistory.com/247

      url을 사용해서 네트워크 요청을 생성한뒤, 작업을 실행합니다. 사용자 정의 설정을 위해 세션 설정을 사용합니다.

      에러 핸들링으로 따로 처리를 할 수 있습니다.
      또는 http 상태 코드에 따라 적절한 로직을 추가 할 수도 있습니다.

      alamofire를 사용하는 이유는 urlsession보다 코드 작성이 간단하며 가독성이 좋습니다.
      보다 추상화 되어있으며, 요청관리가 자동화되어 있습니다. 
  12. 의존성 관리 도구(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. 커뮤니티 및 생태계 활용: 수많은 라이브러리와 도구를 쉽게 통합하여 프로젝트 개발 속도를 높임.
  13. 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
  14. 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 브랜치에 작은 단위의 작업을 병합
  15. Swift의 에러 처리 방법에 대해 설명해주세요.
  16. 메모리 관리에서 강한 참조(Strong Reference)와 약한 참조(Weak Reference)의 차이점은 무엇인가요?
    • 순환 참조(Retain Cycle)가 발생하는 경우와 해결 방법은 무엇인가요?
    • 클로저에서 [weak self]와 [unowned self]의 차이는 무엇인가요?
  17. iOS 앱에서 Multi-threading을 구현하는 방법은 무엇인가요?
    • DispatchQueue와 OperationQueue의 차이점은 무엇인가요?
    • 동시성 프로그래밍에서 Race Condition을 방지하는 방법은 무엇인가요?
    • 메인 스레드에서 UI 업데이트를 해야 하는 이유는 무엇인가요?
  18. UIKit에서 TableView와 CollectionView의 차이점은 무엇인가요?
    • 셀(Cell)의 재사용(Reusability)은 어떻게 구현되나요?
    • 동적인 셀 높이(Dynamic Cell Height)를 설정하는 방법은 무엇인가요?
    • CollectionView의 레이아웃을 커스터마이징하는 방법은 무엇인가요?
    •  
  19. ARC(Automatic Reference Counting)의 동작 원리는 무엇인가요?
    • Retain Cycle이 발생하지 않도록 방지하는 방법은 무엇인가요?
    • deinit 메서드는 언제 호출되며, 어떤 역할을 하나요?
  20. 상속(Inheritance)과 프로토콜(Protocol)의 차이점은 무엇인가요?
    • 클래스 상속을 사용할 때의 장단점은 무엇인가요?
    • 다중 상속(Multiple Inheritance)이 불가능한 이유는 무엇인가요?
    • 프로토콜 준수(Conformance)를 통해 다형성을 구현하는 방법은 무엇인가요?
  21. 사용자 인터페이스(UI) 테스트와 단위(Unit) 테스트의 차이점은 무엇인가요?
    • XCTest 프레임워크를 사용하여 테스트를 작성하는 방법은 무엇인가요?
    • 테스트 주도 개발(TDD)의 장점은 무엇인가요?
    • 의존성 주입(Dependency Injection)을 활용하여 테스트 가능한 코드를 작성하는 방법은 무엇인가요?
  22. Xcode에서 Instruments를 사용하여 앱의 성능을 분석하는 방법은 무엇인가요?
    • Time Profiler를 사용하여 성능 이슈를 찾는 방법을 설명해주세요.
    • Allocations Instrument를 사용하여 메모리 누수를 탐지하는 방법은 무엇인가요?
    • Leaks Instrument를 사용하여 메모리 누수를 찾는 방법은 무엇인가요?
  23. Swift의 제네릭(Generic)에 대해 설명해주세요.
    • 제네릭을 사용하는 이유는 무엇인가요?
    • 제네릭 타입 파라미터와 제약 조건을 설정하는 방법은 무엇인가요?
    • 제네릭을 사용할 때의 장점과 주의할 점은 무엇인가요?
  24. Swift의 클로저와 함수의 차이점은 무엇인가요?
    • 클로저가 일급 객체(First-Class Citizen)인 이유는 무엇인가요?
    • 함수형 프로그래밍 패러다임에서 클로저가 어떻게 활용되나요?
  25. 동시성 프로그래밍에서 동기(Synchronous)와 비동기(Asynchronous)의 차이점은 무엇인가요?
    • iOS에서 비동기 작업을 처리하는 방법은 무엇인가요?
    • 세마포어(Semaphore)와 뮤텍스(Mutex)의 차이점은 무엇인가요?
  26. GCD(Grand Central Dispatch)의 주요 개념과 사용 방법을 설명해주세요.
    • 직렬(Serial) 큐와 동시(Concurrent) 큐의 차이는 무엇인가요?
    • 글로벌 큐(Global Queue)와 메인 큐(Main Queue)는 어떻게 다르나요?
    • DispatchWorkItem을 사용하는 방법은 무엇인가요?