[Swift 심화 #9] Swift ABI 안정성, 2019년에 앱 용량이 줄어든 이유
2019년 Swift 5와 iOS 12.2 배포 후 앱 용량이 줄어든 것은 ABI 안정성 덕분입니다. 앱마다 품고 다니던 Swift 런타임이 OS로 옮겨간 과정과 모듈 안정성, @frozen의 트레이드오프를 정리했습니다.
읽어보기엄선한 주제 · 73 글
Swift 문법, 타입 시스템, 동시성, 언어 철학을 실전 예제와 함께 정리한 글 모음입니다.
최신 글
2019년 Swift 5와 iOS 12.2 배포 후 앱 용량이 줄어든 것은 ABI 안정성 덕분입니다. 앱마다 품고 다니던 Swift 런타임이 OS로 옮겨간 과정과 모듈 안정성, @frozen의 트레이드오프를 정리했습니다.
읽어보기파일 핸들이나 락처럼 하나여야 의미 있는 자원은 복사되면 안 됩니다. Swift 5.9의 ~Copyable로 복사 금지를 타입에 새기는 법과 borrowing·consuming·inout 세 전달 방식, 쓸 자리와 안 쓸 자리를 정리했습니다.
읽어보기Swift 5.9의 매크로는 컴파일러에 꽂는 코드 생성 플러그인입니다. 구문 트리를 받아 코드를 돌려주는 동작 원리와 freestanding(#)·attached(@) 두 갈래, 직접 만들 때 치르는 비용을 정리했습니다.
읽어보기struct 크기는 프로퍼티 크기의 단순 합이 아닙니다. size·stride·alignment와 패딩, extra inhabitant를 활용하는 Optional, 64비트 existential container의 실측을 정리했습니다.
읽어보기메서드 호출은 직접 호출·vtable·objc_msgSend 세 방식으로 컴파일됩니다. final과 private이 성능 키워드가 되는 메커니즘과 프로토콜 extension의 함정, 프로파일러로 확인하는 법을 정리했습니다.
읽어보기구조적 동시성은 비동기 작업의 끝을 누가 책임지는가에 답합니다. 자식 작업이 부모 스코프를 벗어나지 못하는 원리와 취소 신호가 전파되는 방식, Task.detached를 쓸 때 수동으로 되사야 하는 보장을 정리했습니다.
읽어보기Swift 6 모드를 켜면 쏟아지는 동시성 에러의 주인공은 Sendable입니다. 값이 격리 경계를 넘어도 되는지 묻는 이 프로토콜의 의미와, struct화·불변화·actor 승격 순으로 밟는 마이그레이션 처방을 정리했습니다.
읽어보기델리게이트와 클로저는 같은 콜백 요구를 처리하지만 결이 다릅니다. 같은 예제를 나란히 구현해 드러나는 다섯 가지 실질 차이와, 이벤트 개수·관계 수명·반환값 필요 여부로 고르는 기준을 정리했습니다.
읽어보기actor는 자기 상태를 스스로 지키는 네 번째 타입 종류입니다. 동시 접근을 줄 세워 데이터 레이스를 컴파일러가 잡는 문제로 바꾸는 원리와, 가장 유명한 함정인 재진입(reentrancy)까지 정리했습니다.
읽어보기await에서 멈추는 것은 스레드가 아니라 함수입니다. 함수가 상태를 힙에 저장하고 스레드를 협력형 풀에 반납하는 suspension의 정확한 의미와, 순차 await가 병렬 실행이 아닌 이유를 정리했습니다.
읽어보기Factory는 의존성 등록 누락을 컴파일 타임에 잡아내는 Swift DI 라이브러리입니다. 2026년 7월 기준 3.3.1로 기본 사용법과 스코프 선언, 테스트·프리뷰 주입, Swinject와의 차이를 정리했습니다.
읽어보기프로토콜 지향 프로그래밍(POP)은 무엇을 상속받았는지가 아니라 무엇을 할 수 있는지로 타입을 설계합니다. 상속이 막히는 지점과 프로토콜 조합으로 푸는 방법, 피해야 할 경우까지 Swift 예제로 정리했습니다.
읽어보기\.name은 map의 축약 문법이 아니라 KeyPath라는 독립 타입의 값입니다. 프로퍼티 접근을 값으로 만든다는 말의 뜻과 읽기 전용·값 타입 쓰기·참조 타입 쓰기 세 계층, 실무 활용처를 정리했습니다.
읽어보기프로퍼티 래퍼는 SwiftUI 문법이 아니라 Swift 5.1에 SE-0258로 들어온 언어 기능입니다. 컴파일러가 @Clamped를 어떻게 번역하는지, wrappedValue와 projectedValue($)의 정체, 남용 경계를 정리했습니다.
읽어보기Codable 자동 합성이 실제로 무엇을 만들어주는지부터, 실무에서 반드시 만나는 키 이름 불일치·날짜 포맷·중첩 구조·부분 실패 네 상황의 표준 처방과 DecodingError 디버깅까지 정리했습니다.
읽어보기map·filter·compactMap·flatMap·reduce 다섯 함수의 구분은 클로저가 무엇을 반환하느냐로 갈립니다. for 루프와의 선택 기준, 체이닝이 만드는 중간 배열, lazy 시퀀스가 푸는 문제를 정리했습니다.
읽어보기연관 타입(associatedtype)은 프로토콜에 뚫린 타입 빈칸입니다. 그 유명한 generic constraint 에러가 났던 이유와 SE-0309·SE-0346으로 제약이 풀린 과정, primary associated types 활용법을 정리했습니다.
읽어보기Swift 5.5 이상에서는 테스트 함수를 async로 선언하고 await로 결과를 기다린 뒤 검증하면 됩니다. 에러 검증, 오래된 콜백 API 테스트, expectation을 아직 써야 하는 경우까지 정리했습니다.
읽어보기Swift 5.6 이후 코드를 보면 프로토콜 이름 앞에 some 아니면 any가 붙어 있습니다. some View, any Error, some Collection. 예전엔 프로토콜 이름을 그냥 타입 자리에 썼는데, 이제 컴파일러가 any를 붙이라고 경고하거나 에러를 냅니다.…
읽어보기iOS 개발하면서 테스트 코드 짜다 보면 XCTest에 슬슬 답답함을 느끼는 순간이 옵니다.
읽어보기코드 리뷰에서 "이 클래스에 final 좀 붙여주세요" 같은 말, 한 번쯤 들어보셨을 거예요.
읽어보기Swift 코드에서 꺾쇠괄호 <T>를 처음 만나면 눈이 한 번 멈춥니다. 함수 이름 옆에 웬 대문자 알파벳이 붙어 있고, 문서를 열면 func map<T>( transform: (Element) -> T) -> [T] 같은 시그니처가 기다리고 있죠. 제네릭은 Swift 중급의…
읽어보기클로저 편에서 [weak self]로 순환 참조를 끊는 법을 다뤘을 때, 한 가지 질문을 미뤄뒀습니다. weak 말고 unowned도 있던데, 뭐가 다르고 언제 쓰는 걸까요. 이 질문에 답하려면 그 아래 층, ARC가 실제로 어떻게 돌아가는지부터 봐야 합니다.
읽어보기Swift 관련 글이나 릴리스 노트를 읽다 보면 SE-0296, SE-0345 같은 코드가 자꾸 등장합니다. async/await를 소개하는 글엔 SE-0296이, if let name 축약 문법 얘기엔 SE-0345가 붙어 있죠. 이 번호의 정체가 뭘까요.
읽어보기iOS 앱 규모가 커지면서 의존성 관리 때문에 골치 아파진 적, 한 번쯤 있으실 거예요.
읽어보기Swift 표준 라이브러리를 열어보면 눈에 띄는 사실이 하나 있습니다. Int, Double, Bool 같은 기본 타입은 물론이고 String, Array, Dictionary, Set까지 전부 struct입니다. 다른 언어에서 당연히 클래스였던 것들이 Swift에서는 죄다 값…
읽어보기Swift에는 이상한 공존이 있습니다. 프로그래밍을 처음 배우는 사람이 Playgrounds에서 print("Hello") 한 줄로 시작하는 언어인데, 같은 언어로 제네릭과 매크로가 뒤엉킨 표준 라이브러리가 짜여 있어요. 초등학생용 코딩 교육 앱(Swift…
읽어보기게임 이펙트를 잔뜩 뿌리는 화면을 만들다 보면 프레임이 뚝뚝 끊기는 순간이 옵니다.
읽어보기iOS 앱 만들다 보면 꼭 마주치는 순간이 있어요. 화면 하나에 로딩 중, 성공, 실패, 빈 데이터 상태가 뒤섞이는 순간이요.
읽어보기Swift Copy-on-Write는 값 타입을 대입할 때 저장소를 공유하고, 한쪽이 수정되는 순간에만 실제 복사합니다. 이 최적화가 값 의미를 지키면서 프로토타입 패턴의 역할을 줄이는 원리를 설명합니다.
읽어보기OOP 공부하다 보면 캡슐화라는 말은 백번쯤 듣는데, 막상 "그래서 코드로 어떻게 하는 건데?" 물으면 말문이 막히는 순간이 있어요. 개념은 알겠는데 손이 안 나가는 거죠.
읽어보기Swift로 코드를 쓰다 보면 한 번쯤 궁금해지는 순간이 옵니다. 옵셔널은 왜 이렇게 깐깐할까, 배열은 왜 복사될까, guard는 왜 있을까. 이런 질문들을 하나씩 파고들다 보면 결국 한 지점에서 만나게 됩니다. Swift가 처음부터 내걸었던 세 가지 목표, Safe(안전하게),…
읽어보기Swift 정적 팩토리 메서드는 생성 의도를 이름으로 드러내고 반환 타입, 캐싱, 인스턴스 재사용을 제어합니다. static func make를 init 대신 선택할 때의 장단점과 GoF 패턴과의 차이를 정리합니다.
읽어보기디자인 패턴 책을 펼치면 늘 마지막쯤에 등장하는 게 인터프리터 패턴이에요. "이게 대체 언제 쓰이나" 싶어서 대충 넘기기 쉬운 패턴이죠.
읽어보기비슷한 로직을 클래스마다 복붙하다가 "이거 뭔가 잘못됐는데" 싶었던 적 있으신가요? iOS 앱에서 화면별 데이터 로딩 코드를 세 번째 복사할 때쯤이면 손이 멈추게 되죠.
읽어보기iOS 개발하다 보면 도형이든 노드든, 종류가 여러 개인 객체에 연산을 계속 얹어야 하는 순간이 옵니다.
읽어보기Swift String이 정수 인덱스를 허용하지 않는 이유를 확장 그래핌 클러스터에서 출발해 설명합니다. 한글 조합형 문자열의 Character·Unicode scalar·UTF-8 차이를 직접 실행한 결과로 확인합니다.
읽어보기퍼사드 패턴은 여러 객체가 얽힌 서브시스템 앞에 단순한 진입점 하나를 제공합니다. Swift 회원가입 예제로 호출 순서를 한곳에 모으는 법과 어댑터·프록시·데코레이터와의 차이를 설명합니다.
읽어보기Swift로 iOS 앱을 만들다 보면 버튼을 눌렀는데 왜 이 뷰컨트롤러가 이벤트를 받는 걸까 궁금했던 순간이 다들 있으실 거예요.
읽어보기Swift로 앱을 만들다 보면 for item in array 같은 반복문을 하루에도 수십 번 씁니다. 워낙 자연스럽게 쓰다 보니, 커스텀 타입을 for-in으로 돌리려다 컴파일 에러를 만나고 나서야 궁금해지곤 하죠. "이 반복문, 대체 안에서 무슨 일이 벌어지는 거지?"
읽어보기앱을 만들다 보면 비슷비슷한 객체를 수천, 수만 개씩 찍어내야 할 때가 있어요. 지도 위에 마커를 수만 개 뿌리는 기능이 대표적인데, 이런 상황에서는 메모리 그래프가 계속 치솟기 쉽습니다.
읽어보기앱을 만들다 보면 "실행 취소 버튼 하나만 넣어달라"는 요청이 생각보다 자주 들어옵니다.
읽어보기스테이트 패턴은 상태별 행동과 전환을 객체나 enum으로 모아 흩어진 조건문을 줄입니다. Swift 화면 상태를 리팩터링하는 순서와 전략 패턴처럼 보이는 구조를 의도로 구분하는 법을 설명합니다.
읽어보기Swift의 에러 처리 도구는 실패를 다루는 시점과 보존할 정보에 따라 역할이 나뉩니다. throws·do-catch·try?·try!·Result 중 무엇을 고를지 실행 결과와 함께 정리합니다.
읽어보기Swift guard는 실패 조건을 먼저 처리하고 정상 흐름을 평평하게 유지합니다. if와 다른 컴파일러 보장, optional binding의 유효 범위, return·throw·continue 선택 기준을 실행 예제로 확인합니다.
읽어보기이 글은 Swift 기초 시리즈 3편입니다. 프로퍼티 다섯 종류를 문법 나열이 아니라 선택 기준 중심으로 정리합니다. 핵심 질문은 하나예요. 이 값은 저장되는가, 계산되는가, 그리고 언제 만들어지는가.
읽어보기폴더 안에 폴더, 그 안에 또 파일. 이런 트리 구조를 코드로 다뤄본 분이라면 한 번쯤 막막했을 거예요.
읽어보기iOS 개발하다 보면 이런 순간이 옵니다. 기본 기능은 그대로 두고 로깅 하나만, 캐싱 하나만 얹고 싶은데, 그걸 하려고 클래스를 상속받기 시작하면 어느새 상속 트리가 엉망이 되어 있죠.
읽어보기프로토타입 패턴은 기존 객체를 복제해 생성 비용과 설정 중복을 줄입니다. Swift 값 타입 복사와 클래스의 NSCopying이 어떻게 다르고, 얕은 복사와 Copy-on-Write가 어디서 개입하는지 정리합니다.
읽어보기추상 팩토리는 서로 호환되어야 하는 객체 여러 개를 제품군으로 묶어 한 번에 교체합니다. Swift 테마 예제로 조합 오류를 막는 구조와 팩토리 메서드와의 선택 기준을 설명합니다.
읽어보기Swift를 배울 때 처음 만나는 관문이 옵셔널입니다. String?의 물음표, if let, guard let, !, ??. 문법 종류가 많아서 각각을 따로 외우다 보면 규칙이 뒤죽박죽되기 쉽습니다.
읽어보기Swift 팩토리 함수는 생성 로직에 의도를 드러내는 이름을 붙이고 반환 타입과 재사용 정책을 유연하게 만듭니다. init 대신 static func를 선택할 기준과 GoF 팩토리 메서드와의 차이를 정리합니다.
읽어보기Swift 코드에서 클로저는 공기 같은 존재입니다. 정렬 조건, 네트워크 완료 핸들러, 버튼 액션, SwiftUI의 body까지, 중괄호 블록을 넘기는 코드가 하루에도 수십 번 등장하죠. 그런데 정작 "클로저가 값을 캡처한다는 게 정확히 무슨 뜻인가", "[weak self]는…
읽어보기어댑터 패턴은 레거시 API의 인터페이스를 새 코드가 기대하는 프로토콜로 변환합니다. Swift에서 변환 경계를 만들고 교체와 테스트를 쉽게 하는 구현 순서와 다른 래핑 패턴과의 차이를 정리합니다.
읽어보기iOS 개발을 하다 보면 델리게이트 패턴은 정말 지겹도록 만나게 됩니다.
읽어보기iOS 앱 만들다 보면 이런 순간이 꼭 옵니다. A 화면에서 뭔가 바뀌었는데, 저 멀리 떨어진 B 화면도 같이 갱신돼야 하는 상황이요.
읽어보기iOS 개발을 시작하면 누구나 한 번쯤 궁금해합니다. "애플은 잘 쓰던 Objective-C 놔두고 왜 굳이 Swift를 새로 만들었을까?" 하고요.
읽어보기Swift 개발을 하다 보면 static let shared 한 줄로 만드는 싱글톤을 정말 자주 만나게 됩니다.
읽어보기Swift로 앱을 만들다 보면 do-catch로 에러를 잡았는데, 정작 화면에 띄울 메시지가 영 시원찮았던 경험 있으실 거예요.
읽어보기