[회고] 2025 팀네이버 온라인 CS/코딩테스트 KPT 회고
·
✍🏻 회고록
Keep전 날 생활패턴평소보다 2시간이나 일찍 자서 23시 ~ 07시 동안 잤다.전전 날까지 공부를 다 해뒀으니까 가능한 거라 생각함, 다음에도 이렇게 하자아침 챙겨먹기아침으로 소보로 슈크림빵을 먹었다.나의 시험 전 징크스, 시작 1시간 전에 헤이즐넛 커피와 페레로로쉐를 편의점에서 사와서 먹었다.준비운동아침에 일어나자마자 프로그래머스 레벨 1을 풀며 자신감을 얻었다. (는 2문제 중에 1개는 못 풀었다;;)시험 30분 전에는 영어 타자연습을 했다. (예열용)https://www.typingtest.com/시험 15분 전에는 귀멸의칼날 무한성 OST를 2번 돌려 들었다. (전쟁하러 간다고 생각하고 명상하며 들었다.)https://youtu.be/dRj2A3WkQjE?si=Kuilq2Tjw8jgVbFW시험 ..
[문제해결] @Sendable과 isolated 실전 응용: AVCaptureDevice.requestAccess(for:)
·
📱 iOS/Swift Concurrency
문제해결final class CustomAlbumViewController: UIViewController { private func checkCameraAuthorization() { let authorization = AVCaptureDevice.authorizationStatus(for: .video) switch authorization { case .notDetermined: AVCaptureDevice.requestAccess(for: .video) { @Sendable granted in if granted { Task { [weak self] in ..
[문제해결] UITableViewCell 셀 내부 제스처가 스크롤을 막는 문제 해결: UIGestureRecognizerDelegate 활용
·
📱 iOS/UIKit
문제상황개요테이블뷰 델리게이트가 제공해주는 Trailing Swipe를 사용하지 않고 위처 커스텀 테이블뷰 셀 안에 있는 뷰에 팬제스쳐를 넣었다.그랬더니 셀의 개수가 많아져서 세로 스크롤이 되어야 할 때에 스크롤이 되지 않는 문제가 발생했다.ㄴㅇㄱ 코드는 위와 같다. 셀 안에 Pan Gesture를 넣었더니 테이블 뷰에서 셀 안에 있는 팬제스쳐에게 이벤트를 뺏겨 세로 스크롤이 되지 않는 문제가 발생했다.문제해결아이디어세로 스크롤은 컬렉션뷰의 기본 동작이지만, 셀 내부 제스처가 우선순위를 가지며 충돌 발생했다.즉, 제스쳐를 관리하는 UIGestureRecognizerDelegate 프로토콜을 활용해 제스처 동작 조건을 제한한다.수평 스와이프는 셀의 커스텀 동작으로, 수직 스와이프는 컬렉션뷰 스크롤로 이벤트..
[문제해결] UITableViewCell에서 CornerRadius 개별 설정 시 초기 레이아웃 문제를 비동기 재귀로 해결하기
·
📱 iOS/UIKit
문제상황   어느 날, 아래의 디자인 요구사항이 들어왔다.“Corner Radius를 왼쪽 위와 아래는 2로, 오른쪽 위와 아래는 8로 해주세요.”(위 영상은 눈에 잘 보이라고 왼쪽 위-아래 12, 오른쪽 위-아래 32로 설정했다.) 이전 편에서 썼듯이 CACornerMask와 UIBezierPath, CAShapeLayer를 통해 개별처리를 할 수 있다는 것을 알았다.근데 셀 안에 들어가니까 얘기가 달라졌다.해결과정1. 생성자 시점에서 configureCornerRadius() 호출뷰가 그려질 때 처음부터 잡히면 좋겠거련만, 그게 잘 안된다.코드는 다음과 같다.final class TimeSlotTableViewCell: UITableViewCell { override init( st..
[UIKit] 뷰의 Corner Radius 각각 다르게 처리하기 (with CACornerMask, UIBezierPath, CAShapeLayer)
·
📱 iOS/UIKit
학습 개요디자인 요구사항에 따라 Corner Radius 설정을 하나의 뷰에 별도로 처리해줘야 할 일이 생겼다.왼쪽 위-아래는 2로, 오른쪽 위-아래는 8로 설정해야 한다.let view = UIView()view.layer.cornerRadius = 8우리는 이런 식으로 UIView가 갖는 CALayer 타입 프로퍼티 layer에 cornerRadius로 설정해왔다.위 코드의 경우 해당 뷰는 8의 곡선을 가질 것이다.근데 각각 처리하려면 어떻게 할까 ?학습 정리CACornerMaskCALayer에 CACornerMask라는 옵션이 있다.이걸로 4개의 꼭짓점을 가리키고, 개별적으로 설정해줄 수 있다.만약 위처럼 내가 MaxX, MaxY에 대해서 설정을 했다면, 우측하단 해당 부분에만 Radius에만 적용..
[Swift Concurrency 11편] Main Actor
·
📱 iOS/Swift Concurrency
특별한 Actor - Main ActorMain Thread & Main Actor우리의 메인 스레드는 UI 렌더링 및 사용자 이벤트가 처리되는 곳이다. 왜 메인 스레드에서 UI 렌더링 해야 하는지는 지난 번에 다뤄보았다.모든 작업을 메인 스레드에서 처리해버리면 UI 렌더링에 문제가 생겨 버벅일 수 있다.우리는 메인 스레드에서 실행해야 할 오래 걸리는 작업이 있으면 GCD Async를 통해 백그라운드로 보냈다. 그리고 그 코드는 메인 스레드에서 동작할 거다. 메인 스레드와 상호작용하는 것이 actor와 상호작용하는 것과 유사하다.메인 스레드에서 실행중이면 UI State에 안전하게 접근하여 업데이트, 메인 스레드가 아니라면 비동기로 스레드와 상호작용하는 원리 말이다. 메인 스레드를 나타내는 특별한 Glo..
[Swift Concurrency 10편] Actor는 한글 키보드로 'ㅁㅊ색' 이란 걸 아시나요?
·
📱 iOS/Swift Concurrency
개요지난 편에 이어서 이제 본격적으로 Actor라는 Object Type에 대해 알아보겠습니다.actor를 한글 키보드로 종종 잘못 치곤 하는데요, actor == ㅁㅊ색이라는 게 뭔가 잘 어울리네요 TaskTask는 독립적인 비동기 컨텍스트를 제공해줘서 비동기 메소드를 실행할 수 있는 공간이다.WWDC에서는 Task를 동시성의 바다 위에 떠다니는 보트로 비유한다.Task는 여러 개 생성할 수 있으며, 각각은 독립적이나 그 안에서의 데이터들은 값 타입인지 참조 타입인지에 따라 다르다. 참조 타입의 경우 아래 사진과 같이 독립적인 Task에서 내부적으로는 공유된 데이터를 사용할 수 있기에 이를 문제라 본다. 따라서 Task에서는 멀티 스레드에 의해 데이터 레이스가 발생할 수 있기 때문에 struct에서는 ..
[Swift Concurrency 9편] Sendable 프로토콜
·
📱 iOS/Swift Concurrency
Sendable 프로토콜비동기 컨텍스트에서 동작할 수 있도록 보장해주는 프로토콜값 타입의 경우 자동으로 채택레퍼런스인 클래스의 경우 채택해야 비동기 컨텍스트에서 데이터 경쟁 없이 동작하는 걸 컴파일러로부터 보장 받을 수 있음클래스가 Sendable을 채택하려면?아래 3가지를 따라야 함final 로 선언되어야 함프로퍼티가 모두 Sendable을 채택해야 함프로퍼티가 모두 let이어야 함 (불변이어야 한다는 뜻)actor는 Sendable을 채택하고 있음protocol Actor : AnyObject, [Sendable](https://developer.apple.com/documentation/swift/sendable>)Sendable을 채택할 수 있는 것들값 타입mutable storage 가 없는 참..
[Swift Concurrency 8편] Task와 구조화된 동시성(= Structed Concurrency)
·
📱 iOS/Swift Concurrency
Task 개념비동기 코드를 실행하기 위한 새로운 실행 컨텍스트를 제공함 async-await를 호출할 수 있게 하고, 병렬로 코드 실행을 지원하는 매커니즘우린 여태껏 async 호출을 통해 비동기 작업을 다뤘다.그러나 async를 사용한다고 해서 한 번에 둘 이상의 작업을 수행하지 않는다.async가 동시성을 제공하는 건 아니라는 뜻 Task는 코드를 병렬로 실행하게 하며 각 Task는 다른 Task와 동시에 실행할 수 있는 비동기 컨텍스트를 제공한다.Task로 생성된 작업은 MainActor가 아니라면 백그라운드 스레드에서 실행된다. await를 사용해서 완료된 값이 돌아올 때까지 기다릴 수 있음 하나의 Task 안에서 async 함수를 호출하고,그 안에서 또 async를 호출한다면 동일한 Task에서..
[Swift Concurrency 7편] 비동기 호출에서의 스레드 제어권
·
📱 iOS/Swift Concurrency
개요await로 비동기 메소드를 호출하는 경우, Potential Suspension Point로 지정된다. 생각해보면 당연하다await로 URLSession의 data 비동기 메소드를 호출하면 그 아래 작업들은 data 메소드가 끝날 때 까지 기다리게 된다. 이 지점을 Suspension Point 라고 한다.이를 통해 fetchThumbnail의 메소드는 더 이상 할 일이 없으니, 해당 작업을 처리하던 스레드가 다른 동작을 할 수 있게끔 제어권을 놓아주는 행위를 할 수 있다.스레드를 멈추는 것이 아닌, 다른 작업을 할 수 있게 제어권을 넘기는 것 말이다. Suspend 된다 = 해당 스레드에 대한 제어권을 포기한다라고 봐도 무방할듯스레드 제어권 관점sync 에서의 스레드 제어권A 함수에서 B라는 sy..