Swift TIL(24)

웰디(Well-D)·2023년 9월 11일
0

Sweet & Soft, SWIFT

목록 보기
22/76

예습

swift 5.5부터 도입된 async await 문법을 배웠다.
pyramid of Doom 을 방지하고자 조금 더 개선된 문법이라고 한다. 사실 Js에서 쓰던 패턴을 그대로 도입했다고 해서 키워드자체가 낯설진 않았다.
하지만 아무래도 새로도입되었다보니 기존의 DispatchQueue.global()과 클로져, 콜백함수를 통한 비동기 함수 구현을 더 잘 이해해야 할 것 같다.

동시성프로그래밍의 문제점 두가지

  • 경쟁상황/ 경쟁조건
    같은 데이터/힙영역(공유가능한 영역임)을 서로다른 쓰레드가 동시에 접근할때
    => 메모리를 사용하는 동안에는 동시에 여러쓰레드에서 접근하지 못하도록 lock을 하는 방법(Thread-safe처리) 로 해결가능
    단 이때 또 생길수있는 문제점이 하나 더 있다.
  • 교착상태 (deadlock)
    다른 쓰레드에서 해당 데이터/힙영역의 요소를 선점, 잠궈버렸기 때문에 다른쓰레드에서 해당 요소에 접근조차 불가하여 일이 종료되지 않는 현상 / 총체적 난국으로 상호접근시 각 쓰레드의 매서드들이 일을 종료하지 못해 앱이 꺼질수도 있다.

또다른 해결법 (일반적임)

  • 동시큐에서 직렬큐로 보내기
    데이터/힙영역에 접근하려는 함수들을 직렬Queue로 보내는 것이다. => 직렬큐는 메인이 아닌 다른 하나의 쓰레드만 사용하므로 해당 쓰레드에 순서가 자동부여 되는 특징이 있기 때문에 가능한 해결책

예를들어 array에 반복적으로 접근해서 append 하려고 할때 비동기로만 돌리게 되면 일부요소가 유실된 채로 (append하지못한 요소발생)될수있다. 이때 내부에 직렬큐 async 를 만들어 그 안에서 append함수를 돌려주면 해결가능해진다.

제네릭문법

(복습) inout 파라미터 => 함수외부의 변수를 함수내부에서 변경가능하도록 값복사가 아닌참조스타일을 사용하고자 할때 함수정의시에는 inout키워드를, 호출시에는 &키워드를 사용한다.

  • 사용법
    함수명 바로뒤 타입파라미터 를 기입, 원래 타입위치에는 T를 기입
    구조체,클래스,함수,열거형 모두 다 제네릭 타입 선언가능
    이렇게 선언한 후에는 함수 내부에서 파라미터, 리턴타입으로도 사용 가능하다 (T)

제네릭확장시 주의점

원본에만 타입파라미터를 선언하므로, 확장타입에 타입파라미터를 선언하지 않아야한다. 확장형의 내부에서 제네릭타입을 사용만 가능함

타입제약

  • 프로토콜, 클래스 제약시 사용
    해당 프로토콜을 채택한 타입만, 혹은 해당 클래스 상속계층에 속해있는 타입들만 타입으로써 해당 함수내에서 사용가능하다 라는 의미임

프로토콜에서 제네릭 문법의 사용

  • associatedtype Element
    typealias T = 타입명(생략가능)
  • 프로토콜에도 타입제약 적용가능하다

복습

수업리뷰

테스트

첫 테스트 1주차~2주차 내용으로 진행되었다. 아직 어렵지는 않았지만 확실히 코드를 좀더 많이 쳐보고 swift convention을 해치지않는 코드를 작성해야겠다고 느꼈다.
한번 더 개념정리도 되는 것 같아서 좋았다.
특히 표현식 에 대해 하나의 결과값으로 평가되는 문장 이라는 개념을 좀더 명확히 할 수 있었다.

개인적으로 nil-coalescing 문법을 삼항연산자와 살짝헷갈렸던 부분(개념말고 표기할때) 과 random 숫자를 받아서 평균을 구하는 함수를 만드는 부분에서 return 값인 output을 double로 받아줘야하는 부분, 그리고 내부에서도 double/ double 처리해줬어야하는 부분을 못챙겨서 아쉬웠다.

그리고 개인적으로 이 문제는 좀 독특하게(array에 요소를 랜덤숫자 append하고 array의 요소들의 평균을 구하는 식으로.. (자동구현했다고 보면 될듯하다) 했는데 정답코드에 있는부분도 잘 확인해 봐야겠다.

수업

오늘도 수업때 강조할부분을 잘 말씀해주셔서 너무 재밌게 들었다. 특히 열거형이 임시타입의 형태를 가지고 있는 셈이라, 한번 더 재처리 (즉 switch문 처리) 가 필요하다는 부분, 그리고 열거형으로 인스턴스를 생성하는 방법을 case를 선택하는 것으로도 볼수있다는 관점은 내가 미쳐 생각하지 못한부분이라 좋았다.
그리고 사실 return이 없는 함수라고 표현하지만 실제로는 Void라는 빈 튜플을 return하는 것이라는 것

옵셔널타입과, 열거형에서 연관값이 있는경우의 switch 문 사용한 case let 바인딩을 복습해서 좋았다.

case .hardDisk(gb:let GB)

또 최근문법으로 가변파라미터를 한개이상 쓸수있게 된것, 그리고 javascript 처럼 동일한 상수명일때 축약할수 있는 문법이 추가된 것을 알게되었다.
if let 바인딩 코드에서 자주보게될 패턴일듯..!

예) if let num = num
=> if let num

profile
Wellness 잘사는 것에 진심인 웰디입니다. 여러분의 몸과 마음, 통장의 건강을 수호하고싶어요. 느리더라도, 꾸준히

0개의 댓글