-
POP(Protocol-Oriented Programming) in Swift (1/2)iOS/Wiki 2022. 3. 28. 20:31
안녕하세요! 오늘은 WWDC2015에서 발표했던 POP에 대해서 알아보는 시간을 갖도록 하겠습니다.
바로 시작하겠습니다🐶
먼저, 영상의 소개에는 이런 문구가 적혀있다.
At the heart of Swift's design are two incredibly powerful ideas: protocol-oriented programming and first class value semantics. Each of these concepts benefit predictability, performance, and productivity, but together they can change the way we think about programming. Find out how you can apply these ideas to improve the code you write.
대충 스위프트 디자인의 핵심은 POP와 First class value semantics이며, 이 두 가지 개념은 예측가능성, 성능, 생산성에 도움을 주고, 이 개념들을 함께 사용하면 우리가 프로그래밍을 할때의 사고를 바꿀 수 있다고 한다.
먼저, 발표자는 Crusty라는 사람을 소개한다.
Crusty는 디버거를 신용하지 않고, IDE도 사용하지 않는 구식 프로그래머다.
시니컬하며, 성격이 나쁜 사람이라고도 하는데, 이 Crusty와 나눈 대화를 소개하는 형태로 발표를 진행한다.
어느 날, 발표자와 Crusty가 개발에 대해서 이야기를 나누던 중, Crusty가 이런 말을 한다.
"나는 OOP(Object-oriented Programming)를 하지 않을거야!"
그러나 발표자는 "OOP는 굉장히 멋진 방법이야! 클래스를 통해서 무엇이든 할 수 있어!" 라며 반대의견을 내고,
둘은 OOP의 장단점에 대해서 이야기를 나누게 된다.
먼저, 발표자가 OOP의 장점에 대해서 설명한다.
OOP의 장점(Classes Are Awesome)
Encapsulation(캡슐화)
연관된 데이터와 활동을 그룹화 시킬 수 있다.
Access Control(접근 제어)
코드 외부와 내부를 분리하기 위한 벽을 세울 수 있고, 외부에서의 접근을 제한할 수 있다. 따라서, 불변성을 유지할 수 있다.
Abstraction(추상화)
추상화를 통해 관련성 있는 아이디어를 클래스로 사용할 수 있다.
Namespace(이름 공간)
소프트웨어 성장에 따른 충돌을 예방할 수 있도록 하는 Namespace를 제공한다.
Namespace란?
다양한 종류의 객체를 식별하고 참조하기 위해 사용되는 일련의 부호
음.... 관련되어 있는 속성을 모아놓은 공간이라고 생각하면 될 것 같다.
Expressive Syntax
멋진 표현 구문을 가지고 있다. 따라서, 메서드와 프로퍼티를 작성하고, 함께 연결할 수 있다. 또한 Subscript를 작성할 수 있고, 연산 프로퍼티도 작성할 수 있다.
Extensibility
클래스는 확장성이 있다.
만약, 클래스 작성자가 필요한 뭔가를 빼먹었다면, 나중에 그것을 추가할 수 있다.
즉, 누가 클래스를 작성했던 간에 내가 원할 때 기능을 추가할 수 있다.
그리고, Access Control, Abstraction, Namespace로 인해서 프로그래밍의 가장 큰 과제인 복잡성을 관리할 수 있으며,
우리가 소프트웨어 개발에서 해결하려고 하는 문제를 해결할 수 있게 된다.
이렇게 발표자가 OOP의 장점에 대해서 설명하자, Crusty는 코웃음을 치며 이런 말을 남긴다.
"I can do all that with structs and enums!"
그러자 발표자는 class만의 기능인 inheritance(상속)에 대해서 설명한다.
슈퍼클래스는 실질적인 메서드를 정의할 수 있고, 서브클래스에서는 상속받는 것만으로 슈퍼클래스의 모든 작업을 수행할 수 있다.
그리고 진짜 중요한 부분은 override에 관한 부분인데,
슈퍼클래스를 작성할 때 작업의 일부를 서브클래스가 override 할 수 있는 개별 커스터마이제이션 포인트를 두고,
이 커스터마이징이 상속된 서브클래스에 오버레이 되는 것이다.
이런 방식을 통해서, 복잡한 로직을 재사용 할 수 있고, 다형성과 유연성을 가능하게 한다.
발표자는 이런 상속의 장점을 설명하며, "클래스의 힘 앞에 무릎을 꿇어라!!!!" 라며 Crusty를 잡았다고 확신한다.
하지만, Crusty는 인정하지 않고 반론을 준비한다.
"나는 너가 말한 커스터마이징을 구조체를 통해서 이미 하고 있어!!
그리고, 맞아, 클래스 좋지, 근데 이제 비용에 대해서 얘기해볼까? 나는 클래스에 세가지 불만이 있어!!"
Crusty는 발표자에게 클래스의 단점에 대해서 얘기한다.
OOP의 단점
1. Implicit Sharing(암묵적 공유)
A가 B에게 데이터를 건네주는 상황에서,
A가 B에게 정상적인 데이터를 건네주면 B는 "좋아, 대화가 끝났군"이라고 생각할 것이다.
하지만 갑자기 A가 정상적인 데이터에 싫증을 느끼고, "누가 포니를 싫어하겠어?" 하면서 데이터를 Ponies로 바꾼다면?
Ponie 이런 상황이 발생한다면,
B는 처음에 받았던 정상적인 데이터를 기대했는데, 갑자기 Ponie 데이터를 얻게될 것이다.
문제는 B가 Ponies 데이터를 얻게 될 때 까지 어떤 문제가 일어난 것인지 모른다는 것이다.
Crusty는 이 문제가 어떻게 흘러갈지 설명한다.
"코드 내의 버그를 뭉개버리기 위해서 미친듯이 모든 것을 복사하기 시작할거야.
하지만, 복사본이 많아질수록 코드가 느려지겠지.
그리고, Dispatch Queue에서 어떤 작업을 처리하고 갑자기 race condition에 빠져버릴거야.
쓰레드가 mutable state를 공유하게 되니까!!
그래서, 너는 불변성을 추가하기 위해서 lock들을 걸겠지. 하지만 이런 lock들 때문에 코드가 더 느려지고, deadlock에 빠져버릴거야.
이렇게 점점 복잡성이 증가하고, 나중에는 이런 상황을 한 단어로 요약할 수 있겠지. 버그."
2. Inheritance All Up In Your Business(모든 로직을 상속)
그리고 Crusty는 상속에 대한 불만을 이야기한다.
"클래스 상속이 너무 거슬려. 우선, 너무 획일적이야. 딱 하나의 클래스밖에 상속받지 못하잖아.
만약 여러 속성을 추상화한 데이터 모델이 필요하다면, 어떻게 할거야??
그리고 하나의 클래스밖에 상속받지 못하기 때문에, 관련된 모든 것이 들어가게 되면서 비대해질 수 밖에 없지.
또, 클래스를 정의하는 순간에 슈퍼클래스를 정해야해. 나중에 선택할 수 없어.
마지막으로, 슈퍼클래스에 저장 프로퍼티가 있다면, 그것들을 수용해야해. 선택권이 없다는 것이지.
그리고 그 저장 프로퍼티 때문에 이니셜라이징을 해야하지. designated나 convenience, required 같은것들 말이야."
3. Lost Type Relationships
"그리고 class는 타입 간의 관계가 중요한 상황에 적합하지 않아.
예를 들면, 비교와 같은 대칭 연산 말이야. 너도 이런적 있을껄?"
그리고 다음과 같은 예시를 들어준다.
위의 코드는 상속을 통해서 두 Double 타입 숫자를 비교하는 코드다.
이 상황에서 발생할 수 있는 문제점이 있는데,
1. 슈퍼클래스인 Ordered의 메서드 내부에 무언가 있어야 한다.
프로토콜처럼 함수의 설계도만 가지고 싶더라도, 메서드 내부는 비워둘 수 없다.
이런 상황에서는 fatalError같은 에러밖에 넣을 수 없다.
2. Ordered 클래스를 상속받는 서브클래스인 Number에서 다운캐스팅이 필요하다.
precedes 메서드의 매개변수인 other는 Ordered 타입이므로,
value와 메서드 매개변수의 value를 비교하기 위해서는 Number 타입으로 다운캐스팅을 해주는 작업이 필요하다.
그렇다면, 이런 문제점들을 해결하기 위해선 어떻게 해야할까요?
다음 포스팅에서는 이런 문제점들을 어떻게 해결할지에 대해서 작성해보도록 하겠습니다 🐶
Protocol-Oriented Programming in Swift - WWDC15 - Videos - Apple Developer
At the heart of Swift's design are two incredibly powerful ideas: protocol-oriented programming and first class value semantics. Each of...
developer.apple.com
'iOS > Wiki' 카테고리의 다른 글
SOLID in Swift (0) 2022.04.04 ReactorKit 사용기 (0) 2022.03.05 Swift ARC(Automatic Reference Counting) (0) 2022.01.15 Localization (0) 2022.01.14 페이지네이션(Pagination) (0) 2022.01.13