-
Swift4: Protocol Oriented Programming - 5.객체지향 프로그래밍POP 2021. 2. 16. 19:53
5장 객체지향 프로그래밍
객체는 객체의 속성 정보인 프로퍼티와 객체가 수행하는 행위의 정보인 메소드를 포함한 자료 구조이다.
요구사항 설계
- 이동수단은 해상/지상/공중 세 개의 범주를 갖고 여러 범주의 멤버가 될 수 있다.
- 자신이 속해 있는 범주와 일치하는 타일에 있으면 이동 또는 공격 할 수 있다.
- 자신이 속해 있는 범주와 일치하는 타일에 있지 않으면 이동 또는 공격할 수 없다.
- 체력이 0이 되면 움직이지 못하는 상태로 간주한다. 순회가 가능한 단일 배열에 활동 가능한 모든 이동수단을 가지고 있어야 한다.
객체지향 프로그래밍 언어의 스위프트
스위프트는 객체지향 방식의 언어로 사용될 수 있다.
class Vehicle { var vehicleTypes = [TerrainType]() var vehicleAttackTypes = [TerrainType]() var vehicleMovementTypes = [TerrainType]() var landArrackRange = -1 var seaAttackRange = -1 var airAttackRange = -1 var hitPoints = 0 func doLandAttack() {} func doLandMovement() {} func doSeaAttack() {} func doSeaMovement() {} func doAirAttack() {} func doAirMovement() {} }
다음과 같이 이동수단의 슈퍼클래스를 정의했다고 하자. 이동수단은 여러 범주에 동시에 포함될 수 있지만, 스위프트는 단일 상속 언어이기 때문에 슈퍼클래스인 vehicle에 해상/지상/공중에 필요한 모든 프로퍼티 및 기능이 추가되는 형태를 가지게 된다.
프로퍼티의 접근제한을
fileprivate
로 지정하였는데 서브클래스에서 해당 값을 설정할 수 있어야 하며, 외부 개체에서는 변경하지 못하도록 하기 위한 것이다. 그러나 이동수단 코드가 얼마나 길어질지 모르는데 계속 한 파일에 코드가 같이 있어야해서 파일이 매우 커질 수 있는 문제점이 있다.또한, 자신이 속한 범주가 아닌 범주에 대한 메소드를 포함하고 있기 때문에 언제든지 다른 범주의 메소드를 호출할 수 있다는 문제도 있다.
객체지향 설계 방식의 문제점
위에서 설명한 문제점들은 모두 스위프트가 단일 상속 언어이기 때문에 발생한 문제점들이다. 단일 상속 언어에서는 일부 서브클래스에서 필요한 기능들도 슈퍼클래스에 모두 포함해야 하므로 슈퍼클래스가 비대해진다. 따라서 기능이 필요하지 않은 타입에도 해당 기능이 상속되게 된다.
또한, 슈퍼클래스에는 서브클래스에서 설정가능한 상수를 만들 수 없다. 서브클래스의 이니셜라이저에서 설정된 다음 절대 변하지 않는 프로퍼티들을 상수로 만들면 좋겠지만, 슈퍼클래스에서 상수로 설정하게 되면 서브클래스에서는 그 값을 설정할 수 없게 된다.
마지막으로 해당 타입의 서브클래스에서만 접근할 수 있도록 프로퍼티와 메소드를 설정하는 것이 불가능하다. 우회방법으로
fileprivate
키워드를 사용하였지만, 동일한 파일에 모든 서브클래스를 추가하여 파일이 거대해 지는 결과가 나타난다.코드
참고 문헌
https://book.naver.com/bookdb/book_detail.nhn?bid=14107671
'POP' 카테고리의 다른 글
Swift4: Protocol Oriented Programming - 7.스위프트에서 디자인 패턴 적용 - (1) 생성 패턴 (0) 2021.02.19 Swift4: Protocol Oriented Programming - 6.프로토콜지향 프로그래밍 (0) 2021.02.17 Swift4: Protocol Oriented Programming - 4.제네릭 (0) 2021.02.15 Swift4: Protocol Oriented Programming - 3.확장 (0) 2021.02.15 Swift4: Protocol Oriented Programming - 2.타입 선택 (0) 2021.02.14