1. Swift의 동시성(Concurrency) 프로그래밍에 대해 설명해주세요.

    1. Grand Central Dispatch(GCD)의 주요 개념과 사용 방법을 설명해주세요.
      • Queue를 기반으로 한 비동기 실행 모델
      • Dispatch Queues: 작업을 실행하기 위해 GCD가 사용하는 대기열. 추가된 순서대로 작업을 실행하지만, 작업이 완료되는 순서는 다를 수 있음
        • Serial Dispatch Queue: 한번에 하나의 작업만 실행. 작업이 완료된 후 다음 작업 시작.
        • Concurrent Dispatch Queue: 여러 작업을 동시에 실행. 작업의 시작 순서는 보장되지만 완료 순서는 보장되지 않음
      • Main Dispatch Queue: UI를 업데이트하는 작업을 위한 serial queue
      • Global Dispatch Queue: 앱 전역에서 사용할 수 있는 사전정의 된 Concurrent Dispatch Queue. 우선순위로 구성됨
    2. OperationQueue와 DispatchQueue의 차이점은 무엇인가요?
      • 추상화 수준
        • OperationQueue: 고수준의 추상화, 작업 관리와 관련된 풍부한 기능 제공
        • DispatchQueue: 저수준의 API. 성능 최적화와 세밀한 작업 실행에 적합
      • 작업 관리
        • OperationQueue: 작업의 의존성 관리, 취소, 우선순위 설정 등 복잡한 작업 관리 기능을 제공
        • DispatchQueue: 직접 구현 해야함
      • 복잡한 비동기 작업이나 작업간 의존성이 있는 경우 OperationQueue를, 간단한 비동기 작업이나 성능이 중요한 경우 DispatchQueue를 사용
    3. 동시성 프로그래밍에서 발생할 수 있는 문제(Race Condition, Deadlock 등)와 해결 방법은 무엇인가요?
      • Race Condition
        • 두 개 이상의 프로세스나 스레드가 데이터에 동시에 접근하려고 할 때, 접근 순서에 따라 실행 결과가 달라지는 것
        • 해결방법: Mutex, Semaphore, Monitor 같은 동기화 기법을 사용하여 공유 데이터에 대한 접근을 제어
      • Deadlock
        • 두 개 이상의 프로세스나 스레드가 서로가 보유한 자원의 해제를 무한히 기다리는 상태로, 어떤 프로세스도 다음 작업을 진행할 수 없는 상태
        • 해결방법:
          • 자원 할당 순서를 고정하여 순환 대기 조건 방지,
          • 타임아웃을 사용해 일정 시간이 지나면 자원을 강제로 해제,
          • 자원을 요청할 때 다른 모든 필요한 자원을 한꺼번에 요청하고, 사용 후에는 모두 동시 해제
  2. 객체지향 프로그래밍(OOP)의 주요 개념에 대해 설명해주세요.

    1. 캡슐화(Encapsulation)와 정보 은닉(Information Hiding)의 차이점은 무엇인가요?

      • 캡슐화
        • 데이터와 메서드를 하나의 단위로 묶는 것
        • 객체의 인터페이스를 통한 상호 작용을 강조
      • 정보 은닉
        • 시스템의 특정 부분이나 구현 세부 사항을 외부에서 볼 수 없도록 숨기는 방법론
        • 캡슐화를 통해 달성될 수 있으며 주로 접근제어자를 사용해 구현
    2. 상속(Inheritance)의 장단점은 무엇인가요?

      • 장점
        • 코드 재사용: 공통된 로직을 부모 클래스에 정의하고, 여러 자식 클래스가 이를 재사용할 수 있게 함
        • 확장성: 새로운 기능이나 속성을 추가할 때, 기존 클래스를 수정하지 않고 상속을 통해 확장
        • 계층적 분류
        • 다형성 기반: 부모 클래스 타입의 참조를 사용해 다양한 자식 클래스의 객체를 참조하고 처리
      • 단점
        • 강한 결합: 부모 클래스의 변경이 모든 자식 클래스에 영향을 미쳐 예상치 못한 버그를 초래할 수 있음
        • 재사용성의 제한: 수직적 관계만 허용. 여러 클래스간 공유가 필요하다면 상속보다는 구성이나 인터페이스를 사용하는 것이 더 유연할 수 있음
        • 상속 남용: 과도하게 사용시 코드의 복잡도가 증가하고 설계가 잘못된다면 수정이 어려울 수 있음
        • 불필요한 메서드 상속: 자식클래스에 불필요한 메서드가 포함될 수 있음
    3. 다형성(Polymorphism)을 활용하는 예시를 들어주세요.

      상속을 통한 다형성. 상속받은 메서드는 필요에 따라 오버라이드 할 수 있으며, 이를 통해 다형성을 구현할 수 있음

      class Animal {
          func makeSound() {
              print("동물이 소리를 냅니다.")
          }
      }
      
      class Dog: Animal {
          override func makeSound() {
              print("멍멍!")
          }
      }
      
      class Cat: Animal {
          override func makeSound() {
              print("야옹~")
          }
      }
      
      // 다형성을 활용한 함수
      func letAnimalMakeSound(animal: Animal) {
          animal.makeSound()
      }
      
      let dog = Dog()
      let cat = Cat()
      
      letAnimalMakeSound(animal: dog)  // 출력: 멍멍!
      letAnimalMakeSound(animal: cat)  // 출력: 야옹~
      
  3. 프로토콜 지향 프로그래밍(POP)이란 무엇이며, 어떤 장점이 있나요?

    1. 프로토콜 확장(Protocol Extension)을 사용하는 이유는 무엇인가요?
    2. 프로토콜 컴포지션(Protocol Composition)은 어떤 경우에 사용하나요?
    3. 프로토콜과 제네릭(Generic)을 함께 사용하면 어떤 이점이 있나요?
  4. iOS 앱의 메모리 관리는 어떻게 이루어지나요?

  5. 싱글톤 패턴(Singleton Pattern)이란 무엇이며, 어떤 경우에 사용하나요?

  6. Swift의 문자열(String) 다루기와 관련된 주요 기능은 무엇이 있나요?

  7. Codable 프로토콜은 무엇이며, 어떻게 사용하나요?

  8. iOS 앱에서 의존성 주입(Dependency Injection)은 어떤 목적으로 사용되나요?

  9. 델리게이션 패턴(Delegation Pattern)과 클로저의 차이점은 무엇인가요?

  10. UIKit에서 테이블 뷰(UITableView)와 컬렉션 뷰(UICollectionView)의 차이점은 무엇인가요?

  11. iOS 앱 아키텍처 패턴 중 MVC, MVVM, VIP, MVI의 차이점은 무엇인가요?

  12. Swift에서 옵셔널(Optional)을 사용할 때 주의할 점은 무엇인가요?

  13. iOS 앱에서 코어 애니메이션(Core Animation)을 사용하는 방법은 무엇인가요?

  14. Swift에서 프로토콜 지향 프로그래밍(Protocol-Oriented Programming)을 활용하는 방법은 무엇인가요?

  15. iOS 앱에서 네트워크 요청 시 응답 캐싱(Response Caching)을 하는 방법은 무엇인가요?

  16. Combine 프레임워크란 무엇이며, 어떤 기능을 제공하나요?

  17. Swift의 제네릭(Generic)에 대해 설명해주세요.

  18. iOS 앱에서 로컬 푸시 알림(Local Push Notification)을 구현하는 방법은 무엇인가요?

  19. iOS 앱에서 SwiftUI와 UIKit을 함께 사용하는 방법은 무엇인가요?

  20. Swift에서 키 경로(Key Path)란 무엇이며, 어떻게 사용하나요?