-
간단한 계산 로직 만들기iOS 앱 개발 부트캠프/TIL 2024. 10. 28. 22:10
오늘의 도전 과제
오늘은 강의를 듣고 간단한 계산 로직을 만드는 과제에 도전하였다. Lv.1 ~ Lv.4까지 있었고 차근차근 도전해보았다.
1. 더하기, 빼기, 나누기, 곱하기 연산을 수행하는 Calculator 클래스 만들기
class Calculate를 만들어 그 안에 사칙연산 로직을 만들고 let calculator = Calculator() 형태로 인스턴스를 생성해 Calculator의 기능을 호출하는 것이다.
Lv.1 과제인 사칙 연산 로직은 위와 같이 func add( return a+b ) 형태에서 연산자만 바꿔 어렵지 않게 작성하였고, Lv.2 과제인 나머지 연산을 추가하려는데 에러가 났다.
찾아보니 지금까지 쓰던 나머지 연산인 % 연산이 Int 타입의 숫자들을 나머지 연산할 때 사용하던 것이고, double이나 float 같은 타입의 숫자를 나머지 연산하고자 할때는 truncatingRemainder 라는 기능을 써야한다고 한다.
따라서 return을 first % second가 아닌 first.truncationRemainder(dividingBy: second) 형태로 써서 해결했다.
2. 사칙연산의 클래스를 따로 만들어 Calculator 클래스와 연결하기
이후 Lv.3 과제를 하기위해 각 사칙연산의 클래스를 따로 만들었다.
이렇게 하면 모듈화를 통해 하나의 객체는 반드시 하나의 동작만의 책임을 갖는다는 단일 책임 원칙을 지킬 수 있다. 모듈화가 강해질 수록 다른 객체와의 의존, 연관성이 줄어드는데 이는 해당 객체의 변경에 따른 영향도의 양과 범위가 작아져 안정성을 늘릴 수 있게 된다.
각 연산에 대한 클래스를 따로 만들고, Calculator 클래스 안에 addNumber, subtractNumber, multiplyNumber, divisionNumber 변수를 선언해 각 클래스의 인스턴스를 할당해 연결하였다.
이로써 덧셈은 덧셈 클래스에서, 뺄셈은 뺄셈 클래스에서만 동작하기 때문에 각 단일 책임 원칙이 지켜지게 되고 이전의 Calculator 클래스에 전부 기능을 넣었을 때보다 코드 이해나 변경도 쉽고, 변경에 따른 코드 전체의 안정성도 늘어날 것이다.이후 계산 결과를 저장할 addResult, subResult, mulResult, divResult를 선언해 출력하였다.
3. 1번 과제 다르게 작성해보기
그리고 강의를 들으며 switch 조건문 부분을 듣고 swich-case 구문도 써보고 싶어져서 Calculator 클래스를 swich-case문으로 바꿔 작성해보았다. operater라는 매개변수에 각 연산에 해당하는 문자를 받아 분기시켜 작동하도록 하였고 잘 작동하는 것을 확인하였다.
4. 디렉토리 및 파일 분리해보기
이후 디렉토리 및 파일을 분리해보세요 라는 평가기준을 보고 source 디렉토리에 빈 파일을 만들어 방금 만든 swich-case 구문을 사용한 코드를 분리해보는 시도를 하였다.
sources 디렉토리에 빈 파일을 만든 뒤 위의 Calculator 클래스를 그대로 복사 붙여넣기 하였는데, 당연하게도 에러가 발생했다. Calculator 클래스를 찾을 수 없다는 건데, 다른 디렉토리에 넣어 다른 모듈이 되었으니 public 접근 제한자를 활용해 Calculator 클래스에 접근할 수 있도록 만들어 줘야했다.
클래스와 변수, 함수에 각각 public을 붙여 접근 할 수 있도록 했는데, 여전히 에러가 났다.
찾아보니 같은 파일 안에 있을 때는 따로 초기화 메서드인 init() 함수를 사용하지 않아도 기본 생성자를 자동으로 만들어 줬기에 에러가 나지 않았는데, 다른 디렉토리로 분리해버린 뒤로는 따로 명시적으로 public init() {}의 형태로 초기화 메서드를 추가해주어야 한다고 한다.
public init() {}은 외부에서 Calculator의 인스턴스를 생성할 수 있도록 해주는 기본 생성자로, 명시적으로 선언해두지 않으면 Calculator 클래스를 외부에서, 그러니까 메인이 되는 플레이그라운드에서 사용하고자 인스턴스화 할 때 생성자가 없기 때문에 초기화가 되지 않아 에러가 난 것이다.
swift에서는 모든 저장 속성, 이번에 작성한 Calculator 클래스에선 var result: Double이 초기화 되어야만 인스턴스가 생성될 수 있다고 한다. 만약 초기 값을 지정하지 않았다면 자동으로 기본 생성자인 init()을 제공하지 않는다고 한다.
따라서 같은 파일 안에서 선언할 때도 필요했는데, var result: Double = 0 형태로 선언과 동시에 초기화하니까 에러가 사라지고 문제 없이 작동하였다.
같은 모듈 안에 있고, 초기값을 지정했기 때문에 내부에서 필요한 초기화 메서드를 자동으로 추가해줬기 때문이었던 것이다.다른 디렉토리로 분리할 때 기존 코드를 그대로 가져다 붙여넣고 public만 붙이는 과정으로 분리를 했는데, 처음부터 init()을 추가하는 형태로 코드를 작성해 붙여넣었다면 나타나지 않았을 에러였을 것이다.
코드를 좀 더 간단하게 해보고자 뭔지도 잘 모르면서 줄여 써봤다가 다른 디렉토리로 분리했을 때 문제가 생겼고, 그걸 뒤늦게야 알아채게 된 것이다.초기화 메서드는 사전 캠프에서 분명 공부했던 내용인데, 한동안 사용하지 않았다고 그새 잊고 맘대로 다루다 에러가 발생했다. 다음부턴 같은 파일 안에서 코드를 작성한다 하더라도 기본 형태를 맘대로 바꾸지 않고 제대로 정석대로 선언하고 관리해야겠다..
'iOS 앱 개발 부트캠프 > TIL' 카테고리의 다른 글
자동완성 없이 코딩하기 (0) 2024.10.30 swift 문법 기초 챕터1 Recap (0) 2024.10.29 미니 프로젝트 마무리 KPT (2) 2024.10.25 팀프로젝트 테이블 뷰 작업 마무리 (0) 2024.10.24 팀프로젝트 테이블 뷰 구현하기 (0) 2024.10.23