iOS 62

스택, 큐 구현 및 순환참조

스택, 큐 등의 자료구조와 ARC 및 순환참조에 대해서는 이전에 글을 작성한 적이 있지만 오늘 한번 더 직접 구현 해보며 복습하는 시간을 가졌다. 스택(Stack)후입선출, LIFO 구조함수 호출 스택에 사용됨struct stackTest { var numbers: [Int] = [] mutating func push(_ number: Int) { numbers.append(number) } mutating func pop() -> Int? { return numbers.isEmpty ? nil : numbers.removeLast() } func printNumber() { print(numbers) } func top()..

iOS

Struct와 Class / 프로토콜 사용해보기

Struct와 Class의 차이점Struct 값 타입(Value Type) 생성된 인스턴스가 모두 독립적 상속 불가능 메모리 구조: Stackstruct Product { var id: Int var name: String var price: Double var category: String}var a = Product(id: 1, name: "name1", price: 1000, category: "category1")var b = aa.price = 500print(a) //500.0print(b) //1000.0💡 a의 price를 변경해도 b의 price는 변경되지 않음 Class참조 타입(Reference Type)동일한 메모리를 여러 인스턴스가 사용할 수 있음상속 가능메..

iOS

Swift의 Copy-on-Write(COW)

오늘은 Swift의 Copy-on-Write(COW)에 대해 파헤쳐 볼 거예요. COW는 Swift 코드의 성능을 눈에 띄게 향상시켜주는 기술이랍니다!🤔 Copy-on-Write(COW)Copy-on-Write는 데이터 복사를 최대한 미루는 프로그래밍 기법이에요. 처음에는 복사본이 원본과 같은 데이터를 공유하고 있다가, 복사본을 수정하려고 할 때 복사가 일어나는 것입니다.일반적으로 값 타입 데이터(구조체, 열거형 등)를 다른 변수에 할당하면 즉시 복제본을 만들지만, COW를 사용하면 초기에는 원본과 복사본이 같은 메모리 데이터를 공유하다가 실제로 그 복사본을 수정하려는 시점에 복사가 일어납니다. 이렇게 하면 변경이 일어나지 않는 한 중복 복사를 피할 수 있어 메모리 사용량과 연산 시간을 절약할 수 있답..

iOS

Swift에서 리플렉션(Reflection)과 런타임 프로그래밍

오늘은 Swift의 리플렉션(Reflection)과 런타임 프로그래밍에 대해 알아보겠습니다.🤔 리플렉션리플렉션이란, 프로그램이 실행 중(runtime)에 자신의 구조나 객체의 정보를 검사하고, 때로는 수정까지 할 수 있는 프로그래밍 기법을 말합니다. 쉽게 말해, 코드가 자기 자신을 들여다보고 분석하는 능력이죠!Swift는 컴파일 타임의 안전성과 성능을 중시하기 때문에 리플렉션 기능이 다른 언어만큼 강력하지는 않습니다. 하지만 Swift에도 기본적인 리플렉션 기능이 제공되고 있으며, 주로 저장 프로퍼티에 대한 정보 열람에 사용됩니다. Swift의 리플렉션을 사용하면 타입의 모든 저장 프로퍼티 목록과 값을 읽어올 수 있습니다. 이러한 동적 메타프로그래밍을 통해 런타임에 코드의 구성 요소를 탐색하고, 때로는..

iOS

클로저(Closure)와 @escaping

오늘은 Swift의 클로저(Closure)와 함께 사용되는 @escaping 어트리뷰트(Attribute)에 대해 알아보려고 해요. @escaping은 클로저가 함수 밖에서도 유지되어야 할 때, 즉 함수의 실행이 종료된 후에도 클로저가 호출될 수 있는 경우에 사용되는 중요한 키워드예요.📌 클로저(Closure)란 무엇일까요?클로저는 코드 블록을 캡슐화하여 변수나 상수에 저장하거나 함수의 인자로 전달할 수 있는 독립적인 코드 조각이에요. 마치 이름 없는 함수와 비슷하죠. 클로저는 주변 컨텍스트의 변수나 상수를 캡처(Capture) 할 수 있습니다.// 클로저 예시let greeting = { (name: String) -> String in return "Hello, \(name)!"}print(g..

iOS

Combine

Combine은 시간이 지남에 따라 변화하는 값을 비동기적으로 처리하고, 데이터 스트림을 조합하고 변형할 수 있습니다.📌 Combine 프레임워크, 왜 등장했을까요?iOS 앱은 사용자 입력, 네트워크 요청, 센서 데이터 등 다양한 비동기 이벤트를 처리하고, 데이터의 변화에 따라 UI를 동적으로 업데이트해야 해요. 이러한 비동기 이벤트와 데이터 스트림을 효과적으로 처리하기 위해 Combine 프레임워크가 등장했어요.🤔 Combine 이전의 비동기 처리 방식Delegate 패턴: 객체 간의 통신을 위해 델리게이트를 사용하는 방식으로, 코드가 복잡해지고 가독성이 떨어질 수 있어요.NotificationCenter: 이벤트를 알리는 데 사용되지만, 타입 안전성이 떨어지고 디버깅이 어려울 수 있어요.Call..

iOS

Swift Testing

오늘은 Swift 6와 함께 새롭게 등장한 테스팅 프레임워크, Swift Testing에 대해 이야기해 보려고 해요. Swift Testing은 Apple이 새롭게 선보이는 테스팅 프레임워크로, 기존의 XCTest를 대체하고 더욱 직관적이고 유연한 테스트 환경을 제공하는 것을 목표로 하고 있어요. 📌 Swift Testing, 왜 등장했을까요?기존의 XCTest는 오랫동안 Swift와 Objective-C 개발에서 표준적인 테스팅 프레임워크로 사용되어 왔어요. 하지만, XCTest는 Objective-C 런타임에 기반을 두고 있어 Swift의 최신 기능들을 충분히 활용하지 못한다는 단점이 있었어요. 또한, 테스트 코드의 구조가 다소 경직되어 있어 유연한 테스트를 작성하기 어려웠죠.Swift Testin..

iOS

UI 테스트와 단위 테스트

오늘은 소프트웨어 테스팅의 두 축, 사용자 인터페이스(UI) 테스트와 단위(Unit) 테스트에 대해 이야기해 보려고 해요. 이 두 가지 테스트는 앱의 품질을 높이고, 버그를 줄이며, 장기적으로 유지 보수성을 향상시키는 데 중요한 역할을 해요. 📌 테스트, 왜 중요할까요?테스트는 소프트웨어가 요구 사항대로 잘 작동하는지 확인하는 과정이에요. 마치 우리가 새로운 전자 기기를 샀을 때, 모든 기능이 제대로 작동하는지 꼼꼼히 살펴보는 것과 비슷하죠. 테스트를 통해 다음과 같은 이점을 얻을 수 있어요.버그 발견: 코드를 실행하여 예상치 못한 동작이나 오류를 찾아낼 수 있어요.품질 향상: 테스트를 통해 소프트웨어의 신뢰성과 안정성을 높일 수 있어요.유지 보수성 향상: 코드를 변경하거나 기능을 추가할 때, 테스트를..

iOS

접근 제어자, package

오늘은 Swift 5.9부터 새롭게 등장한 접근 제어자, 바로 package 에 대해 이야기해 보려고 해요. package는 Swift Package Manager(SPM) 에서 모듈 간의 접근을 세밀하게 제어할 수 있도록 도입되었어요.📌 접근 제어자, 왜 중요할까요?접근 제어자는 코드의 특정 부분(클래스, 구조체, 함수, 변수 등)에 접근할 수 있는 범위를 제한하는 기능이에요. 이를 통해 다음과 같은 이점을 얻을 수 있어요.캡슐화(Encapsulation): 내부 구현을 숨기고, 외부에는 필요한 인터페이스만 공개할 수 있어요.모듈화(Modularity): 코드를 더 작은 단위로 나누고, 재사용성을 높일 수 있어요.유지 보수성 향상: 코드의 의존성을 줄이고, 변경의 영향을 최소화할 수 있어요.네임스페이..

iOS

옵셔널(Optional), weak 와 unowned 참조의 차이점

오늘은 Swift의 옵셔널(Optional), 그리고 그 중에서도 weak 와 unowned 참조의 차이점에 대해 집중적으로 알아볼 거예요. 옵셔널은 값이 있을 수도 있고 없을 수도 있는 타입을 나타내고, weak와 unowned는 순환 참조를 방지하기 위해 사용되는 특별한 참조 방식이에요. 📌 옵셔널(Optional)옵셔널은 값이 있을 수도 있고 없을 수도 있는 타입을 나타내요. 옵셔널은 ? 를 사용하여 선언해요.var name: String? = "초코" // 값이 있는 옵셔널var age: Int? = nil // 값이 없는 옵셔널 (nil)name 변수는 "초코"라는 문자열 값을 가질 수도 있고, nil 값을 가질 수도 있는 옵셔널 String 타입이에요. age 변수는 정수 값을 가질 수도 있..

iOS