iOS/SWIFT
-
[Swift] - Swift의 Task, @MainActor, Task.detached 정리: 언제, 왜, 어떻게 써야 할까?iOS/SWIFT 2025. 5. 3. 11:55
📚 목차 개요@MainActor란?Task {} vs Task.detached {} 차이메모리와 CPU 관점 차이병렬 작업 취소 & 완료 감지 (withTaskGroup)정리1. 개요 Swift의 Concurrency는 async/await, Task, Actor 등을 통해 안전하고 효율적인 비동기 처리를 제공한다.하지만 Task {}, Task.detached {}, 그리고 @MainActor 사이의 차이점과 사용법은 정확히 이해해야 제대로 활용할 수 있습다. 이 포스트에서는 이 세 가지를 중심으로, 실제 동작 원리, 메모리/CPU 관점 성능 차이,그리고 TaskGroup을 통한 취소 및 완료 감지 방법까지 정리할 것이다. 2. @MainActor란? @MainActor는 특정 함수, 속성, 클래스..
-
[Swift] - Swift에서 클래스 내부 구조체의 메모리 위치와 성능 차이iOS/SWIFT 2025. 5. 3. 10:13
✍️ 목차 개요클래스와 구조체의 메모리 차이클래스 내부의 구조체는 어디에 저장될까?구조체 복사와 성능 영향정리 1. 개요 Swift는 값 타입(struct)과 참조 타입(class)을 명확히 구분하는 언어임.이번 포스트에서는 클래스 내부에 포함된 구조체 인스턴스가 메모리상 어디에 저장되는지,그리고 구조체 복사가 성능에 어떤 영향을 미치는지에 대해 살펴보자. 2. 클래스와 구조체의 메모리 차이 🔹 클래스 (Reference Type)인스턴스는 Heap에 저장됨변수는 Heap에 있는 객체의 **포인터(reference)**를 stack에 저장ARC(Automatic Reference Counting)로 메모리 관리됨 🔹 구조체 (Value Type)인스턴스는 Stack에 저장됨값이 복사되어 전달됨 (..
-
[Swift] - 배열 루프를 순회하는 방식(enumerated,indices,Range(0..<arr.count))iOS/SWIFT 2025. 3. 20. 20:29
팀원들과 코드리뷰를 하던 중 모두 배열 루프를 돌리는 방식의 차이가 모두 다르다는 것을 깨달았다.기능적으로는 모두 같은 결과가 나오는 코드를 작성할 수는 있지만, 난 항상 이런 동일한 결과가 나오는 코드는 성능적인 차이가 있을까에 대한 고민을 많이 하는 편이다. 제목처럼 오늘은 배열 루프를 돌리는 방식(enumerated(),indices,Range(0..arr.count)에 대해서 하나씩 살펴볼 것이다. 1.Range(0..arr.count) 이렇게 보면 뭔가 어색하지만 이 방식은 다음과 같이 표현한다.let arr = ["a", "b", "c"]for i in 0..기본적으로 swift에서 for문을 돌리는 정석적인 방법이다. 직관적이나, 개발자가 직접 숫자로 범위를 조작하기 때문에 작성을 실수할 ..
-
[Swift] - Character와 EGC(Extended Grapheme Cluster)iOS/SWIFT 2025. 3. 14. 11:26
학습을 하다 알게된 점이 생겨 급하게 포스팅을 한다.과제로 코드를 작성하다가 문득 이런 생각이 들었다.Character는 거의 사용해본적이 없는데 무슨 용도일까? 이 의문을 해결하기 위해 Character를 처음부터 조사하기 시작했다. 바로 본론으로 가보자let text = "ㅁㄴㅇㄹ"let chars: [Character] = Array(text) //["ㅁ", "ㄴ", "ㅇ", "ㄹ"] "ㅁㄴㅇㄹ"은 4개의 한글 자음으로 구성된 문자열이고, 개별 문자(Character)들은 각각 하나의 유니코드 스칼라로 표현된다.Array(text)를 호출하면 Swift는 String을 Character 배열로 분리한다. 자 여기서 유니코드 스칼라가 뭐냐 유니코드 스칼라 (Unicode Scalar) U+0000 ~..
-
[Swift] - mutatingiOS/SWIFT 2024. 2. 6. 15:08
오늘은 mutating에 대해서 포스팅 해보겠다. SwiftUI의 경우에는 보통 @State, @Binding, @EnvironmentObject 등등 속성래퍼를 사용하여 뷰의 상태를 관리한다. 하지만 그런것들을 쓰지 않는 UIkit의 경우 어떨까? mutating은 함수나 클로져 내에서 해당 구조체나 열거형 내의 인스턴스 프로퍼티를 변경하려 할때 사용된다. 구조체나 열거형은 값 타입이므로 인스턴스의 프로퍼티를 변경하려면 메서드도 해당 인스턴스를 변경 가능하도록 선언되어야 한다. 이때 메서드 선언 앞에 mutating 키워드를 사용하여 해당 메서드가 해당 인스턴스를 변경할 수 있음을 나타낸다. 구조체 사용을 예시를 들어보자 struct MyStruct:Struct { var myProperty: Int ..
-
[SWIFT] - 제네릭(Generic)iOS/SWIFT 2023. 6. 14. 15:16
요즘 프로젝트를 하면서 더 나은 코드를 위해 TDD방법론을 실천중에 있다. 항상 과거의 나의 코드는 미래의 나의 코드와 비교가 되기 때문에 옛날에 짜놨던 코드들도 들춰보면서 경악을 하며 수정하곤 한다. 빌드업을 이렇게 쌓은 이유는 이번에 프로젝트를 위한 공부를 하게 되면서 "아니 제네릭 개쩔잖아..?! " 라는 생각을 하게 되었다. 제네릭이라는 개념 자체를 알게 된건 오래전이지만 이걸 실제 개발을 하면서 어느 상황에서 사용해야할지 감이 오지 않아 사용해본적이 없었다. 이제 슬슬 감이 오는듯하니 포스팅을 시작해보겠다. 다음 메서드를 보자 func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } 여러..
-
[SWIFT] Lazy #8iOS/SWIFT 2022. 12. 19. 18:19
블로그를 안쓴지 벌써 두달이 넘었다.. 공백기 동안 개인프로젝트 진행과 여행을 다녔다. 물론 값진 시간이였지만 블로그 작성과 기본기를 다지는 시간이 매우 부족했다고 느낀다. 그래서 다시 블로그 작성을 하며 그동안 쉬었던 공부를 다시 하려고 한다. 오늘은 저번 연산프로퍼티편에서 다루지 못한 lazy 키워드에 대해서 포스팅을 해볼 예정이다. Lazy 이름 뜻대로 직역하면 "게으른" 이라는 뜻이다. 왜 이름이 이런가 했더니 살짝 억까 라는 생각이 들었다. 프로퍼티 앞에 lazy키워드를 붙이면 그 프로퍼티를 사용하기 전까지는 연산이 되지 않는다. 예제 코드를 일단 보자 import Foundation struct Info { var name: String = "콰랑" var age: Int = 24 } clas..
-
[SWIFT] 타입프로퍼티 #7iOS/SWIFT 2022. 10. 10. 16:25
오늘은 저번에 이어서 타입프로퍼티에 대한 내용을 포스팅 해보겠다. 타입 프로퍼티 클래스, 구조체, 열거형에서 사용되는 인스턴스가 타입 자체에 속하는 프로퍼티 이게 무슨 말인지 나도 처음에 이해가 잘 되지 않았다. 클래스, 구조체, 열거형에 사용되는 인스턴스는 저장/연산프로퍼티인데 그것이 타입 자체에 속하는 프로퍼티인 것이다. 그렇기 때문에 객체를 생성해서 그 안으로 접근이 불가능하다. 옛날에 자바를 배울 때 사용했던 클래스변수와 같은 개념인 것이다. 타입 프로퍼티의 특징 모든 타입이 공통적인 값을 정의하는 데 유용 EX) 싱글톤 패턴 저장,연산 프로퍼티 앞에 static 키워드를 붙여서 사용 자동으로 lazy로 작동됨(lazy 키워드를 붙일 필요는 없음) 저장 타입 프로퍼티일 경우 항상 초기값이 존재해야..