본격적으로 자료구조를 알기 전에, Abstract Data Type(이하 ADT)를 알아봅시다.
ADT를 직역하면 추상 자료형 이라는 뜻입니다. 즉, 어떻게 코드를 구성했는지 그 내용을 추상화하고 명칭만 남겼다고 볼 수 있습니다. 추상 자료형에는 아래와 같은 속성을 가지고 있습니다.
1. Characters : 추상 자료형의 세부 속성
2. Operations : 추상 자료형의 연산
첫 번째 속성인 Characters는 추상 자료형을 구성하는 구성요소입니다. 예를 들면, 비행기가 하나의 ADT라고 생각합시다. 그러면 “비행기”의 Characters는 날개, 제트엔진, 바퀴, 문 이 될 것입니다.
두 번째 속성인 Operations는 추상 자료형의 연산을 뜻합니다. 위 비행기 예시를 적용하면, 이륙을하다
, 착륙을하다
, 문을 개방하다
와 같은 로직들이 “Operations” 이 될 것입니다. 여기서 유의사항이 있습니다. “Operations”에는 내부 속성과 같은 일종의 프로퍼티를 정의하지 않는 것입니다. 순수히 로직만 정의하는 것입니다. (Swift에서는 연산 프로퍼티와 같습니다.)
“월급통장”이라는 소재로 ADT에 대해 설명하겠습니다.
월급통장에 월급이 “100억” 들어옵니다. 그 돈이 입금되는 곳은
1. 빌딩에 대한 월세로 20억
2. 개인 노동력으로 인한 80억
입니다. 상상만해도 행복하죠. 위 두 항목이 “Characters” 가 됩니다.
“위 속성들을 통해서 제가 어떤 결과들을 끌어낼 수 있을까요?” 라는 질문이 Operations가 될 겁니다.
예를들자면,
1. “월세 : 개인노동력“ 금액 비중을 구할 수 있습니다.
2. 두 소득에 대한 입금 여부를 구할 수 있습니다.
한 문장으로 정리하면 다음과 같습니다.
“ADT” 란 어떤 개념을 구성하는 구성요소를 정의하고, 구성요소를 연산하는 로직을 정의한다.
ADT를 작성하는 것은 자유입니다만, 아래 작성하는 것은 참고할만한 사례정도로 받아들이시면 될 것 같습니다. 다만 Characters는 내부속성(구성요소)를 정의하고 Operations는 로직을 정의한다라는 점을 기억하시면 됩니다.
class MyMoney {
// Characters를 정의
var buildingIncome: Int // 땅값
var laborIncome: Int // 몸값
var expenditure: Int // 지출금액
// Operations를 정의
var getCurrentTotalMoney: Int {
// 현재 통장에 있는 금액을 확인
}
var spendMoney: Int {
// 몸값을 우선적으로 소비하고 모두 소비하였을 시, 땅값을 소비
}
var putMoney: Int {
// 돈을 통장에 추가
}
}
Swift에서 viewModel을 구성하는 것과 유사하다고 생각하시면 편합니다. ADT를 통해서 Controller에서는 값을 Input만 합니다. 그리고 ViewModel이 연산을 모두 처리합니다. Controller는 Output을 적절히 사용하게됩니다. 그 결과 Controller는 View와 ViewModel의 소통창구 역할만담당하면 되는 겁니다. ViewModel은 값을 연산하기만하면 됩니다. View는 UI를 구현만하면됩니다.
제가 직접경험한 사항은 아니라 책임질 수는 없는 말이지만, 이렇게 구분하게되면 Test 시, 좀더 편리하다고 합니다.