머리말


100문 100답 List
100문 100답 List 1~10
100문 100답 List 21~30
100문 100답 List 31~40
100문 100답 List 41~50
100문 100답 List 51~60
100문 100답 List 61~70
100문 100답 List 71~80
100문 100답 List 81~90
100문 100답 List 完

시작.

11. MVC 디자인 패턴은 무엇이고, 어떻게 동작하나요?


MVC(Model-View-Controller) 디자인 패턴은 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다.
소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다.

MVC 패턴의 세 가지 구성 요소

  • 모델: 데이터와 비즈니스 로직을 관리합니다.
  • : 레이아웃과 화면을 처리합니다.
  • 컨트롤러: 모델과 부로 명령을 전달합니다.

MCV 패턴의 동작은 다음과 같습니다.

  1. 사용자는 뷰를 통해 애플리케이션에 입력합니다.
  2. 컨트롤러는 사용자의 입력을 수신하고 모델에 요청을 보냅니다.
  3. 모델은 데이터를 처리하고 뷰에 반환합니다.
  4. 뷰는 모델에서 받은 데이터를 사용하여 화면을 업데이트 합니다.

ex) 고객 정보 관리 애플리케이션

  • 모델: 고객 정보, 고객 데이터베이스 액세스, 고객 정보 처리를 담당
  • : 고객 목록 화면, 고객 정보 편집 화면 담당
  • 컨트롤러: 고객 목록화면에서 고객을 선택하면 해당 고객 정보를 모델에 요청합니다.
    모델에서 받은 데이터를 사용하여 고객 정보 편집 화면을 업데이트합니다.

MVC 패턴의 장점

  • 관심사 분리: 모델, 뷰, 컨트롤러는 각각 서로 다른 책임을 가지고 있습니다.
    이는 코드의 재사용성과 유지 관리성을 향상시킵니다.
  • 테스트 용이성: 모델, 뷰, 컨트롤러는 각각 독립적으로 테스트할 수 있습니다.
    이는 어플리케이션의 안정성을 향상시킵니다.
  • 확장성: 모델, 뷰, 컨트롤러는 각각 독립적으로 확장할 수 있습니다.
    이는 어플리케이션의 기능을 쉽게 확장할 수 있도록 합니다.

MVC 패턴의 단점

  • 모델과 뷰 간의 의존성: 모델과 뷰는 서로 의존성을 가질 수 있습니다.
    이는 애플레케이션 구조가 커질수록 유지보수에 어려움을 줄 수 있습니다.
  • 중복: 모델,뷰,컨트롤러는 각각 서로 다른 책임을 갖고 있지만, 중복되는 코드가 발생할 수 있습니다.

12. CocoaPods와 Swift Package Manager의 차이점은 무엇인가요?


CocoaPodsSwift Package Manager는 모두 iOS,macOS,watchOS,tvOS,Linux
라이브러리 및 프레임워크를 관리하는 데 사용되는 패키지 관리 도구입니다.

공통점

  • 라이브러리 검색 및 설치
  • 라이브러리 버전 관리
  • 의존성 관리

CocoaPods

  • 장점
    • 오래된 역사와 풍부한 라이브러리 지원
    • 동적 라이브러리와 정적 라이브러리 모두 지원
    • 의존성 충돌을 방지하는 기능 제공
  • 단점
    • 초기 설정이 복잡할 수 있음
    • 빌드 속도가 느릴 수 있음

Swift Package Manager

  • 장점
    • Apple에서 직접 개발 및 지원
    • 빌드 속도가 빠름
    • 소스 코드 관리 기능 제공
  • 단점
    • 라이브러리 지원이 CocoaPods에 비해 적을 수 있음
    • 정적 라이브러리만 지원

어떤 도구를 사용해야 할까요?

  • 라이브러리 지원이 풍부하고, 정적 및 동적 라이브러리를 모두 사용해야 하는 경우, CocoaPods를 사용하는 것이 좋습니다.
  • Apple에서 직접 개발 및 지원하는 도구를 사용하고, 빌드 속도가 중요한 경우,
    Swift Package Manager를 사용하는 것이 좋습니다.
  • 소스 코드 관리 기능이 필요한 경우, Swift Package Manager를 사용하는 것이 좋습니다.

요약

기능 CocoaPods Swift Package Manager
개발자 GitHub 커뮤니티 Apple
지원 라이브러리 풍부 적음
라이브러리 유형 동적, 정적 정적
빌드 속도 느림 빠름
소스 코드 관리 지원하지 않음 지원

13. 앱 생명주기에 대해 설명하세요.


앱 생명주기란 앱이 시작되고 종료되기까지의 과정

앱의 상태에 따른 단계

  • 초기화(Launch): 앱이 처음 실행되는 단계
  • 전면(Foreground): 앱이 화면에 표시되고 사용자의 입력을 받을 수 있는 상태
  • 백그라운드(Background): 앱이 화면에 표시되지 않지만 여전히 실행 중인 상태
  • 중단(Suspended): 앱이 백그라운드로 이동하면서 일시 중지된 상태
  • 중료(Terminated): 앱이 완전히 종료된 상태

각 단계에 따른 이벤트

  • 초기화: applicationDidFinishLaunching()
  • 전면: applicationWillEnterForeground(), applicationDidEnterForeground()
  • 백그라운드: applicationWillResignActive(), applicationDidEnterBackground()
  • 중단: applicationWillTerminate()
  • 종료: applicationDidTerminate()

초기화 단계

  • 초기화 단계에서는 앱의 기본 설정과 리소스를 초기화합니다.
  • 앱이 시작될 때 사용자에게 표시할 콘텐츠를 준비합니다.

전면 단계

  • 전면 단계에서는 앱이 화면에 표시되고 사용자의 입력을 받을 수 있습니다.
  • 사용자의 입력에 따라 다음과 같은 작업을 수행할 수 있습니다.
    • 사용자의 입력을 처리
    • 앱의 상태를 업데이트
    • 새로운 컨텐츠를 표시

백그라운드 단계

  • 앱이 화면에 표시되지 않지만 여전히 실행중인 상태입니다.
  • 다음과 같은 작업을 수행할 수 있습니다.
    • 네트워크 작업을 수행
    • 데이터를 백업
    • 알림을 처리

중단 단계

  • 앱이 백그라운드로 이동하면서 일시 중지된 상태입니다.
  • 다음과 같은 작업을 수행할 수 있습니다.
    • 메모리를 해제
    • 중요한 작업을 종료

종료 단계

  • 앱이 완전히 종료된 상태입니다.
  • 다음과 같은 작업을 수행할 수 있습니다.
    • 모든 리소스 해제
    • 사용자에게 알림을 표시

14. ARC(Automatic Reference Counting)이 무엇이고 어떻게 작동하나요?


ARC(Automatic Reference Counting)는 Swift에서 사용되는 메모리 관리 방식입니다.
ARC는 개발자가 메모리를 명시적으로 해제할 필요 없이, 컴파일러가 자동으로 메모리를 해제하도록 합니다.

작동 방식

  • 참조카운트 증가: 클래스 인스턴스를 참조하면 참조 카운트가 1 증가합니다.
  • 참조 카운트 감소: 클래스 인스턴스의 참조가 해제되면 참조 카운트가 1 감소합니다.
  • 메모리 해제: 참조 카운트가 0이 되면 인스턴스가 메모리에서 해제됩니다.

장점

  • 메모리 누수 방지: 개발자가 명시적으로 메모리를 해제하지 않아도 되므로, 메모리 누수를 방지할 수 있습니다.
  • 코드 간결성: 개발자가 메모리 관리 코드를 작성할 필요가 없으므로, 코드가 간결해집니다.
  • 성능 향상: 메모리 해제 작업을 컴파일러가 자동으로 수행하므로, 성능이 향상됩니다.

ARC는 Swift의 기본 메모리 방식이므로, Swift 개발자는 ARC를 사용하여 메모리를 관리해야 합니다.

ARC를 사용하는 방법

  • 클래스 인스턴스를 참조하려면 weak 또는 unowned 키워드를 사용합니다.
  • 클래스 인스턴스의 참조를 해제하려면 nil을 할당합니다.

weak 키워드를 사용하여 클래스 인스턴스를 참조하는 방법

class Person {
  var name: String

  init(name: String) {
    self.name = name
  }
}

weak var person: Person?
person = Person(name: "choi")
//'person'은 'weak' 키워드를 사용하여 참조하므로, 참조 카운트가 증가하지 않습니다.

// `person`의 참조를 해제합니다.
person = nil

weak키워드를 사용하여 person변수를 선언하므로, person의 참조 카운트가 증가하지 않습니다.
따라서, person이 더 이상 참조되지 않더라도 person인스턴스가 메모리에서 해제될 수 있습니다.

unowned 키워드를 사용하여 클래스 인스턴스를 참조하는 방법

class Person {
    var name: String

    init(name: String) {
        self.name = name
    }
}

class MyClass {
    unowned var person: Person!

    init(person: Person) {
        self.person = person
    }

    deinit {
        // `person`이 더 이상 참조되지 않게 되는 경우
        // `person`을 해제합니다.
        person = nil
    }
}

let person = Person(name: "John Doe")
let myClass = MyClass(person: person)

MyClass 클래스가 person 인스턴스를 unowned 키워드를 사용하여 참조합니다. MyClass 클래스의 deinit 메서드에서는 person 인스턴스를 해제하여 댕글링 포인터를 방지합니다.

unowned키워드를 사용하여 안전하게 코드를 작성하려면 다음과 같은 점을 고려해야합니다.

  • person이 더 이상 참조되지 않게 되는 경우 person을 어떻게 처리할 것인지 미리 계획
  • person이 더 이상 참조되지 않게 되는 경우 person을 해제할 수 있는 방법을 제공

요약

ARC(Automatic Reference Counting)은 Swift에서 사용되는 메모리 관리 방식입니다.

  • 클래스 인스턴스를 참조하면 참조 카운트가 1 증가합니다.
  • 참조 카운트가 0이 되면 인스턴스가 메모리에서 해제됩니다.

ARC를 사용하면 메모리 누수를 방지하고 코드를 간결하게 유지하면서 성능을 향상시킬 수 있습니다.

15. Core Data란 무엇이며 어떻게 사용하나요?


Core Data는 iOS,macOS,watchOS,tvOS,그리고ipadOS에서 사용할 수 있는 오브젝트-지향 데이터베이스 프레임워크입니다.
Core Data를 사용하면 애플리케이션의 데이터를 저장하고 관리할 수 있습니다.

Core Data의 주요 기능

  • 객체 지향 데이터 모델: Core Data는 객체 지향 데이터 모델을 사용하여 데이터를 저장합니다.
    데이터 모델은 애플리케이션의 데이터 구조를 정의합니다.
  • 데이터 베이스: Core Data는 Apple의 Foundation 프레임워크에 포함된 Core Data API를 사용하여 데이터 베이스를 관리합니다.
  • 데이터 액세스: Core Data는 애플리케이션이 데이터에 액세스할 수 있는 다양한 방법을 제공합니다.

Core Data를 사용하는 절차

  • 1.데이터 모델을 정의합니다.
    • 데이터 모델을 정의하려면 NSEntityDescription클래스를 사용합니다.
    • NSEntityDescription클래스는 데이터 베이스 테이블에 해당하는 객체를 정의합니다.
  • 2.데이터베이스를 생성합니다.
    • 데이터베이스를 생성하려면 NSPresistentStoreCoordinator클래스를 사용합니다.
    • NSPresistentStoreCoordinator클래스는 데이터베이스와 상호 작용하는 데 사용됩니다.
  • 3.데이터를 저장합니다.
    • 데이터를 저장하려면 NSManagerObject클래스를 사용합니다.
    • NSManagerObject클래스는 데이터 베이스의 행에 해당하는 객체를 나타냅니다.
  • 4.데이터를 쿼리합니다.
    • 데이터를 쿼리하려면 NSFetchRequest클래스를 사용합니다.
    • NSFetchRequest클래스는 데이터베이스에서 데이터를 가져오는 데 사용됩니다.

Core Data의 이점

  • 데이터 관리의 단순화: Core Data는 데이터 관리를 단순화합니다.
    개발자는 데이터 모델을 정의하고 데이터 베이스를 생성하기만 하면 됩니다.
    Core Data는 데이터를 저장하고 관리하는 작업을 처리합니다.
  • 데이터베이스 성능 향상: Core Data는 데이터베이스 성능을 향상시킵니다.
    Core Data는 데이터베이스 쿼리를 최적화하고 데이터베이스 작업을 병렬로 실행합니다.
  • 데이터베이스 보안 개선: Core Data는 데이터베이스 보안을 개선합니다.
    Core Data는 데이터베이스 액세스를 제어하고 데이터를 암호화합니다.

요약

Core Data는 애플리케이션의 데이터를 저장하고 관리하기 위한
오브젝트-지향 데이터베이스 프레임워크 입니다.

  • 데이터 모델을 정의하고 데이터 베이스를 생성합니다.
  • 데이터를 저장하고 쿼리합니다.
  • 데이터 관리를 단순화하고 성능을 향상시킵니다.

16. URLSession과 Alamofire의 차이는 무엇인가요?


URL Session과 Alamofire는 모두 iOS앱에서 서버와 통신하는 데 사용할 수 있는
네트워킹 API입니다.

URLSession

URLSession은 Apple에서 제공하는 기본 네트워킹 API입니다.
URLSession은 매우 유연하고 강력한 API입니다.

  • URLSession 사용 방법
    • URLSessionConfiguration을 생성합니다.
    • URLRequest를 생성합니다.
    • URLSessionTask를 생성하고 실행합니다.

  • URLSession을 사용해야 하는 경우
    • URLSession을 직접 제어하고 싶은 겅우
    • URLSession의 모든 기능을 사용하고 싶은 경우
    • 성능을 최우선으로 생각하는 경우

Alamofire

Alamofire는 URLSession을 기반으로 하는 오픈 소스 라이브러리 입니다.
Alamofire는 URLSession을 사용하기에 더 쉽고 편리하도록 설계되었습니다.

  • Alamofire 사용 방법
    • Alamofire를 프로젝트에 추가합니다.
    • Alamofire의 API를 사용합니다.

  • Alamofire를 사용해야 하는 경우
    • URLSession을 쉽게 사용하고 싶은 겅우
    • URLSession의 모든 기능을 사용하지 않아도 되는 경우
    • 사용 편의성을 최우선으로 생각하는 경우

요약

특성 URLSession Alamofire
제공자 Apple 오픈 소스
사용 용이성 어려움 용이함
기능 유연하고 강력함 사용하기 쉬움
성능 Alamofire가 약간 더 빠름  

17. Auto Layout이란 무엇이며 왜 사용하나요?


Auto Layout은 iOS,macOS,watchOS,tvOS, 그리고 iPadOS에서 사용할 수 있는 레이아웃 시스템입니다.
Auto Layout을 사용하면 애플리케이션의 뷰가 다양한 디스플레이 크기와 방향에 맞게 자동으로 조정됩니다.

Auto Layout의 주요 기능

  • 뷰의 크기와 위치를 지정합니다.
    • 뷰의 크기와 위치를 지정하려면 constraints를 사용합니다.
    • constraints는 뷰의 크기와 위치를 제한하는 조건ㄴ입니다.
    • 예를 들어, view.leadingAnchor.constraint(equalTo: superview.leadingAnchor)viewleadingAnchorsuperviewleadingAnchor와 같도록 제한하는 constrinat입니다.
  • 뷰의 관계를 정의합니다.
    • 뷰의 관계를 정의하려면 constriant를 사용하여 뷰 간의 관계를 지정합니다.
    • 예를 들어, view1.leadingAnchor.contraint(equalTo: view2.trailingAnchor)view1leadingAnchorview2trailingAnchor와 같도록 제한하는 constraint입니다.
  • 뷰가 다양한 디스플레이 크기와 방향에 맞게 조정됩니다.
    • 뷰가 다양한 디스플레이 크기와 방향에 맞게 조정되는지 확인하려면 constraintlayoutIfNeeded()메서드로 적용합니다.
    • layoutIfNeeded()메서드는 constraints를 적용하고 view를 다시 레이아웃합니다.

Auto Layout의 이점

  • 애플리케이션의 뷰가 다양한 디스플레이 크기와 방향에 맞게 자동으로 조정됩니다.
  • 코드가 간결해집니다.
  • 레이아웃을 유지하기 더 쉽습니다.

요약

Auto Layout은 애플리케이션의 뷰가 다양한 디스플레이 크기와 방향에 맞게 자동으로 조정되는
레이아웃 시스템입니다.

  • 뷰의 크기와 위치를 지정하고, 뷰 간의 관계를 정의합니다.
  • 코드가 간결해지고 레이아웃을 유지하기가 더 쉽습니다.

18. 뷰 컨트롤러 생명주기에 대해 설명하세요.


뷰 컨트롤러 생명주기란 뷰 컨트롤러가 생성되고, 화면에 나타나고, 화면에서 사라지는 일련의 과정을 말합니다.
뷰 컨트롤러 생명주기 동안 뷰 컨트롤러는 다양한 이벤트를 처리해야 합니다.

뷰 컨트롤러 생명주기 단계

  • viewDidLoad: 뷰 컨트롤러가 처음으로 생성될 때 호출됩니다.
    이 단계에서 뷰 컨트롤러는 뷰를 초기화하고, 데이터를 로드하고, 기타 초기화 작업을 수행합니다.
  • viewWillAppear: 뷰 컨트롤러가 화면에 나타나기 직전에 호출됩니다.
    이 단계에서 뷰 컨트롤러는 뷰를 준비하고, 사용자와 상호 작용할 준비를 합니다.
  • viewDidAppear: 뷰 컨트롤러가 화면에 나타난 후 호출됩니다.
    이 단계에서 뷰 컨트롤러는 뷰가 화면에 표시된 후 필요한 작업을 수행합니다.
  • viewWillDisappear: 뷰 컨트롤러가 화면에서 사라지기 직전에 호출됩니다.
    이 단계에서 뷰 컨트롤러는 뷰를 정리하고, 사용자 와의 상호 작용을 종료합니다.
  • viewDidDisappear: 뷰 컨트롤러가 화면에서 사라진 후 호출됩니다.
    이 단계에서 뷰 컨트롤러는 뷰가 화면에서 사라진 후 필요한 작업을 수행합니다.

뷰 컨트롤러 생명주기의 각 단계에서 호출되는 메서드

단계 메서드 설명
생성 init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) throws 뷰 컨트롤러를 생성합니다.
초기화 viewDidLoad() 뷰 컨트롤러를 초기화합니다.
화면에 나타남 viewWillAppear(_ animated: Bool) 뷰 컨트롤러를 화면에 나타냅니다.
화면에 나타남 완료 viewDidAppear(_ animated: Bool) 뷰 컨트롤러가 화면에 나타났습니다.
화면에서 사라짐 viewWillDisappear(_ animated: Bool) 뷰 컨트롤러를 화면에서 사라지게 합니다.
화면에서 사라짐 완료 viewDidDisappear(_ animated: Bool) 뷰 컨트롤러가 화면에서 사라졌습니다.

뷰 컨트롤러 생명주기가 각 단계별로 수행하는 작업

  • 생성 단계: 뷰 컨트롤러의 인스턴스를 생성하고, 뷰 컨트롤러의 속성을 초기화 합니다.
  • 초기화 단계: 뷰 컨트롤러의 뷰를 초기화하고, 데이터를 로드합니다.
  • 화면에 나타남 단계: 뷰 컨트롤러의 뷰를 화면에 표시하고, 사용자와 상호 작용할 준비를 합니다.
  • 화면에 나타남 완료 단계: 뷰 컨트롤러가 화면에 표시되었음을 확인하고, 필요한 작업을 수행합니다.
  • 화면에서 사라짐 단계: 뷰 컨트롤러의 뷰를 화면에서 사라지게 하고, 사용자와의 상호 작용을 종료합니다,
  • 화면에서 사라짐 완료 단계: 뷰 컨트롤러가 화면에서 사라졌음을 확인하고, 필요한 작업을 수행합니다.

뷰 컨트롤르 생명주기를 이해하면 뷰 컨트롤로를 보다 효율적으로 관리하고,
애플리 케이션의 성능을 향상시킬 수 있습니다.

19. UIViewController의 viewDidLoad와 viewWillAppear의 차이는 무엇인가요?


특성 viewDidLoad viewWillAppear
호출 시점 뷰 컨트롤러가 처음으로 생성될 때 뷰 컨트롤러가 화면에 나타나기 직전에
수행할 작업 뷰를 초기화하고, 데이터를 로드하고, 기타 초기화 작업을 수행합니다. 뷰를 준비하고, 사용자와 상호 작용할 준비를 합니다.

viewDidLoad에서 수행할 수 있는 일반적인 작업 뷰의 속성을 초기화합니다. 뷰의 레이아웃을 설정합니다. 뷰에 컨트롤을 추가합니다. 데이터를 로드합니다.
viewWillAppear에서 수행할 수 있는 일반적인 작업 뷰의 상태를 업데이트합니다. 뷰의 애니메이션을 설정합니다. 사용자 입력을 처리합니다.  

예문

override func viewDidLoad() {
  super.viewDidLoad()

  // 텍스트 필드의 속성을 초기화합니다.
  textfield.text = ""
  textfield.placeholder = "텍스트를 입력하세요."
}

viewDidLoad메서드에서 텍스트 필드의 속성을 초기화할 수 있습니다.

override func viewWillAppear() {
  super.viewWillAppear(animated)

  // 텍스트 필드의 상태를 업데이트합니다.
  textfield.text = "Hello, World!"
}

viewWillAppear메서드에서 텍스트 필드의 상태를 업데이트할 수 있습니다.

20. iOS에서 멀티스레딩을 위한 방법은 무엇이 있나요?


GCD(Grand Central Dispatch)

  • iOS에서 기본으로 제공되는 멀티스레딩 프레임워크 입니다.
  • GCD는 다양한 작업을 스레드로 분산하여 처리할 수 있도록 도와줍니다.
  • 간단하고 사용하기 쉽고, 성능이 뛰어나다는 장점이 있습니다.

image

OperationQueue

  • GCD를 기반으로 하는 멀티스레딩 프레임워크입니다.
  • OperationQueue는 작업을 스레드 큐에 추가하여 처리할 수 있도록 도와줍니다.
  • GCD와 유사하지만, 작업을 보다 쉽게 관리할 수 있도록 도와줍니다.
  • 작업을 순서대로 처리하거나, 병렬로 처리하거나, 지연시켜 처리할 수 있습니다.

image

NSThread

  • iOS에서 제공하는 기본 스레드 클래스입니다.
  • NSThread를 사용하여 직접 스레드를 생성하고 관리할 수 있습니다.
  • 직업 스레드를 생성하고, 스레드의 우선순위를 설정하고, 스레드의 실행을 제어할 수 있습니다.

image

멀티 스레딩을 사용할 때 고려해야 할 사항

  • 스레드의 안전성
    • 스레드가 공유 자원에 접근할 때는 스레드의 안전성을 고려해야합니다.
    • 스레드의 안전성을 보장하기 위해서는 동기화 기법을 사용해야 합니다.

  • 스레드의 병목현상
    • 스레드가 너무 많아지면 병목 현상이 발생할 수 있습니다.
    • 병목 현상을 방지하기 위해서는 스레드의 수를 적절하게 조절해야 합니다.









다음에 계속


100문 100답 List에서 11~20번까지의 질문에 대한 답변입니다.
틀린 답변이 있거나 더 좋은 답변이 있다면 댓글 남겨주시면 적극 반영하겠습니다.
다들 화이팅 입니다.

100문 100답 List 1~10
100문 100답 List 21~30
100문 100답 List 31~40
100문 100답 List 41~50
100문 100답 List 51~60
100문 100답 List 61~70
100문 100답 List 71~80
100문 100답 List 81~90
100문 100답 List 完

이상.