Mar 26, 2021, TIL (Today I Learned)

Inwoo Hwang·2021년 8월 26일
0
post-thumbnail

학습 내용

Radix란?

Screen Shot 2021-03-27 at 2 31 08 PM

분명 계산기만드는 프로젝트 진행 중이었는데 갑자기 뿌리와 근원이라....

이걸 왜 배워야 하나 고민 해 봤습니다...그런데 역시 제가 잘못 찾았던거 였습니다 ㅠㅠ

다시... Radix란!!

Screen Shot 2021-03-30 at 11 44 51 PM

2진법, 10진법 등 같은 수체계에서 각각의 숫자 위치에서 사용되는 숫자의 크기를 radix라 합니다 😁

그럼 이걸 왜 배우느냐..

iOS 계산기를 구현하면서 10진수를 2진수로 또는 2진수를 10진수로 변경해야 할 때가 있습니다. 이런 상황일 때 쓸 수 있는 가장 좋은 initializer가 바로 radix이기 때문입니다.

공식문서를 보면 바로 이해가 되실거에요.

init(_:radix:) | Apple Developer Documentation에 따르면 init(_:radix:)는 주어진 string을 변환해서 다른 숫자로 만들어 줄 수 있습니다🤩

이런식으로 사용할 수 있습니다.

let x = Int("123")
// x == optional(123)

let y = Int("-123", radix: 8)
// y == optional(-83)
let y = Int("+123", radix: 8)
// y == optional(+83)

let z = Int("07b", radix: 16)
// z == optional(123)

이런식으로 optional Int타입으로 값을 변환할 수 있습니다.

스윌프트 같은 경우 유저입력값을 optional string값으로 받는데 이 radix를 사용하면 유용하게 받는 숫자 진법을 변환하여 사용할 수 있으니 아주 유용한 기능인듯 싶습니다.

다만 범위를 넘어가는 숫자 또는 invalid input을 집어넣으면 nil을 반환하니 이 부분만 조심해서 활용하면 됩니다!!

Post Fix Notation[후위표기법]

컴퓨터는 바보?!라서 사람이 사용하는 후위표기법을 이해하지 못한다고 합니다. 연산자의 우선순위를 구분하지 못하기 때문입니다. 그래서 컴퓨터에게 계산을 시키려면 중위표기법을를 후위표기법으로 변환 해 줘야 합니다.

계산기를 구현할 때 이 변환은 핵심이라고 생각합니다. stack을 활용하여 중위표기법을 후위표기법으로 변환을 하는 코드를 작성하면 계산기의 핵심 기능을 구현할 수 있다고 봐도 무방합니다.

비록 swift관련 영상은 아니지만 python을 활용하여 중위표기법 → 후위표기법을 잘 설명 해 놓은 동영상이 있어서 남겨봅니다. 해당 영상을 시청한 뒤 차근차근 swift를 이용하여 비슷하게 코드를 구현 해 보면 더더욱 이 개념을 잘 이해할 수 있을거라 생각합니다 :)

[알고리즘기초(algorithm)] 03. 자료구조(스택)|중위표현식을 후위표현식으로 변환하기 - YouTube

연산자 우선순위

학교에서 연산자 우선순위를 배우긴 하지만...연산자가 좀 많아야죠...이렇게 헷갈릴 수 있는 점을 애플도 알고 있는지 공식 문서에서 연산자 우선순위를 잘 정리 해 놓았습니다. 참고하면 좋을 것 같아서 링크 또한 남겨 봅니다. ↓↓↓

Operator Declarations | Apple Developer Documentation

고민한 내용

후위표기법을 중위표기법으로 변환하는 알고리즘을 따라 로직을 구현하다보면 if문의 지옥에 빠지는 경우가 많았습니다. 각 조건 아래에서 또다른 조건에 따라 다른 값을 도출해야 하기 때문에 자연스럽에 if문 지옥에 빠집니다. 이렇게 작성하고 나면 작동은 하지만 코드 가독성이 심하게 떨어지고 리팩토링도 쉽지 않다는 문제점을 발견하였습니다. 이를 어떻게 해결할지 고민하는 하루를 보냈습니다.

해결방법

Thanks to @cozy

if문의 깊이가 2개 이상인 경우 아래와 같은 방법을 고려하면 좋을 것 같다는 피드백을 받았습니다.

  • 내부함수 분리
  • switch문으로 변경
  • guard문 사용

이런식으로 코드 깊이를 최대한 줄여보려고 코드를 수정 중 입니다 😅 ✍️

3주차 마인드맵

Screen Shot 2021-03-31 at 5 50 45 PM
profile
james, the enthusiastic developer

0개의 댓글