← 홈으로 돌아가기

📝 Daily Learning Log (2026-06-29 ~ 07-05)

주간 학습일지 · 2026-06-29 ~ 07-05

2026-06-29 (월)

✅ 학습 완료

📕 오답노트

Self-Sizing Cell 흐름에서 dequeue 순서

  • 틀린 이해: preferredLayoutAttributesFitting 후에 dequeue
  • 맞는 순서: dequeue(cellForItemAt) → 셀 화면 추가 → preferredLayoutAttributesFitting 호출 → 실제 크기 측정
  • apply(_:)에서 super.apply() 호출 안 하면 frame, alpha, transform 등 기본 속성 적용 안 됨

2026-06-30 (화)

✅ 학습 완료

📕 오답노트

tuist install과 resolve 시점

  • 틀린 이해: tuist generate가 모든 패키지를 resolve
  • 맞는 이해: Tuist/Package.swift는 tuist install에서 resolve 완료 → generate는 연결만
  • Project.swift packages:에 원격 패키지 있으면 generate마다 resolve 체크 (느림)

클로저 캡처 — count/counter는 어디에? capture list로 클래스 복사?

  • 헷갈린 점: count가 살아있으면 counter 변수가 힙에 있는 건가?
  • 맞는 이해: counter가 가리키는 클로저 객체가 힙. let counter 변수는 그 힙 객체를 가리키는 참조. count는 클로저의 힙 Box에 담겨 유지 → 누적
  • 헷갈린 점: "Class는 capture list 써도 레퍼런스만 복사"?
  • 맞는 이해: [x]는 값 복사인데 클래스는 값이 곧 참조 → 참조만 복사 → 같은 객체 공유. struct라야 독립 스냅샷
  • 클로저 구조: 코드 포인터(실행할 함수 본문 주소) + 박스(캡처 변수 담는 힙 공간)
  • 👉 정리: Closure Capture — 복습 Q&A (2026-06-30)

📖 읽기 현황

➕ 추가 학습

2026-07-02 (수)

학습 주제

오답노트 — 이미지 파이프라인

  • 착각: "Data는 압축 해제된 파일이다" → 정정: Data는 그냥 바이트 컨테이너, jpegData()나 URL 다운로드 결과 모두 압축된 상태
  • 착각: "UIImage는 즉시 디코딩 못 한다" → 정정: iOS 15+ preparingForDisplay() 사용 가능
  • 착각: "JPEG 1MB = 메모리 1MB" → 정정: 디코딩 후 width×height×4 바이트 (4000×4000 = 64MB)
  • 착각: "kCGImageSourceShouldCacheImmediately는 백그라운드 디코딩" → 정정: 호출한 스레드에서 동기 즉시 디코딩
  • 착각: "렌더링 전 UIImage.cgImage는 nil" → 정정: CGImage 객체는 있지만 내부 비트맵이 비어있는 상태

CGImageSource 심화

RunLoop / VSync / 프레임 드랍 심화

오답노트 — RunLoop / VSync

  • 착각: "RunLoop이 60fps로 돈다" → 정정: VSync가 60fps, RunLoop은 속도 제한 없음
  • 착각: "RunLoop만 16.67ms 안에 끝나면 됨" → 정정: Render Server 합성 시간도 포함해야 함
  • 착각: "bounds.size는 픽셀 단위" → 정정: 포인트 단위, scale 곱해야 픽셀
  • 착각: "UIImage(data:)가 디코딩한다" → 정정: 압축된 Data 참조만, 비트맵은 draw 등 픽셀 접근 시 생성

UIImage 내부 상태와 draw 디코딩

Clean Architecture 레이어 구조 Q&A

오답노트 — Clean Architecture 레이어

  • 착각: "Repository Impl이 UseCase 층에 있다" → 정정: Data Layer에 있음. UseCase는 Interface(Protocol)만 앎
  • 착각: "DTO 변환이 UseCase에서 일어난다" → 정정: Data Layer의 Repository Impl에서 수행
  • 착각: "UseCase가 Entity ↔ DTO 변환을 한다" → 정정: UseCase는 Entity만 알고 DTO 존재를 모름

2026-07-03 (목)

학습 주제

Scene 계층 구조 심화

오답노트 — Scene 계층

  • 착각: "UIWindowScene이 UIWindow를 소유한다" → 정정: UIWindow가 UIWindowScene을 strong 참조. Scene.windows는 조회용
  • 착각: "Scene이 Window 안에 있다" → 정정: Window가 Scene에 "소속"되는 것 (Scene = 화면 환경, Window = 그 위의 창)
  • 착각: "UIScene에 windows가 있다" → 정정: UIScene(추상)엔 없고, UIWindowScene(구체)에만 있음
✅ 정리 완료: Clean Architecture + Scene 계층 구조 전체 이해

2026-07-05 (토)

학습 주제

오답노트 — Concurrency 상속·Sendable

  • 착각: "unstructured Task는 우선순위를 상속 안 한다" → 정정: Task {}는 우선순위·컨텍스트·task-local 다 상속. 취소 자동전파만 안 함. 넷 다 안 하는 건 Task.detached
  • 착각: "suspend 전에 balance 수정하면 문제" → 정정: 반대. await 없이 검사+수정 원자적이면 안전. 검사↔수정 사이 await가 위험
  • 착각: "Sendable = 컨텍스트 내 스레드 세이프" → 정정: 격리 경계를 가로질러 넘겨도 안전한지를 컴파일 타임에 검사
  • 착각: "@Sendable 클로저 = 코드가 안 바뀜" → 정정: 동시 실행해도 안전(캡처가 안전)
  • 착각(내 설명 오류 정정): "actor 안의 Task {}는 non-Sendable 캡처 시 에러" → 정정: Task {}는 actor 격리를 상속하므로 경계 안 넘어 에러 아님. 에러는 Task.detached(격리 벗어남) 또는 두 Task가 같은 non-Sendable 공유할 때
  • 2차 문답 14개: actor는 Sendable 채택 / sending(소유권 이전) / cooperative pool=전역공유 / continuation=재개 스냅샷 / thread-local·락+await 금지 이유 / nonisolated는 격리 소속 변경 / structured 자동취소 / onCancel @Sendable / Task.isCancelled=자기것
  • 👉 정리: Swift Concurrency 심화 Q&A (2026-07-05)