자료형

프로그래밍을 하고 있는 중 3이라는 값을 입력 받았다고 가정

  • 이 값은 숫자? 문자?
    • 문자로 받아들일 수도 있고, 숫자로 받아들일 수도 있다
  • 숫자로 받아들인다면
    • 이 값을 사용하여 더하가나 빼거나 곱하고 나누는 등의 연산이 가능
  • 문자로 받아들인다면
    • 받아들인 3은 아무런 연산이나 계산도 할 수 없다
    • 다른 문자열 앞이나 뒤에 결합하여 붙일 수 있다
  • 문자 “3”은 숫자 3과 모습은 같지만 “가”,”A” 등과 같은 문자이다
  • 컴퓨터가 문자 “3”을 내부적으로 받아들일 때는 ASCII Code 51(아스키코드)로 변환시켜 저장
  • 숫자 3은 그냥 3이라는 값으로 저장
  • 컴퓨터는 값을 저장할 때 내부적으로는 받아들이는 값이 실제와 달라서 사람처럼 편리하게 연산을 처리할 수 없다
  • 문자 “3”을 숫자 3으로 전환한 다음에야 비로소 연산을 할 수 있다

  • 문자와 문자의 결합 = 문자
  • 숫자와 숫자의 결합 = 숫자
  • 문자와 숫자의 결합 = ?
    • 문자와 숫자는 각자의 특성을 유지한 채로는 결합 불가
    • 연산도 불가
    • 이는 문자에 대한 결합 연산과 숫자에 대한 결합 연산이 다르기 때문
  • 문자에 대한 결합 연산
    • 문자열을 이어 붙이는 것
  • 숫자에 대한 결합 연산
    • 두 수를 더하는 것
  • 결합 연산을 처리하기 위해서는 양족의 값이 어느 한쪽의 타입으로 통일되어야 한다
  • 프로그래밍에서는 숫자인지, 혹은 문자인지 자료형으로 명확하게 정의되어야 한다
  • 서로 다른 타입의 데이터끼리 연산을 시도할 때 처리하는 기준은 프로그래밍 언어마다 서로 다르다
  • 스위프트를 포함한 대다수 언어에서 실수와 정수는 일부 호환이 가능
    • 일반적으로 정수를 실수로 변환하여 연산을 처리하는 경우가 많다
      • 정수를 실수로 변환할 때에는 값의 손실 발생하지 않는다
      • 실수를 정수로 변환할 때에는 값의 손실이 발생한다
  • 문자와 숫자를 결합하는 경우에 주의 필요
    • 스위프트에서는 문자와 숫자를 바로 결합할 경우 오류로 처리
    • 어느 쪽으로 타입을 맞추어야 할지 기준이 모호하기 때문이다
  • 값의 종류가 일치해야만 그에 맞는 처리가 가능
  • 변수나 상수에 할당되는 값은 모두 타입이 구분 될 수 있어야 한다
    • 변수나 상수에 할당된 값을 타입에 따라 명확하게 구분해주지 않으면 어떻게 처리해야 할지 기준이 모호해지기 때문
    • 문자냐 숫자냐의 차이에 따라 준비해야 할 메모리 공간의 크기가 달라져야 한느 것도 하나의 이유
  • 이런 이유들 때문에 스위프트에서는 변수나 상수를 정의할 때 반드시 숫자, 문자, 문자열, 논리등 몇 가지 종류의 타입을 지정하고 그에 맞추어 사용해야 한다
    • 이를 “데이터 타입(Data Type)” 즉, 자료형 이라고 한다
      • 변수나 상수는 일반적으로 처음 입력되는 값에 맞는 자료형으로 초기화
        • 초기화 이후로는 해당 자료형에 호환되는 형식의 값만 저장 가능

기본 자료형

  • 스위프트에서는 타입을 정의하는 데 사용할 수 있는 몇 가지 자료형을 미리 정의하여 제공한다

Int

  • Int는 정수 를 뜻하는 Integer라는 영단어의 줄임말
  • 부호 있는 정수값을 저장하는 데 사용 되는 자료형
    • 부호가 있는는 말은 숫자 앞에 +나 -를 붙일 수 있다는 의미이다
  • 일반적으로 사용하는 대부분의 정수값을 저장할 수 있는 자료형으로 생각하면 된다
  • 무한대에 가까운 모든 정수값을 저장할 수 있는 것은 아니다
  • Int 타입 이 저장할 수 있는 정수값의 범위에는 제한이 있다
    • 이 제한은 컴퓨터의 CPU 사양에 따라 결정된다
    • 8bit의 CPU를 가진 컴퓨터라면 $2^8$ 인 256개의 값을 저장할 수 있다
      • 이를 정수 범위로 환산하여 계산하면 Int 타입이 저장할 수 있는 값은 -128부터 127까지이다

256개 까지 저장할 수 있다고 본것 같은데??

  • 256개까지 저장할 수 있는 것은 사실, Int는 부호 있는 정수, 즉 마이너스 범위의 정수까지 저장할 수 있도록 설계되어 있다
    • 그래서 0을 기준으로 반 나누어 절반을 플러스 범위에, 절반은 마이너스 범위에 할당하고 있다
    • 256을 절반으로 나누면 128이 된다. 그래서 0 위로 127까지(128개), 0 아래로 -128(128개)까지 저장
  • 0의 존재, 0은 양수도, 음수도 아니지만 편의상 양의 범위에 두도록 설계되어 있다
    • 때문에 양의 성수 시작 값은 0이 된다
      • 이에 따라 양의 정수 범위의 끝은 0으로부터 128번째인 127
      • 음의 정수 시작은 -1부터이므로 그 범위의 끝도 128번째인 -128
  • 8bit 범위만 사용하는 Int의 경우 스위프트에서는 서브 자료형이 별도로 정의되어 있다
    • Int8
  • 유사한 자료형으로 Int16, Int32, Int64도 있다
    • 각각 16, 32, 64bit의 Int타입을 의미한다

Int 타입에 따른 값의 범위

  • Int8 , 저장할 수 있는 값의 범위 : 127 ~ -128, 크기 : 8bit
  • Int16 , 저장할 수 있는 값의 범위 : 32,767 ~ 32,768, 크기 : 16bit
  • Int32 , 저장할 수 있는 값의 범위 : 2,147,483,647 ~ -2,147,483,648, 크기 : 32bit
  • Int64 , 저장할 수 있는 값의 범위 : 9,223,372,036,854,775,807 ~ -9,223,372,036,854,775,808, 크기: 64bit
  • Int 자료형에 붙은 숫자가 커질수록 표현할 수 있는 수의 범위도 점점 늘어난다
    • $2^n$배 크기로 증가한다
  • 큰 단위의 자료형을 사용할수록 큰 값을 저장할 수 있지만, 그만큼 메모리 소모 또한 늘어나기 때문에 실제로 코딩할 때에는 저장할 값의 범위에 맞는 적절한 타입을 선택해야 한다

Int의 필요성

  • 정수 타입이 필요할 때에는 Int8, Int16 등을 직접 지정해서 쓰면 될 것 같은데, 굳이 Int가 필요한가?? 언제 쓰일까??
    • Int는 Int8, Int16, Int32 등으로 이어지는 Int 계열 서브 자료형들에 대한 대표 자료형이라고 할 수 있다
      • 실행환경에 따라 크기가 가변적인 자료형
        • Int8이나 Int16등은 실행 환경에 상관없이 크기가 고정되어 있지만, Int는 해당 컴퓨터의 CPU 비트 크기에 맞추어 자동으로 그 크기가 변화한다
        • 따라서 Int 타입으로 변수나 상수를 선언하면 CPU 환경에 따라 변경해야 할 코드를 대폭 줄일 수 있다