본문 바로가기
iOS Swift/Study

Swift 계산기 만들기 2탄

by 야고이 2024. 3. 7.
728x90

240307

거의 튜터님이 짠 코드나 다름 없지만 그래도 기록 해야지

Lv2 와 비교하여 어떠한 점이 개선 되었는지 생각해 보기라도 하자

class AddOperation {
    func add(_ number1: Double, _ number2: Double) -> Double {
        return number1 + number2
    }
}

class SubstractOperation {
    func substract(_ number1: Double, _ number2: Double) -> Double {
        return number1 - number2
    }
}

class MultiplyOperation {
    func multiply(_ number1: Double, _ number2: Double) -> Double {
        return number1 * number2
    }
}

class DivideOperation {
    func divide(_ number1: Double, _ number2: Double) -> Double {
        return number1 / number2
    }
}

 

연산자 클래스를 각각 만들라는 조건이 있었는데

단일책임원칙에 의해서 그런 것 같았다

클래스는 한가지의 동작만 수행하는 것

 

Calculator 클래스 안에 메소드로 구현하던 코드들을 각 클래스로 생성해 주었다

근데 이걸 어떻게 활용 하는데?

 

 

class Calculator {
    //프로퍼티 초기화
    let addOperation: AddOperation
    let substractOperation: SubstractOperation
    let multiplyOperation: MultiplyOperation
    let divideOperation: DivideOperation
    
    init(add: AddOperation,
         substract: SubstractOperation,
         multiply: MultiplyOperation,
         divide: DivideOperation) {
        self.addOperation = add
        self.substractOperation = substract
        self.multiplyOperation = multiply
        self.divideOperation = divide
    }

여기서 활용 되는 것이 initialization 즉, 초기화 이다

위에서 만든 클래스들을 인스턴스화 하여서 초기화를 한다

프로퍼티 초기화,,,라고는 하는데 사실 프로퍼티가 뭔지 잘 모름

상수로 선언 해주구,, 초기값을 넣어야 하니 init 해줘,,(--> 단어를 모르겠음 init 생성?)

이름 거지 같이 지으면 힘드니까 다르게 지으십시오

 

// 더하기
    func add(_ number1: Double, _ number2: Double) -> Double {
        return addOperation.add(number1, number2)
    }

    // 빼기
    func substract(_ number1: Double, _ number2: Double) -> Double {
        return substractOperation.substract(number1, number2)
    }
    
    // 곱하기
    func multiply(_ number1: Double, _ number2: Double) -> Double {
        return multiplyOperation.multiply(number1, number2)
    }
    
    // 나누기
    func divide(_ number1: Double, _ number2: Double) -> Double {
        return divideOperation.divide(number1, number2)
    }
    
    // 나머지 연산
    func remind(_ number1: Double, _ number2: Double) -> Int {
        return Int(number1) % Int(number2)
    }
}

이전 게시물에서 연산자를 그대로 넣었던 return 에 인스턴스와 각각 클래스의 메소드 명을 넣은 후 괄호 안에 값을 넣을 속성의 이름을 넣어준다

 

어디서 불러오는 값인지 궁금하다면 클릭 + cmd 를 누르면 드래그 한 것 마냥 뜨니까

어딜 향하고 있는지 알 수 있다

let calculate = Calculator(add: AddOperation(), substract: SubstractOperation(), multiply: MultiplyOperation(), divide: DivideOperation())

//얘는 print 찍을 떄 보기 편하라고
let addResult = calculate.add(1, 2)// 덧셈 연산
let subtractResult = calculate.substract(3, 4)// 뺄셈 연산
let multiplyResult = calculate.multiply(5, 6)// 곱셈 연산
let divideResult = calculate.divide(7, 8)// 나눗셈 연산
let remindResult = calculate.remind(9, 1)//나머지 연산

print("addResult : \(addResult)") // addResult : 3.0
print("subtractResult : \(subtractResult)") //subtractResult : -1.0
print("multiplyResult : \(multiplyResult)") //multiplyResult : 30.0
print("divideResult : \(divideResult)") //divideResult : 0.875
print("remindResult : \(remindResult)") // remindResult : 0

calculate 에 초기화 하고 

값을 넣어보면 계산이 잘 되는걸 볼 수 있다

 

이전 코드와 다른점을 꼽자면 사실 나는 코드만 길어지고 이게 더 좋은건가? 싶었지만,,

단일책임원칙에 따라서 코드를 작성한 것이

만약 덧셈 코드를 바꾸고 싶다면 그 클래스에 메소드만 수정하면 된다는 점이 활용도 면에서 좋다고 생각했다.

 

지적과 조언은 언제든 환영 입니다 ~

728x90

댓글