iOS

[iOS] 2025.02.25 비동기 프로그래밍 / 제네릭

ioskkt 2025. 2. 25. 17:53

비동기 프로그래밍 / 제네릭

 

비동기 프로그래밍

1. 비동기 프로그래밍 :

  • 작업을 동시에 실행하거나, 완료 여부를 기다리지 않고 다음 작업을 수행할 수 있는 프로그래밍 방식.
  • iOS에서는 주로 GCD(Grand Central Dispatch)와 비동기 메서드를 사용.

 

2. 동기 vs 비동기

  • 동기(Synchronous) : 작업이 완료될 때까지 대기.
  • 비동기(Asynchronous) : 작업 완료를 기다리지 않고 바로 다음 작업 실행.

 

3. GCD의 주요 큐 :

  • Main Queue : UI 작업을 처리.
  • Global Queue : 백그라운드 작업 처리.
  • Custom Queue : 사용자 정의 작업 큐.
  • 비동기 프로그래밍 예제

DispatchQueue.global().async {
    print("비동기 작업 실행")
    DispatchQueue.main.async {
        print("UI 업데이트")
    }
}

 

제네릭(Generic)

1. 제네릭 :

  • 코드의 유연성과 재사용성을 높이기 위해, 타입에 의존하지 않는 코드를 작성하는 방법.
  • 같은 로직을 다양한 타입에서 사용할 수 있도록 함.

 

2. 제네릭 함수

  • 하나의 함수로 여러 타입을 처리.

func swapValues<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}

* T : 제네릭 타입 -> 어떤 데이터 타입이든 사용 가능.

* inout : 입력 값 변경 가능 -> 함수 내에서 값을 변경할 수 있도록 허용.

* a 값을 temp에 임시 보관, b 값을 a에 대입, temp에 보관했던 a값을 b에 대입.

* & 연산자 : inout 매개변수를 사용하려면 참조 전달을 위해 &를 붙여야 함.

* 제네릭을 활용하면 어떤 데이터 타입이든 교환 가능.

 

3. 제네릭 타입

  • 구조체, 클래스, 열거형에서 제네릭을 활용 가능.

 

 

직접 구현해보기

Step 1 : 비동기 프로그래밍  구현

1. 비동기 데이터 처리 :

DispatchQueue.global()을 사용하여 백그라운드에서 숫자를 1부터 5까지 출력한 후, Main Queue에서 "UI 업데이트 완료"를 출력하세요.

* 백그라운드에서 무거운 작업을 실행하면서 UI를 멈추지 않기 위해.

* UI 업데이트는 반드시 메인 스레드에서 실행해야 하므로 DispatchQueue.main.async 사용

* 비동기 작업을 사용하면 앱이 더 부드럽고 빠르게 동작함.

 

2. 네트워크 시뮬레이션 :

  • DispatchQueue 를 사용해 다음을 구현하세요
  • 3초간 데이터를 로드하는 작업을 비동기로 수행.
  • 작업 완료 후, "데이터 로드 완료" 메시지를 메인 큐에서 출력.

* 기존방식도 가능했고, chat gpt가 알려준 방법도 가능했음.

* chat gpt 방식이 깔끔해 보이나, 맨위 loadData의 역할이 무엇인지 잘 모르겠음...

(화면을 보여주기 전에 필요한 데이터를 미리 로드하거나, 뷰에 필요한 정보를 설정하는 등의 역할을 한다고 함.)

(네트워크에서 데이터를 받아오거나 DB에서 정보를 로드하는 작업이 될 수 있음.)

 

Step 2 : 제네릭 구현

1. 제네릭 함수 작성:

  • 두 값을 교환하는 제네릭 함수 swapValues<T>를 작성하세요.

 

2. 제네릭 스택 구현 :

  • Stack<T> 구조체를 작성하고 다음 기능을 구현하세요
  • push(_:) 스택에 요소 추가.
  • pop() 스택에서 요소 제거.
  • 스택의 현재 상태를 출력하는 메서드.