분류 전체보기 30

[Swift] 고차함수 더 이상 헷갈리지 않기

개인적으로 한번 헷갈리기 시작해 영원히 헷갈리는 문법이 몇 가지 있는데, 그 중 첫번째 손님으로 고차함수 map과 reduce 모심 ✅ 각 요소를 변환하는 Mapclass MapExamples { func basicMapExamples() { print("=== MAP 기본 예시 ===") // 예시 1: 숫자를 2배로 let numbers = [1, 2, 3, 4, 5] // Before: for문 사용 var doubled: [Int] = [] for number in numbers { doubled.append(number * 2) } pr..

Swift 2025.06.04

[WWDC] ARC in Swift

✅ ARC란?Swift에서 메모리 관리를 자동으로 수행하는 방법 ✅ 객체의 생명주기객체의 수명은 init 시점에 시작되어 마지막 사용 시점에 종료됩니다ARC는 객체의 수명이 종료된 후 해당 객체를 해제합니다ARC는 참조 카운트를 통해 객체의 수명을 추적합니다Swift 컴파일러는 retain/release 작업을 삽입합니다Swift 런타임은 참조 카운트가 0인 객체를 해제합니다 ✅ ARC의 동작방식class Traveler { var name: String = "" var destination: String?}func test() { let traveler1 = Traveler(name: "Lily") // retain let traveler2 = traveler1 // REF..

Swift 2025.05.30

Struct 접근제어와 Memberwise Initializers

struct는 원래 자동으로 Memberwise Initializers를 제공해준다하지만.. struct에서 하나의 프로퍼티라도 private이라면 Memberwise Initializers 또한 private! 내부에선 원래대로 자동으로 제공이 되는 것을 확인할 수 있다 하지만! 외부에서 사용하려면 따로 init을 작성해주어야 한다struct Person { var name: String var age: Int? private var hobby: String = "Swimming" init(name: String) { self.name = name }}let milou = Person(name: "Milou") 추가로 직접 init도 하고 싶고, Membe..

Swift 2025.05.29

[Swift]switch문 대신 if, guard 사용하기

Optional pattern을 보다가 생소한 문법을 발견했다let someOptional: Int? = 42// Match using an enumeration case pattern.if case .some(let x) = someOptional { print(x)}옵셔널은 enum타입으로 구현되어 있는데, 이렇게 if case 문으로 한가지 case만 처리하는 신기한 문법..! if case, guard caseenum NetworkResult { case success(data: String) case failure(code: Int, message: String) case noConnection}let result: NetworkResult = .failure(code: 4..

Swift 2025.05.28

Struct와 Class 차이(부제: 내가 SwiftUI가 어려웠던 이유)

바야흐로 작년 3월,, 처음 SwiftUI를 접했을 때 익숙한 UIKit과 너무 달라 울고 싶었던 기억이 떠올랐다예를 들어 상태관리라던가 상태관리라던가 상태관리라던가......그 근본적인 이유가 Struct와 Class의 차이인데, 그땐 미처 생각하지도 못했다 많은 차이점들이 있지만 SwiftUI와 UIKit에서 느꼈던 Struct와 Class의 차이를 위주로 정리해보려고 한다 ✅ 메모리 저장 방식의 근본적 차이Class (UIKit) 힙(Heap) 영역에 저장참조(포인터)를 통해 접근여러 변수가 같은 객체를 가리킬 수 있음ARC로 메모리 관리// UIKit 방식class UIViewController { var view: UIView! var title: String?}let vc1 = My..

Swift 2025.05.27

[Swift] COW 동작 원리

Swift의 String과 CollectionType(Array, Dictionary, Set) 등은 struct로 구현된 값 타입COW(Copy-on-Write) 최적화 덕분에 값 타입처럼 동작하면서도 실제 복사는 필요할 때만 일어남 var a = [1, 2, 3]var b = a // 힙 메모리를 참조만 공유 (복사 X)b.append(4) // 쓰기 시점에 복사 발생 (COW)b가 수정되기 전까지는 a와 동일한 힙 메모리 참조를 공유b.append(4) 시점에 Swift는 복사본을 생성하고 변경 작업을 수행→ 불필요한 복사를 줄이면서도 값 타입처럼 안전하게 동작

Swift 2025.05.26

[iOS] 리팩토링이라 쓰고 파일분리노가다라고 읽기

뷰컨트롤러 파일에 모든것을 때려박아 개발한 어제의 나 왜그랬을까? 오늘의 내가 view와 viewcontroller 그리고 tableview로 분리했다.. 처음에 생각한 순서는 뷰 → 테이블뷰 → VC 순으로 분리한다였다단순한걸 먼저 정리하는게 나을거라고 생각했기 때문에!뷰를 분리한 후 빌드해볼 생각은 안하고 신나게 테이블뷰까지 다 분리를 하고 빌드를 하니 !완전히 꼬임 ^^당연한게 뷰 분리 후에도 테이블뷰 로직이 VC에 남아 있어서 애매한 상태로 테이블뷰를 분리했었다 뷰 내에서 독립적으로 동작하는 테이블뷰를 먼저 분리하는 게 맞는 순서였다테이블뷰 → 뷰 → VC 순으로 분리테이블뷰를 먼저 분리하면 해당 뷰 컴포넌트만 띄워보기가 가능하다 가장 중요한건 매 단계 빌드 가능한 상태임을 항상 확인하자 ‼️ ..

iOS 2025.05.22

override init vs required init 초기화 차이

인스턴스 초기화 시점과 방식을 책임지는 생성자(Initializer) ✅ override init슈퍼클래스에서 “이렇게 초기화하세요”라고 지정해둔 지정 생성자(Designated Initializer) 를 재정의(override)코드로 뷰나 셀을 만들 때, 스토리보드·XIB가 아니라 init(frame:)(컬렉션뷰 셀) 또는 init(style:reuseIdentifier:)(테이블뷰 셀) 로 호출class MyCell: UICollectionViewCell { override init(frame: CGRect) { super.init(frame: frame) // 슈퍼 초기화 필수 호출 setupUI() // 이후 커스텀 UI 설정 ..

iOS 2025.05.21

[iOS] SnapKit과 AutoLayout

✅ SnapKit이란?SnapKit은 iOS에서 오토레이아웃을 코드로 작성할 수 있게 도와주는 프레임워크기존의 NSLayoutConstraint보다 훨씬 간결하고 직관적으로 레이아웃을 구성// Auto Layout 코드 (기본 방식)NSLayoutConstraint.activate([ label.topAnchor.constraint(equalTo: view.topAnchor, constant: 20), label.centerXAnchor.constraint(equalTo: view.centerXAnchor)])// SnapKit 방식label.snp.makeConstraints { make in make.top.equalToSuperview().offset(20) make.cente..

iOS 2025.05.20

[Swift]Optional을 사용하는 이유

✅ 옵셔널이란?옵셔널(Optional)은 값이 있을 수도 있고 없을 수도 있는 데이터 타입내부적으로는 .some(value)와 .none(nil)을 갖는 열거형(enum) 구조enum Optional { case none // 값 없음 (nil) case some(Wrapped) // 값 있음} ✅ Optional을 사용하는 이유값이 없을 수 있는 상황(사용자 입력, 네트워크 응답)을 타입으로 명확하게 표현할 수 있음컴파일 타임에 언래핑을 강제함으로써 실수를 미리 방지if let, guard let, ??, 옵셔널 체이닝 등 다양한 문법을 통해 안전하고 간결한 코드 작성 값이 없다는 상태를 단순히 "", 0, false와 구분해 진짜 "존재하지 않음(nil)" 상태로 표현..

Swift 2025.05.19