목록iOS/Swift (24)
J
1. Protocol이란?Protocol(프로토콜)은 특정 작업이나 기능에 대한 요구 사항의 집합을 정의하는 데 사용.프로토콜은 클래스, 구조체, 열거형 등에서 구현할 수 있으며, 객체 지향 프로그래밍의 인터페이스와 유사한 역할.2. Protocol의 주요 특징구현 강제화프로토콜을 채택한 타입은 프로토콜에서 정의한 요구 사항을 반드시 구현해야 함.유연한 설계클래스, 구조체, 열거형 모두 프로토콜을 채택할 수 있음.다중 채택 가능하나의 타입이 여러 프로토콜을 채택할 수 있음.타입 독립성프로토콜을 통해 타입 간 의존성을 줄이고, 코드 재사용성을 높일 수 있음.3. Protocol의 기본 문법protocol ProtocolName { // 요구 사항 정의}4. Protocol의 사용 예제protocol ..
1. Generic이란?Generic(제네릭)은 코드의 재사용성과 유연성을 극대화하기 위해 사용.특정 타입에 국한되지 않고, 다양한 타입에서 동작할 수 있는 코드를 작성할 수 있도록 함.Generic을 사용하면 코드의 중복을 줄이고, 타입 안정성을 유지하면서도 유연한 구조를 구현이 가능.2. Generic의 동작 원리Generic은 타입을 플레이스홀더로 정의하여, 실제 타입은 코드가 호출될 때 결정.이렇게 하면 동일한 로직을 여러 타입에 대해 중복 작성할 필요가 없음.3. Generic의 사용 예제Generic 타입은 꺾쇠 괄호()를 사용하여 선언.func swapValues(_ a: inout T, _ b: inout T) { let temp = a a = b b = temp}var x..
GCD vs Swift Concurrency: 스레드 관리와 성능GCD(Grand Central Dispatch)와 Swift Concurrency는 비동기 작업을 처리하고자 할 때, 스레드 관리 방식에 차이가 존재.이 차이는 성능, 자원 효율성, 스레드 관련 문제에서 나타나게 됨.특히 thread explosion이나 컨텍스트 스위칭과 같은 문제는 GCD에서 발생할 수 있음.1. GCD에서의 스레드 관리1.1. GCD의 기본 동작GCD는 스레드 풀(thread pool)을 사용하여 작업을 처리. 비동기 작업이 큐에 적재되면, 큐는 적절한 스레드를 선택하여 작업을 실행.시스템 리소스를 효율적으로 관리하기 위해 여러 개의 작업을 동시에 병렬 처리하며, 이를 통해 멀티코어 CPU의 성능을 최대한 활용한다고 ..
Swift ConcurrencySwift Concurrency는 Swift에서 비동기 작업을 안전하고 직관적으로 관리할 수 있도록 제공되는 기능.비동기 함수, `async`/`await`, `actor`, `Task`, `TaskGroup` 등의 개념을 포함하여 비동기 작업, 동시성 문제를 간결하게 해결할 수 있음.이를 통해 비동기 코드를 동기 코드처럼 작성할 수 있음.1. 비동기 프로그래밍과 동시성비동기 프로그래밍은 여러 작업을 동시에 처리하여 응답성을 향상시키는 것이 목표.네트워크 요청, 파일 I/O, 데이터베이스 작업 등은 비동기로 실행되어야 UI가 블로킹되지 않고, 사용자에게 원활한 경험을 제공할 수 있음.여기서 동시성(Concurrency)은 여러 작업을 동시에 실행하는 것이 아니라, 병렬로 처..
GCD (Grand Central Dispatch)GCD는 Apple이 제공하는 비동기 작업과 동시성 처리를 위한 저수준 API.멀티코어 프로세서의 성능을 최대로 활용할 수 있도록 도와주며, 스레드 관리를 자동 처리하여 개발자가 직접 스레드를 생성하고 관리하는 부담을 덜어 줌.Swift에서는 GCD를 사용하여 백그라운드 작업, UI 업데이트, 파일 입출력, 네트워크 요청과 같은 작업을 효율적으로 처리할 수 있음.1. GCD의 주요 개념1.1. 작업 단위: 작업(Tasks)GCD에서는 모든 작업을 작업 단위로 처리.이 작업은 비동기로 실행할 수 있으며, 각각의 작업은 클로저 형태로 작성.GCD는 개발자가 요청한 작업을 큐에 적재하고, 적절한 스레드에서 병렬로 처리.1.2. 큐: Dispatch QueueD..
ARC (Automatic Reference Counting)ARC는 Swift에서 참조 타입(클래스 인스턴스)의 메모리 관리를 자동으로 처리하는 메커니즘.런타임 시 객체의 참조 횟수를 추적하여 객체가 더 이상 사용되지 않을 때 메모리를 해제하는 방식으로 메모리 누수 방지.Swift에서는 개발자가 직접 메모리를 관리하지 않고, ARC가 자동으로 메모리 해제를 처리해주기 때문에 메모리 관리가 간편.그러나 참조 사이클과 같은 메모리 누수를 유발할 수 있는 문제를 이해하고 적절히 해결해야 함.1. ARC 작동 방식ARC는 객체가 생성될 때 그 객체를 참조하는 참조 카운트(reference count)를 증가시키고, 더 이상 참조되지 않으면 감소시킴.참조 카운트가 0이 되면 ARC는 해당 객체를 메모리에서 해제..
1. mutating 키워드란?Swift에서 구조체(struct)와 열거형(enum)은 값 타입. 기본적으로 값 타입은 인스턴스의 프로퍼티를 직접 수정할 수 없음.이를 해결하기 위해 Swift에서는 mutating 키워드를 통해, 구조체 또는 열거형의 메서드에서 인스턴스 자체를 수정할 수 있도록 함.2. mutating의 역할구조체나 열거형의 프로퍼티를 수정할 수 있도록 메서드에 선언.메서드가 호출될 때, 인스턴스의 새로운 복사본을 생성하고, 그 복사본을 수정.3. 문법mutating 키워드는 메서드 정의 앞에 추가.struct Counter { var count = 0 mutating func increment() { count += 1 }}var counter = Coun..
1. inout 파라미터란?Swift는 기본적으로 함수의 파라미터를 값 타입으로 취급.즉, 함수 내부에서 파라미터의 값을 변경하더라도 함수 외부의 원본 값에는 영향을 미치지 않음. 하지만 특정 상황에서는 함수 내부에서 값을 변경하고, 그 변경된 값을 함수 호출부에 전달해야 할 때가 있음.이때 inout 키워드를 사용하면 파라미터의 값을 함수 외부로 전달이 가능.2. inout 파라미터의 동작 원리inout 키워드는 함수를 호출할 때, 파라미터의 값을 복사하고 함수 내부에서 해당 복사본을 수정한 후, 수정된 값을 다시 원본으로 복사하는 방식으로 동작.즉, inout은 직접 참조를 전달하는 것처럼 보이지만, 실제로는 복사-수정-반복사라는 메커니즘을 사용.3. 문법inout 파라미터를 선언하려면 함수의 파라미..
1. Escaping Closure란?Swift에서 클로저(Closure)는 코드 블록을 캡슐화하여 나중에 실행하거나 전달할 수 있는 강력한 도구.클로저는 기본적으로 함수 내부에서 실행되도록 설계되어 있지만, 특정 상황에서는 함수가 종료된 이후에도 실행될 수 있음.이런 경우, 클로저가 함수의 스코프를 벗어날 수 있다는 것을 나타내기 위해 @escaping 키워드를 사용.2. Escaping Closure의 정의@escaping 클로저란, 함수의 수명보다 더 오래 살아남는 클로저를 의미.이는 클로저가 함수의 실행이 종료된 후에도 외부에서 참조되거나 호출될 가능성이 있는 경우를 나타냄.3. Escaping Closure의 주요 특징함수의 스코프를 벗어남.클로저가 함수 외부로 전달되거나 저장될 경우.비동기 작..
값 타입(Value Type) vs 참조 타입(Reference Type)Swift에서는 모든 데이터가 값 타입 또는 참조 타입으로 분류.이 두 타입은 메모리에서 데이터를 저장하고 관리하는 방식이 다르며, 각각의 타입은 데이터의 복사 및 공유 방식에 큰 차이가 존재.1. 값 타입(Value Type)값 타입은 데이터를 복사하여 저장. 변수나 상수에 값을 할당하거나, 함수에 값을 전달할 때 새로운 복사본 생성.따라서 값 타입을 사용하는 경우, 각각의 인스턴스는 독립적인 값을 가지며, 다른 변수에 영향을 주지 않음.대표적인 값 타입: struct, enum, tuple1.1. 특징복사값을 할당하거나 전달할 때 값이 복사.독립성하나의 값 타입 인스턴스가 변경되어도 다른 인스턴스에 영향을 미치지 않음.성능스택(..