3. A Swift Tour (3)

문인범·2023년 10월 10일

Swift

목록 보기
4/9

3번째 시간
오늘 볼 내용이 제일 어려웠고 양도 많아 더 공부를 해봐야 할 것이다.
열심히 해보자!🔥🔥🔥

Concurrency (동시성)

프로젝트를 진행을 하면서, 그 중에 특히 API를 호출할 때에 비동기를 많이 들어봤을 것이다. 근데 이 비동기라는게 무엇이냐??
우선 동기에 대해 뭔지 한번 알아보자!

동기 vs 비동기

동기 (Synchronous)

일단 사전적 뜻을 보면 이런 뜻이다.
여기서 동시에 발생한다는 말은 여러가지 일이 동시에 발생한다는 말이 아닌, 요청과 응답이 동시에 발생한다는 뜻이다. 그 말은 즉 요청의 응답이 올 때 까지 다른 작업은 진행할 수 없다는 것이다.
쉽게 예를 들어, 1인 피자집을 갔다고 가정해보자.

  1. 주문을 받는다.
  2. 피자 도우를 만든다.
  3. 소스를 바르고 토핑을 올린다.
  4. 피자를 굽는다.
  5. 포장후 제공한다.

해당 과정들을 사장님 혼자서 진행하므로 주문을 받는 과정(요청)이 끝나고 주문이 들어가기 전(응답) 까지는 사장님은 다음 과정을 진행할 수 없다!
그러므로 앞에 작업이 끝난 후, 뒤에 작업이 시작되고 그 작업이 끝나면 또 다음 작업이 시작되는 형태로 작업이 진행된다.

이런 방식은 우리가 보통 짜는 코드들이 이렇게 진행된다.
그런데 생각해보면 너무 비효율적이라는 생각이 든다.

사람 한,두명만 더 써서 일을 동시에 진행하면 되지 않을까라는 생각이 든다.

비동기 (Asynchronous)


동시에 발생하지 않는다는 뜻이다. 위에서 본 것과 같이 요청과 호출이 동시에 발생하지 않는다. 즉, 요청을 하고 응답을 기다리지 않고 다음 과정을 진행하는 것이다.
피자집에서 주문을 받는 동시에 도우를 실시간으로 만들 수 있는 것이다.
그러면 시간이 효율적으로 줄어들지 않을까??

우리가 짜는 코드들도 이런 방식으로 진행시킬 수 있다.
이런 코드가 있다.
기존의 일떄는 위의 for문이 끝난 후 아래 for문이 진행이 될 것이다.
하지만 비동기 작업을 활용하면 위 for문 작업을 진행함과 동시에 아래 for문의 작업도 같이 진행이 된다!

사용법

스위프트에서는 Dispatch queueasync & await을 사용하여 비동기함수를 만들 수 있다.
Dispatch queue는 옛날부터 사용해오던 방식이라고 알고 있고 async & await은 Dispatch queue의 불편한 점을 해소하기 위해 새로 나온 문법이라고 나와있다.
Dispatch queue는 나중에 알아보고 이보다 최근에 나온 async & await을 사용해보자!



비동기로 실행되는 함수를 만들기 위해서는 함수에 async 키워드를 추가하면 된다. 그리고 이 비동기 함수를 호출하기 위해 await을 사용한다.
이 때 비동기 함수를 호출하는 함수도 async를 붙여주어야 한다.

또한 여러개의 비동기 함수를 병렬적으로 처리하기 위해 async let을 사용할 수 있다. 이렇게 호출한 비동기 함수들을 await을 통해 반환값을 사용할 수 있다.

Task를 이용해 동기 코드에서 비동기 함수를 호출할 수 있다.

Task group을 통해 동시성(Concurrency) 코드를 작성할 수 있다.

Actor를 이용하여 동일한 인스턴스의 안전한 상호작용을 보장할 수 있다. 클래스와 유사하게 사용이 가능하다.

공부해야 할 것

이 쪽을 보면서 모르는 것들을 검색해보니 내용이 상당히 많고 시간을 많이 투자해야 하는 분야인거같다. 그래서 대략적으로 스위프트 투어에 있는 내용을 그대로 올렸고 나중에 다시 공부를 시작해보겠다!



프로토콜과 확장(Protocols and Extensions)

프로토콜(Protocol)

앞서 클래스를 살펴볼 때 상속에 대해 얘기를 했었다. 클래스의 주요기능중 하나인 상속은 재사용면에 있어 상당히 편리한 기능이지만, 클래스간에 결합도를 높이기 때문에 오히려 객체지향에 반대되는 방향이다.

그래서 상속보다는 프로토콜을 채택함으로써 더욱 유연하게 객체를 만들 수 있다. 자바의 인터페이스와 비슷한 역할을 한다고 볼 수 있다.

상속: is a 관계
프로토콜: has a 관계

프로토콜을 채택함으로써 해당 클래스에 프로토콜을 준수하게 만든다.
(프로토콜에 있는 함수를 무조건 구현해야 한다는 말)

스위프트에서 프로토콜은 클래스의 상속과 달리 다중으로 채택이 가능하며, 상속은 클래스끼리만 가능하지만 프로토콜은 클래스, 열거형, 구조체 전부 채택이 가능하다는 차이점이 있다.

사용법

protocol (프로토콜 명) { ... }

상속과 비슷하게 : 을 이용해 채택을 할 수 있다.
채택을 할 경우 채택을 한 프로토콜을 준수해야 한다. (해당 프로토콜에 있는 것들을 직접 구현해야 한다는 말입니다.)

구조체에 경우 메소드를 이용해 자신의 프로퍼티를 수정할 수 없다.(immutable)
그래서 자신의 프로퍼티를 수정하는 메소드를 만들때는 mutating 키워드를 이용해 만들 수 있다.


이렇게 프로토콜에 mutating 을 추가해주고 그 프로토콜을 채택하는 구조체에서도 똑같이 구현하면 해결이 가능하다!



확장 (Extension)

또한 기존에 존재하는 타입에 extension 키워드를 통해 프로토콜을 채택하여 수평적인 확장을 할 수 있다.


기존 Int 타입에 메소드가 확장된 것이므로 똑같이 .을 통해 접근이 가능하다.

profile
월클 개발자를 향한 도전일지

0개의 댓글