기어가더라도 제대로

[1일차] 100일의 SwiftUI - 스트링, 숫자, Decimal 본문

Swift - 기초

[1일차] 100일의 SwiftUI - 스트링, 숫자, Decimal

Damagucci-juice 2022. 9. 27. 17:46
음 사실 여기서 구체적인 사용법을 다루지는 않습니다. 몰랐던것이나 고민하지 않고 넘어갔던 것들을 위주로 쓰기 때문에, 좀 내용이 비어 보일 수 는 있다고 생각합니다. 그치만 공부한 것을 기록할 때 모든 것을 다 적기보단, 자신에게 부족하고 모자란 것을 위주로 학습하는 것이 더 효과가 좋다고 생각하기 때문에, 부끄럽지만 제가 안다고 생각하는 것들은 쉽게 쉽게 넘어갈 것입니다. 또 학습 커리 큘럼의 초반부인 1일차에서 15일차까지는 Swift 의 문법적인 내용을 다루기에 더욱 쉽게 넘어가는 경향도 있겠습니다. 양해바랍니다. 감사합니다. 

회사들이 SiwftUI 를 요구하는 곳이 많아서, (Flutter도 요구하는 곳이 좀 있다.) 학습하려한다. 

완전 초보자들이 하는 것은 아니니까 한 100일 정도 학습량이 요구되긴 하지만, 공부하는게 일이니까 하루에 여러개를 나가볼까한다. 그리고 영어 학습도 되니까 아주 꿩먹고 알먹기가 아닐 수 없다. 

1~15 일차 까지는 Swift 문법의 기초를 배워서 후딱 후딱 나가려고 한다. 

변수 선언, 문자열, 정수, 소수점을 다루는 수

  • 상수와 변수의 차이
  • let 으로 선언하면
    • 선언하고 나서 변경될 일이 없는 변수를 생성
  • var 로 선언하면 
    • 변경될 수도 있는 변수를 생성
  • 이 둘의 차이점이 발생한 이유
    • 프로그래머가 실수로라도 값을 변경하는 일이 없기를 바랄 때 확실하게 해두기 위해서 let 이 나옴 
    • var 로 선언한 변수의 경우에 한번 변경하면 이전에 저장되어있던 값은 휘발되므로, 찾을 방도가 없음
  • 함수 중에 .count , .uppercased() 에서 괄호를 여닫는 것과 그냥 불러오는 것의 차이
    • .count
      • 이것처럼 그냥 있는 값을 읽어 오라고만 하는 명령
    • .uppercased() 
      • 이것 처럼 () 가 있는 것은 어떤 행위(동작)을 수행하라는 명령
    • 이게 아주 꼭 알맞는 설명은 아니지만, 지금으로서는 이정도도 충분하다. 
  • 문자열을 만드는 방법 -> String 
    • 한줄 문자열 "~"
    • 여러줄 문자열 """
      • """
  • Int
    • 숫자는 큰 수를 나타낼 수 있다.(음으로도)
    • 우리가 현실에서 100,000,000(백만) 이라고 쓰면 swift 에선 이렇게 쓸 수도 있다. 
    • 연소득 처럼 해도 되고, 월소득 처럼 해도되는데 코드 리뷰시에 깨질 각오는 해야한다.(둘다 백만)
let annualIncome = 100_000_000  // OK
let monthlyIncome = 10_00_00____000  // OK
  • 정수 사칙연산 배운다.
    • 각 연산을 간소화한 += 도 배운다. (생략)
  • 어떤 숫자가 3의 배수인지 확인 하는 방법은...?
let number1 = 121

//MARK: 1번째 방법
if number1 % 3 == 0 {
    print("\(number1)은 3의 배수입니다.")
}

//MARK: 2번째 방법
if number1.isMultiple(of: 3) {
    print("121은 3의 배수입니다.")
}
  • 첫번쨰 방법으로 여지껏 해왔는데, 언어에서 지원하는 방법으로 하는 것이 더 좋다는 생각이다. 앞으로는 두번 째 방법을 사용해야겠다.

Decimal  소수점을 다루는 수 

여기서는 할말이 많다. 왜냐, 근본적으로 어렵기 때문이다. 정수를 표현하는 법은 상대적으로 쉬워보일 정도다. 이게 왜 어렵냐 하면은 다음 명령을 직접 해보면 안다. 언뜻 생각하기에, 123,456,789 와 0.0000000001 을 컴퓨터에 저장한다고하면, 앞의 수가 더 많은 공간을 차지할 것 같지만, 그렇지만도 않다. 둘이 차지하는 공간은 같다. 오 벌써 머리가 아파온다. 

let sum = 0.1 + 0.2
print(sum)

당연히 우리는 0.3 이 나올 것을 안다.  그러나 어디 세상이 그렇게 쉽게만 흘러가겠는가? 그렇지 않다. 컴퓨터는 저것도 못하는 바보다. 아0.30000000000000004 이것이 나올텐데, 0.3 이 나오고 0이 15개 정도 있고 4가 있다. 오우 끔찍하다. 

일단 이게 안되는 이유는 컴퓨터가 숫자를 저장하는 방식을 알아야한다. 컴퓨터는 숫자를 이진수로 저장한다. 010101...

그런데 분수를 어떻게 저장을 할것인가? 우리는 1을 3으로 나눈 값이 1 / 3이라는 것을 알지만 컴퓨터는 1을 3으로 나눠서 언제 끝날지 모르는 3의 행렬을 지켜보고 있어야한다. 그러다 컴퓨터 과학자들이 고안한 방법은 다음과 같다. "아 충분히 작은 숫자가 되면, 오차도 작으니까 거기서 끊고 값을 내보내자" 그래서 저런 0.300000000000000004 같은 숫자가 나오는 것이다. 

그런데 1.0 은 왜 Double로 다루는 것일까?
첫째, Swift 는 소숫점이 있는 숫자의 타입을 Double이라고 추론한다. 1.0 도 Double이다. 
근데 이 Double의 유래가 재밌다. Float 는 왜 Float 인가? "Floating-point number" 다. 소수점이 유동적인 숫자를 말한다. Double은 “double-precision floating-point number” 이것이다. 즉 두 배 정확한 소수점 숫자. Float 보다 더 정확성을 가져가겠다는 말이다. 

둘 째, Decimal 은 Int 와 완전히 다른 타입으로 본다.
비유를 들자면 String 과 Int 정도의 차이가 Double 과 Int 사이의 차이가 난다고 보는 것이다. 또한 1.0 이든 2.0 이든 소수점을 달고 있기때문에 Double 로 본다. 

Swift 는 왜 Type-safety 한 언어일까?

예를들어 `var number = 42` 라는 코드를 짜면 무슨 일이 일어날까?

  1. 변수 number 를 생성한다. 
  2. number 의 타입을 Int 라고 정의한다. 
  3. number 의 값을 저장한다. 

3가지의 일을 하는 것을 볼 수 있다. 만약 여기다가 "사십이" 라는 값을 넣으려고 한다면 Int 타입인 number 에 문자열을 넣을 수 없어 에러를 뱉을 것이다.  근데 왜 Swift 는 이런 일을 해주는 것일까? 

프로그래밍을 하다보면 변수에 어떤 타입이 저장되어있는지 일일이 확인하기 어렵다. 근데 이것을 언어 차원에서 알려주면 프로그래머의 노고를 덜 수 있다. 그것을 위해서 Swift 는 변수의 타입을 저장해놓으면 변경할 수 없는 강타입의 언어이다. 

 

Comments