목록전체 글 (51)
J
`map`, `compactMap`, `flatMap`은 Swift의 고차 함수로 컬렉션, 옵셔널, 시퀀스 등 변환 작업을 적용할 때 사용.이들은 각기 다른 방식으로 데이터를 변환하고, 특정 조건에 따라 값을 필터링하거나 중첩된 구조를 평탄화.1. `map`컬렉션이나 옵셔널, 시퀀스의 각 요소에 주어진 변환 함수를 적용하여 새로운 컬렉션이나 값을 생성.원래의 데이터 구조는 유지.컬렉션에서 사용let numbers = [1, 2, 3, 4]let squaredNumbers = numbers.map { $0 * $0 }print(squaredNumbers) // 결과: [1, 4, 9, 16]옵셔널에서 사용let optionalValue: Int? = 3let result = optionalValue.map..
1. Swift의 init이란?Swift에서 init은 클래스, 구조체, 또는 열거형의 생성자(Initializer)로, 인스턴스를 초기화하는 역할.init 메서드는 인스턴스의 모든 저장 프로퍼티를 초기화하고, 초기 상태를 설정함.2. init의 기본 특징모든 저장 프로퍼티 초기화저장 프로퍼티는 초기화되지 않으면 에러가 발생하게 됨.반환 값이 없음init 메서드는 특별히 반환값을 가지지 않음.자동 초기화 제공Swift는 프로퍼티에 초기값이 있거나, 모든 프로퍼티가 초기화 가능한 경우 자동 초기화 메서드를 제공.3. 기본 문법struct Person { var name: String var age: Int init(name: String, age: Int) { self.name..
1. weak와 unowned란?Swift에서는 메모리 관리를 위해 강한 참조(Strong Reference), 약한 참조(Weak Reference), 비소유 참조(Unowned Reference)를 제공.weak와 unowned는 참조 타입 사이에서 강한 순환 참조(Strong Reference Cycle)를 방지하는 데 사용.둘 다 ARC(Automatic Reference Counting)의 메모리 누수 문제를 해결하는 데 중요한 역할.2. weak와 unowned의 공통점강한 참조(Strong Reference)를 생성하지 않음.참조하는 인스턴스가 메모리에서 해제될 수 있도록 함.강한 순환 참조를 방지하여 메모리 누수를 줄임.3. weak와 unowned의 차이점 weakunowned참조 대상O..
1. `self`: 현재 인스턴스를 나타내는 키워드`self`는 현재 인스턴스 자체를 참조.Swift에서 모든 인스턴스 메서드와 이니셜라이저에는 암묵적으로 `self`가 포함되어 있으며, 필요한 경우 이를 명시적으로 사용 가능.1.1 사용 목적현재 인스턴스 참조메서드나 이니셜라이저 내부에서 `self`를 사용하면, 해당 메서드가 호출된 인스턴스를 참조.이를 통해 인스턴스 프로퍼티에 접근하거나 인스턴스 메서드를 호출할 수 있음.이름 충돌 해결이니셜라이저나 메서드의 파라미터 이름이 인스턴스 프로퍼티와 동일한 경우, `self`로 인스턴스 프로퍼티를 참조.클로저 캡처클로저 내부에서 `self`를 사용하면, `self`가 클로저 외부의 인스턴스를 참조.1.2 동작 원리와 예제struct Car { var ..
1. `associatedtype`이란?`associatedtype`은 프로토콜 내에서 사용되는 타입의 플레이스홀더를 정의하는 데 사용.이를 통해 프로토콜을 채택하는 타입이 구체적인 타입을 지정하도록 요구할 수 있음. `associatedtype`은 프로토콜을 보다 유연하고 재사용 가능하게 만들어 줌.특히, `Generic`과 함께 사용하면 강력한 타입 추론과 코드 유연성을 제공할 수 있음.2. `associatedtype` 기본 문법protocol ProtocolName { associatedtype TypeName // 프로토콜 요구 사항}`associatedtype`은 프로토콜의 타입 매개변수와 같은 역할.프로토콜을 채택한 타입은 `associatedtype`으로 선언된 타입을 구현하면서..
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의 성능을 최대한 활용한다고 ..