본문 바로가기

전체 글131

프로토콜 지향 프로그래밍에 관하여 프로토콜 지향 프로그래밍 -프로토콜 지향 프로그래밍은 Swift에서 가장 핵심 패러다임 중 하나이다. Swift는 객체 지향 프로그래밍 패러다임을 지향하기도 하는데, 보통 객체 지향 프로그래밍은 대부분 클래스의 상속을 이용해서 타입에 공통적인 기능을 구현한다. 하지만 Swift 표준 라이브러리의 코드를 보면, 대부분 구조체로 기본 타입이 구현되어 있다. 클래스와 같은 참조타입을 사용하는 것은 참조 카운트, 동적 할당 등으로 인해 리소스가 비싸다. 또한 참조타입의 암시적인 공유로 인한 데이터 불일치 문제를 야기할 수 있다. 클래스의 상속 기능은 슈퍼클래스들에 대한 정보를 알고 있어야 하기 때문에 코드가 복잡해질 수 있다. 클래스의 비싼 리소스 한계점은 값 타입을 사용하여 해결할 수 있다. 하지만 값 타입만.. 2023. 6. 7.
Protocol과 associatedtype에 관하여 프로토콜과 제네릭 -제네릭은 유연하고 재사용 가능한 타입을 작성하는데 도움이 되는 범용 타입이다. 즉, 제네릭은 범용성을 위한 기능이다. 그럼 Protocol에서 범용성을 가지기 위해 제네릭을 사용하는건 어떨까요? protocol MyProtocol { //An associated type named 'T' must be declared in the protocol 'MyProtocol' or a protocol it inherits func performAction(with item: T) } 위 코드는 컴파일 오류를 발생시킨다. 이렇게 프로토콜에서 제네릭을 적용하는 것은 허용되지 않는다. 대신 프로토콜에서는 'associatedtype' 을 사용하여 제네릭과 같은 기능을 구현할 수 있다. associ.. 2023. 6. 6.
Protocol Composition에 관하여 Protocol Composition -Protocol Composition이란 타입이 여러 프로토콜을 묶어서 사용할 수 있는 기능이다. protocol CanFly { func fly() } protocol CanSwim { func swim() } struct Duck: CanFly, CanSwim { func fly() { print("오리 날다.") } func swim() { print("오리 수영하다") } } let duck = Duck() duck.fly() //"오리 날다." duck.swim() //"오리 수영하다" 위 코드에서 'Duck' 구조체는 'CanFly', 'CanSwim' 프로토콜 모두 준수한다. 따라서 각 프로토콜에 있는 기능들을 모두 사용할 수 있다. 메서드의 매개변수 .. 2023. 6. 6.
Protocol-Extension에 관하여 Protocol-Extension -프로토콜 확장은 프로토콜에 Extension을 사용하여 연산 프로퍼티나 메소드, 이니셜라이저 등을 추가할 수 있게한다. 그리고 이 프로토콜을 채택하는 타입은 요구사항을 구현하지 않고, 이 기능을 사용할 수 있다. protocol Run { func run() } struct Dog: Run { func run() { print("Run!!") } } struct Cat: Run { func run() { print("Run!!") } } struct Tiger: Run { func run() { print("Run!!") } } 위 코드를 보면 'Dog', 'Cat', 'Tiger' 모두 'Run' 프로토콜을 채택하고 있으며, 요구사항인 'run' 메서드를 모두 동일하.. 2023. 6. 5.
타입으로서 프로토콜에 관하여 타입으로서 프로토콜 일급객체 프로토콜 -Swift에서 프로토콜은 일급 객체다. 일급 객체란 특정 타입이 다음과 같은 특성을 가지고 있을 때를 말한다. 1) 변수나 데이터 구조에 저장 가능 2) 함수의 매개변수로 전달 가능 3) 함수의 반환값으로 사용 가능 4) 런타임에 생성 가능 따라서 프로토콜을 변수, 상수, 배열, 딕셔너리 등의 값으로 사용하거나, 함수의 매개변수나 반환값으로 사용할 수 있다는 것을 의미한다. 프로토콜의 일급 객체 특성은 프로토콜을 유연하게 사용할 수 있도록 한다. 프로토콜을 변수나 상수로 사용하기 protocol Describable { func describe() -> String } class Dog: Describable { func describe() -> String { r.. 2023. 6. 5.
WWDC2021 - ARC in Swift - Basics and beyond 에 관하여. ARC에 대한 개념을 정리하던 중, ARC에 대한 깊은 이해를 위해 WWDC의 ARC 관련 세션을 보고 정리해본다. Object lifetimes and ARC -객체의 수명주기와 ARC에 대해서 알아보자. 객체의 수명주기는 init() 초기화에서 시작되고, 마지막 사용에서 종료된다. ARC는 수명주기가 종료된 객체를 메모리에서 해제시킨다. ARC는 참조 카운트를 통해 객체의 수명주기를 추적한다. Swift의 컴파일러가 retain/release 작업을 주입한다. Swift의 런타임에 'retain' 은 참조 카운트를 증가시키고, 'release' 는 참조 카운트를 감소시킨다. 참조 카운트가 0이 되면 객체는 메모리에서 할당 해제된다. 이 작업들이 어떻게 작동되는지 예시를 통해 알아보자. 우리가 여행 앱.. 2023. 5. 31.