분류 전체보기
[Swift] 옵셔널(Optional) ?
Swift가 가지고 있는 가장 큰 특징 중 하나가 옵셔널(Optional)이다. 값이 없는데 접근을 하면 어떻게 될까 만약 값이 없는데 값에 접근한다면 에러가 발생한다. 옵셔널은 직역하면 "선택적인"이라는 뜻이 되는데, 값이 있을 수도, 없을 수도 있다는 의미이다. 만약 문자열이 있다고 하면 "가나다"가 될것이다 만약 값이 없다고 하면 ""도 아닌 그저 값이 없다는 것이다. 이런 값 없음을 나타내는 게 바로 nil이다. nil: 값이 없음을 표현하는 키워드 값 없음을 표현하는 nil을 아무 변수에 사용할 수 있는것은 아니다. 옵셔널 변수에 사용해야 한다. 옵셔널 변수를 선언할 때에는 타입 어노테이션에 ? 를 붙여야 한다. 옵셔널로 선언된 변수와 옵셔널이 아닌 변수는 다르다. 옵셔널이 아닌 변수를 옵셔널 ..
[Swift] Result Type
💥 Result 타입 Swift5.0에서 추가된 Result Type는 새롭게 추가된 에러처리 방법이다. Result를 이해하기 위해선 열거형(Enum), 연관값(Associated Value), 제네릭(Generic)을 이해하고 있어야 한다. 에러가 발생하는 경우, 에러를 따로 외부로 던지는 것이 아니라 리턴타입 자체를 Result Type으로 구현해서 함수 실행의 성공과 실패 정보를 함께 담아서 리턴한다. 타입 하나에 정상적인 경우, 에러를 담을 수 있게 구현됨. 기존의 에러처리인 경우 불편한 점이 있다. 에러가 발생하는 경우와 정상적인 경우를 따로 처리해야하고, do catch블럭으로 감싸서 처리해야한다. ❓ Result타입의 구현 Result 타입은 열거형으로 구현되어있다. enum Result ..
iOS. 동시성 프로그래밍 DeadLock, Race condition 해결방법
💥동시성 프로그래밍의 문제점 데드락(Dead Lock)과 경쟁조건(Race Condition)에 관한 이야기이다. 한 개의 자원에 여러개의 쓰레드가 접근하려고 한다 ==> RaceCondition Racecondition이 발생해 여러가지 쓰레드에서 공유자원에 동시접근을 막기위해 걸어잠굴 수 있다. 각 쓰레드는 공유자원에 여러개의 동시접근을 막기위해 사용중인 동안 다른 쓰레드의 공유자원 접근을 막을 수 있다. 데드락은 아래에서 다루고 있다. https://clamp-coding.tistory.com/72 운영체제(OS) - 식사하는 철학자 문제(Dining Philosophers Problem) 식사하는 철학자 문제 철학자 다섯이서 원형 식탁에 둘러앉아 생각에 빠지다가, 배고플 땐 밥을 먹는다. 그들의 ..
iOS. 디스패치큐(GCD) 사용시 주의해야할 사항
⭐️앨런님 강의를 듣고 정리한 글입니다⭐️ 💥디스패치큐(GCD) 사용시 주의해야할 사항 ❓반드시 메인큐에서 처리해야하는 작업 UI관련 처리는 반드시 메인큐에서 처리해야한다 DispatchQueue.global().async{ //코드 1 //코드 2 DispatchQueue.main.async{ //다운로드 한 이미지 표시 코드 self.imageView.image = image // UI 관련 작업들은 메인큐에서 진행 } } //URLSession은 내부적으로 비동기 처리가 되어있음 URLSession.shared.dataTask(with: url){ //코드 1 //코드 2 DispatchQueue.main.async{ //다운로드 한 이미지 표시 코드 self.imageView.image = ima..
iOS. GCD의 개념과 Dispatch큐(Queue)종류? Qos
❓메인 큐 - DispatchQueue.main 메인큐 = 메인쓰레드 직렬로 작동한다. 기본적으로 실행하는 코드는 직렬 + 동기적으로 실행된다. 일반적으로 사용하는 print("123456") 이란 코드는 아래와 같은 의미가 숨겨져 있다. DispatchQueue.main.sync{ print("123456" } ❓글로벌 큐 - DispatchQueue.global() DispatchQueue.global().async{ } 글로벌큐 중 디폴트 기본적으로 동시(Concurrent)큐 여러개의 쓰레드를 사용한다. QoS에 따라서 여러개로 나뉜다. ex) DispatchQueue.global(qos: .utility) ❓QoS (Quality of Service) 서비스의 품질에 따라서 나뉜다. 서비스의 품..
iOS. Delegate Pattern
Delegate: 대리자. 위임자. 위임하다 Delegate패턴은 위임자를 갖고있는 객체가 다른 객체에게 자신의 일을 위임하는 형태의 디자인 패턴이다. Delegate Pattern 델리게이트 패턴은 보통 "객체가 자신의 책임을 다른 객체에게 위임(delegate)하는 디자인 패턴"이라고 설명된다. 예를 들어 테이블뷰는 셀을 탭했을 때 어떤 행동을 할지에 대한 책임을 뷰컨트롤러에게 UITableViewDelegate를 사용해 위임한다. 테이블뷰 이외에도 콜력션뷰, 텍스트필드 등 많은 UI요소들이 델리게이트패턴을 사용해 다른 객체에게 책임을 위임한다. 예제 1. 델리게이트란? struct Cookie{ var size: Int = 5 var hasChocolateChips: Bool = false } cl..
iOS. 동시성프로그래밍(2) - 동기, 비동기, 직렬, 동기
💥 비동기(Async) vs 동기(Sync) ❓비동기(Async) 작업을 다른 스레드로 보낸 후 작업이 끝나기를 기다리지 않는다. 기다리지 않기 때문에 다음 작업을 진행할 수 있다. ❓동기(Sync) 다른 스레드에 작업을 시키고, 끝날 때까지 기다린다. 작업이 끝날 때까지 다른 작업을 시작할 수 없다. 💥 직렬(Serial)큐 vs 동시(Concurrent)큐 큐의 특성에 따라 나뉘어짐 ❓직렬(Serial)큐 Queue에서 받은 테스크들을 단 하나의 다른 쓰레드로 보내는 큐 한 번에 하나의 테스크를 순차적으로 실행 순서가 중요한 작업을 처리할 때 Main Thread에서 사용되는 Queue(Main Queue) ❓동시(Concurrency)큐 Queue에서 받은 테스크들을 다른 여러개의 쓰레드로 보내는 ..
iOS. 동시성(Concurrency) 프로그래밍(1) - 동시성프로그래밍이란? feat. 병렬/동시
동시성 프로그래밍이 필요한 이유 네트워크 통신과 비동기 처리 네트워크 통신, 서버에 데이터를 요청하는 일은 부하가 많이 걸리는 일이다. 당근마켓의 화면엔 사진과, 정보를 담고 있으며, 이를 스크롤하며 다른 정보들을 갖고있을 수 있다. 비동기 처리를 하지 않으면 한 번에 한 개의 작업만 할 수 있다. 첫번째 사진을 다운로드 -> 첫 번째 정보를 다운로드 -> 두 번째 사진을 다운로드... 그러므로 비동기 처리를 하지않으면 테이블 뷰를 스크롤 할 때 마다 버벅거릴것이다. 아이폰의 메인쓰레드 아이폰의 화면 주사율은 60Hz이다. 1초에 60번 화면을 다시 그린다는 뜻이다. 계산을 해보면 0.01666초에 한 번 화면을 다시 그려야 하며 화면을 다시 그리는 일은 메인쓰레드가한다. 즉 메인쓰레드는 0.01666초..
동기(Sync), 비동기(Async), 직렬(Serial)동시(Concurrent)에 대한 정리
비동기(Async) vs 동기(Sync) 비동기(Async) 다른 쓰레드에서 작업하도록 넘긴 후 그 작업이 끝나길 "안기다리고" 다음일을 진행한다. 보낸 작업이 언제끝나는지 관심없고, 다음일을 처리한다. 동기(Sync) 작업을 다른 쓰레드에서 하도록 시킨 후, 그 작업이 끝나길 "기다렸다가" 다음일을 진행한다. 비동기라는 개념이 일반적으로 필요한 이유는 대부분 서버와 통신(네트워크 작업) 때문 이다. 직렬처리(Serial) vs 동시처리(Concurrncy) 직렬처리(Serial) 쓰레드에서 하던 작업을 다른 쓰레드로 보내는데, 다른 하나의 쓰레드로 원래의 순서를 유지해서 보낸다. (보통 메인쓰레드에서) 분산처리 시킨 작업을 "다른 한개의 쓰레드"에서 처리 순서가 중요한 작업을 처리할 때 사용 동시처리(..
REST API 정리
REST한 형식의 API 요청방식에 대한 약속 REST하지 않은 형식 https://(사이트주소)/1 --> 상영중 영화목록 요청 GET https://(사이트주소)/2 --> 내일 오픈예정 영화 목록 GET https://(사이트주소)/3 --> 실시간 영화 관객 순위 GET https://(사이트주소)/4 --> 영화 예약 POST 1, 2, 3, 4...이렇게 하면 헷갈린다. 만약 서버 담당자가 퇴사를 하거나, 정보가 누락될 시 어떤게 각 주소가 어떤 API이지 알기 힘들고 실수할 가능성이 높다. 그래서 명사형으로 작성을 하자! REST한 형식 https://(사이트주소)/moviewlists --> 상영중 영화목록 요청 GET https://(사이트주소)/moviewlists?open=tomorr..