활동 내용

계산기 프로젝트 팀원별 각자 구현 전 공통 프로토콜 및 익스텐션 작성

십진계산기 및 이진계산기 각 타입에서 공통적으로 채택하여 사용하는 프로토콜과 프로토콜의 기능을 구현하기 위한 익스텐션을 작성하여 초기 구현을 하였습니다.

// 더하기 기능
protocol Addable {
    associatedtype T
    associatedtype T: Numeric

    func add(_ operatedNumber: T, and operatingNumber: T)
    var stack: Stack<T> { get set }
    mutating func add(_ operatedNumber: T, and operatingNumber: T)
}

extension Addable {
    func add(_ operatedNumber: T, and operatingNumber: T) {

    mutating func add(_ operatedNumber: T, and operatingNumber: T) {
        let sumResult = stack.sumAllElements()
        stack.reset()
        stack.push(sumResult)
    }
}

이전에 제네릭 타입으로 구현한 Stack 구조체에 내부 요소를 모두 더할 수 있는 기능을 추가하기 위해 Numeric 프로토콜을 활용하여 sumAllElements() 메서드를 구현하였습니다. where 구문을 사용하여 sumAllElments() 메서드를 필요로 하지 않는 타입 (String 등)이 Numeric 프로토콜을 따르지 않도록 설계하였습니다.

학습 내용, 고민한 점

Numeric 프로토콜

기존 Stack 구조체 구현 시 내부에서 활용되는 프로퍼티 혹은 프로퍼티의 요소들이 제네릭 타입을 따르도록 하였습니다. 십진 계산기와 이진 계산기 모두 타입인 Double 또는 Int 계열의 타입을 따라 사용되는데, 더하기 연산 시 숫자 스택에 존재하는 모든 수를 더해주기 위해 메서드를 구현하였더니 다음과 같은 에러가 발생하였습니다.

에러에서는 RangeReplaceableCollection 프로토콜의 채택을 권고했는데, 이는 덧셈 연산에만 유효할 뿐 기타 뺄셈, 곱셈, 나눗셈 연산은 FloatingPoint 프로토콜 채택을 권고했습니다.

하지만 FloatingPoint 프로토콜을 채택하면 Int 타입의 요소를 가지는 스택의 인스턴스를 생성할 수 없는 문제가 있었습니다.

이후 정수형과 실수형의 사칙연산을 지원하는 프로토콜을 찾던 중 Numeric 프로토콜을 발견하였습니다.

프로토콜의 설명 요약에는 곱셈을 지원하는 값의 타입이라고 설명되어 있고, Discussion에는 정수 및 부동소수형 수와 같은 스칼라 값의 연산을 위한 기초를 제공하는 프로토콜이라고 설명되어 있습니다. 활동 내용에서 사용한 예시처럼 이용하면 되겠습니다.

profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글