[내일배움캠프 23일차] 코드베이스 계산기 개발

NH·2025년 4월 2일

내일배움캠프

목록 보기
23/62
post-thumbnail

🧮 Chapter3. 코드베이스 계산기 과제

1️⃣ 기능 추가

🔹 글자 크기 자동 조정 기능 추가

적용 전

  • 계산식이 길어지면 111111111... 같이 표현됨
  • 코드
    func configureUI() {
    	view.backgroundColor = .black // 배경색 검은색 지정
           
    	// - MARK: - 라벨 속성 정의
    	label.text = "0" // 기본 텍스트 지정
    	label.textColor = .white // 글자색 지정
    	label.textAlignment = .right // 글자 정렬 기준 지정
    	label.font = .boldSystemFont(ofSize: 60) // 글자 스타일 지정
       
    	view.addSubview(label) // 뷰 위에 라벨 추가
    }

적용 후

  • UILabel 속성중에 아래의 속성을 이용하여 문제점 개선

    • adjustsFontSizeToFitWidth : 라벨크기에 따라 글자 크기를 조정해주는 속성
    • minimumScaleFactor : 글자 크기가 줄어드는 최소 비율을 지정하는 속성인
  • 계산식이 길어지면 글자 크기가 자동으로 작아지면서 많은 숫자를 표현함

  • 코드

    func configureUI() {
    	view.backgroundColor = .black // 배경색 검은색 지정
           
    	// - MARK: - 라벨 속성 정의
    	label.text = "0" // 기본 텍스트 지정
    	label.textColor = .white // 글자색 지정
    	label.textAlignment = .right // 글자 정렬 기준 지정
    	label.font = .boldSystemFont(ofSize: 60) // 글자 스타일 지정
       
       // 추가한 코드
    	label.adjustsFontSizeToFitWidth = true // 라벨 크기에 따라 글자 크기 조정
    	label.minimumScaleFactor = 0.2 // 글자 크기 줄어드는 최소 비율
       
    	view.addSubview(label) // 뷰 위에 라벨 추가
    }

2️⃣ 코드 리팩토링

🔹 버튼 색 변경 코드 리팩토링

변경 전

  • for문 안에서 if-else문을 사용해서 containsorange 배열에 포함된 문자인지 확인하는 로직
  • 코드
func makeButton(title: String) -> UIButton {
	let button = UIButton() // 버튼 객체 생성
	let orange = ["+", "-", "*", "/", "AC", "="]
    
	for i in orange {
		if title.contains(i) {
			button.backgroundColor = .orange
			break
		} else {
			button.backgroundColor = UIColor(
			red: 58/255, green: 58/255, blue: 58/255, alpha: 1.0
			)
		}

변경 후

  • for문이 불필요하다고 판단하여 for문을 제거
  • 코드
func makeButton(title: String) -> UIButton {
	let button = UIButton() // 버튼 객체 생성
	let orange = ["+", "-", "*", "/", "AC", "="]
        
	// 버튼 제목이 오렌지 배열에 포함되면 색을 오렌지 색으로, 아니면 회식으로 설정
	if orange.contains(title) {
		button.backgroundColor = .orange
	} else {
		button.backgroundColor = UIColor(
		red: 58/255, green: 58/255, blue: 58/255, alpha: 1.0
		)
	}

🔹 연산자 뒤에 0이 오면 그 다음에 숫자만 오게 처리: 실패

변경 전

  • 계산식에서 연산자 뒤에 0 버튼이 계속 눌렸다.
    • 예) 13-00000001
  • 코드
    @objc
    private func buttonTapped(button: UIButton) {
        guard let tappedButtonTitle = button.currentTitle else { return }
        
        switch tappedButtonTitle {
        case "AC":
            label.text = "0"
            return
        case "=":
            // 예외처리: 계산식이 연산자에서 끝났으면 아무동작 하지 않게 처리
            if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+" {
                return
            } else {
                let result = calculateModel.calculate(expression:label.text!)
                label.text = String(result!)
            }          
        case "/","*","-","+":
            // 예외처리: 마지막 계산식에 연산자가 있으면, 더 이상 연산자를 사용 못하게 처리
            if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+"
            {
                return
            }
            
            // 예외처리: 첫 계산식이 0과 연산자가 될 수 없게 처리
            if  label.text == "0" || label.text == "/" || label.text == "*" || label.text == "-" || label.text == "+" {
                label.text = tappedButtonTitle
            } else {
                label.text! += tappedButtonTitle
            }
        default:
            // 예외처리: 첫 계산식이 0이 될 수 없게 처리
            if label.text == "0" {
                label.text! = tappedButtonTitle
            } else {
                label.text! += tappedButtonTitle
            }
        }
    }

변경 후

  • 계산식에서 연산자 뒤에 0이 오지 못하게 처리
  • 코드
    @objc
    private func buttonTapped(button: UIButton) {
        /*
         최근에 눌린 버튼의 이름을 가저오는 변수
         currentTitle 사용하면 최근 사용된 버튼의 title을 가져옴
         
         옵셔널을 언래핑을 위해 guard let 사용
         */
        guard let tappedButtonTitle = button.currentTitle else { return }
        
        switch tappedButtonTitle {
        case "AC":
            label.text = "0"
            return
        case "=":
            // 예외처리: 계산식이 연산자에서 끝났으면 아무동작 하지 않게 처리
            if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+" {
                return
            } else {
                let result = calculateModel.calculate(expression:label.text!)
                label.text = String(result!)
            }
            
        case "0":
            // 예외처리: 연산자 뒤에 "0" 올 수 없게 처리
            if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+"
            {
                return
            } else {
                label.text! += tappedButtonTitle
            }
        case "/","*","-","+":
            // 예외처리: 마지막 계산식에 연산자가 있으면, 더 이상 연산자를 사용 못하게 처리
            if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+"
            {
                return
            }
            
            // 예외처리: 첫 계산식이 0과 연산자가 될 수 없게 처리
            if  label.text == "0" || label.text == "/" || label.text == "*" || label.text == "-" || label.text == "+" {
                label.text = tappedButtonTitle
            } else {
                label.text! += tappedButtonTitle
            }
        default:
            // 예외처리: 첫 계산식이 0이 될 수 없게 처리
            if label.text == "0" {
                label.text! = tappedButtonTitle
            } else {
                label.text! += tappedButtonTitle
            }
        }
    }
  • 연산자 뒤에 0이 오면 그 후에 숫자가 입력이 될 때 0이 지워지게 구현하고 싶었으나, 그렇지 못했다.

✍️ 느낀점 & 배운점

  • 계산기 하나도 아직 제대로 구현을 못했다..너무 아쉽다.
  • 마지막 기능에 대해서 더 발전 시키지 못해서 아쉽다.
  • UILabel 에 대해 여러가지 속성을 적용해보면서 학습해보았다.
    특히 글자 모양에 대해서 특정 속성을 사용해서 여러가지 형태로 변형할 수 있는 것을 배웠다.
  • 계산기 기능에 대해서 개선을 해보면서 테스트의 중요성과, 설계에 대한 중요성을 배웠다.
profile
iOS 개발 블로그

0개의 댓글