Classes Are Awesome
Encapsulation
: 관련된 데이터와 기능을 묶음
Access Control
: 코드 내부와 외부를 구분하는 벽을 만들 수 있다 -> 불변성 유지
Abstraction
: 클래스를 이용해 소통의 창을 만들 수 있다
Namespace
: 소프트웨어가 성장하며 발생하는 충돌을 막아주는 네임스페이스 제공
Expressive Syntax
: 메서드 호출과 프로퍼티를 작성하고 연결할 수 있다, 서브스크립트 사용
Extensibility
: 클래스는 확장성을 위해 열려 있다
"Type Are Awesome"
=> I can do all that wirh structs and enums
Swift에서 이름을 지정할 수 있는 타입은 모두 일급 시민으로 이런 모든 이점들을 이용할 수 있음
그럼 클래스의 특별한 점은?
슈퍼클래스에서 복잡한 논리로 실질적인 메소드를 정의
- 상속을 통해 서브클래스는 이런 메서드를 무료로 사용
- 해당 작업을 오버라이드로 변경해서 사용할 수 있음
=> 어려운 논리를 재사용할 수 있으면서 동시에 유연성과 변형이 가능
봐! 클래스 이렇게 좋지?^^
=> NoNo
강력하긴 하지만 비용은?? 🤔
클래스는 참조 타입이기 때문에 명시적으로 데이터를 공유하게 됨
문제) A랑 B랑 한 데이터에 대해 얘기하다가 A가 홀연히 바꿔버리면 B는 이상한 데이터를 참조하게 됨
코드의 버그를 없애려고 값을 여기저기 복사하다가 너무 많은 복사본이 생기고 코드가 느려짐
-> 디스패치큐에서 뭔가 처리하고 스레드가 변경 가능한 상태를 공유하면서 갑자기 경쟁 조건이 발생
-> 불변성을 보호하기 위해 잠금(Lock)을 추가
-> lock은 코드를 느려지게 하고 교착 상태로 이어질 수 있음
-> 복잡성을 더하고 곧 버그 🤯
Defensive Copying
Ineffeciency
Race Condition
Locks
More Ineffeciency
Deadlock
Bug!
Cocoa 문서에서도 반복하는 동안 mutable한 컬렉션을 수정하는 것을 경고함
-> 클래스의 mutable 상태를 Implicit Sharing하기 때문에
근데 그건 cocoa collection이고 swift는 안됨^^
왜? swift collection은 값 유형이라 반복하는 컬렉션과 수정하는 컬렉션이 구별됨
슈퍼 클래스 하나를 가질 때 여러 추상화를 모델링 하고 싶으면? 🤷
컬렉션이 될 수 있고 직렬화가 될 수 있나? -> 클래스라면 ❌
확장할 때
가 아니라 클래스를 정의하는 순간
에 슈퍼클래스를 선택해야 함 ~~~> (그래서 델리케이트 패턴을 사용하는 것)
어떤 역할을 하는 메서드가 있다고 하자. (예를 들어 정렬하기)
추상화 매커니즘이 필요
=> 원치 않는 인스턴스 데이터나 관련 initialize 복잡성을 강요하지 않는 것
=> 재정의 항목에 모호성을 남기지 않기
➡️ 프로토콜은 이러한 이점을 모두 가짐 = Swift를 프로토콜 지향 프로그래밍 언어로 만든 이유
Swift는 객체 지행 프로그래밍에 적합하지만 중심에는 프로토콜 지향이 있음
Self
로 매개변수 타입을 자체 타입으로 제한할 수 있음other
이 value
를 가진 것을 알 수 있어 타입 캐스팅이 필요하지 않음✏️ 요약
- 슈퍼클래스보다 훨씬 더 큰 프로토콜을
- 프로토콜 확장