객체지향적으로 공통구현을 제공하는 아이디어

J.Noma·2022년 2월 1일
0

Swift : 코딩가이드

목록 보기
1/3

서로 유사한 역할/기능을 가진 타입들이 있는 경우 우리는 공통구현 코드를 작성하여 공유하는 것이 효율적일 수 있습니다. 이런 공통구현 코드를 제공하는데는 여러 방법이 존재하는데 각 방법의 장.단점을 비교하여 최선이 무엇일지에 대해 생각해보았습니다

(개인적인 생각을 정리한 것으로 정답이 아닐 수 있습니다. 이와 관련한 모든 의견과 태클 환영합니다!)


🌀 상속 & 프로토콜 방식

1. 상속

우선 대표적인 방법 중 하나인 상속을 사용해봅시다. 아래와 같이 공통구현 코드를 위한 CommonClass를 정의하고 쌍둥이 Class TwinClassATwinClassB가 이를 상속받는 구조입니다

하지만 상속대상은 private으로 설정할 수 없기에 공통구현으로 제공하는 프로퍼티/메서드는 보호해줄 수 없다는 문제가 발생합니다. 또한 struct를 사용할 수 없고 class 사용이 강제되는 문제도 존재합니다

2. 프로토콜 extension

프로토콜 extension으로 공통구현 코드를 제공하더라도 단점은 유지됩니다. class 사용이 강제되진 않지만, 상속과 동일하게 공통구현의 대상이 되는 commonThing 프로퍼티와 commonBehavior() 메서드는 private으로 보호될 수 없습니다


🌀 해결방안

이처럼 상속과 프로토콜 extension을 단순히 공통구현을 제공하기 위해 사용하기엔 석연치 않은 부분이 존재합니다. 캡슐화(자율성 보존)를 유지하면서 공통구현을 제공할 방법이 없을까요? 다른 방법들도 있겠지만 크게 2가지 정도를 생각해보았습니다

1. fileprivate

가장 먼저 떠오른 방법은 상속과 프로토콜 extension을 사용하되 fileprivate으로 설정하여 외부 코드에서의 사용을 막는 것입니다. 하지만 이를 위해선 모든 타입을 하나의 파일에 작성해야 하므로 가독성을 고려하면 정답이 되긴 어렵다고 생각됩니다

2. 별도의 타입으로 분리

두 번째로 생각해본 방법은 공통구현 코드를 별도의 타입으로 분리하고 분리된 타입의 인스턴스를 private으로 소유하는 방식입니다. 쌍둥이 struct들이 commonThingcommonBehavior()를 자유롭게 사용할 수 있으면서 외부에서는 사용하지 못하도록 보호할 수 있습니다. 개인적으론 최선의 방법이지 않을까 생각됩니다

profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe

0개의 댓글