Swift-자료형
자료형
프로그래밍을 하고 있는 중 3이라는 값을 입력 받았다고 가정
- 이 값은 숫자? 문자?
- 문자로 받아들일 수도 있고, 숫자로 받아들일 수도 있다
- 숫자로 받아들인다면
- 이 값을 사용하여 더하가나 빼거나 곱하고 나누는 등의 연산이 가능
- 문자로 받아들인다면
- 받아들인 3은 아무런 연산이나 계산도 할 수 없다
- 다른 문자열 앞이나 뒤에 결합하여 붙일 수 있다
- 문자 “3”은 숫자 3과 모습은 같지만 “가”,”A” 등과 같은 문자이다
- 컴퓨터가 문자 “3”을 내부적으로 받아들일 때는 ASCII Code 51(아스키코드)로 변환시켜 저장
- 숫자 3은 그냥 3이라는 값으로 저장
- 컴퓨터는 값을 저장할 때 내부적으로는 받아들이는 값이 실제와 달라서 사람처럼 편리하게 연산을 처리할 수 없다
-
문자 “3”을 숫자 3으로 전환한 다음에야 비로소 연산을 할 수 있다
- 문자와 문자의 결합 = 문자
- 숫자와 숫자의 결합 = 숫자
- 문자와 숫자의 결합 = ?
- 문자와 숫자는 각자의 특성을 유지한 채로는 결합 불가
- 연산도 불가
- 이는 문자에 대한 결합 연산과 숫자에 대한 결합 연산이 다르기 때문
- 문자에 대한 결합 연산
- 문자열을 이어 붙이는 것
- 숫자에 대한 결합 연산
- 두 수를 더하는 것
- 결합 연산을 처리하기 위해서는 양족의 값이 어느 한쪽의 타입으로 통일되어야 한다
- 프로그래밍에서는 숫자인지, 혹은 문자인지 자료형으로 명확하게 정의되어야 한다
- 서로 다른 타입의 데이터끼리 연산을 시도할 때 처리하는 기준은 프로그래밍 언어마다 서로 다르다
- 스위프트를 포함한 대다수 언어에서 실수와 정수는 일부 호환이 가능
- 일반적으로 정수를 실수로 변환하여 연산을 처리하는 경우가 많다
- 정수를 실수로 변환할 때에는 값의 손실 발생하지 않는다
- 실수를 정수로 변환할 때에는 값의 손실이 발생한다
- 일반적으로 정수를 실수로 변환하여 연산을 처리하는 경우가 많다
- 문자와 숫자를 결합하는 경우에 주의 필요
- 스위프트에서는 문자와 숫자를 바로 결합할 경우 오류로 처리
- 어느 쪽으로 타입을 맞추어야 할지 기준이 모호하기 때문이다
- 값의 종류가 일치해야만 그에 맞는 처리가 가능
- 변수나 상수에 할당되는 값은 모두 타입이 구분 될 수 있어야 한다
- 변수나 상수에 할당된 값을 타입에 따라 명확하게 구분해주지 않으면 어떻게 처리해야 할지 기준이 모호해지기 때문
- 문자냐 숫자냐의 차이에 따라 준비해야 할 메모리 공간의 크기가 달라져야 한느 것도 하나의 이유
- 이런 이유들 때문에 스위프트에서는 변수나 상수를 정의할 때 반드시 숫자, 문자, 문자열, 논리등 몇 가지 종류의 타입을 지정하고 그에 맞추어 사용해야 한다
- 이를 “데이터 타입(Data Type)” 즉, 자료형 이라고 한다
- 변수나 상수는 일반적으로 처음 입력되는 값에 맞는 자료형으로 초기화
- 초기화 이후로는 해당 자료형에 호환되는 형식의 값만 저장 가능
- 변수나 상수는 일반적으로 처음 입력되는 값에 맞는 자료형으로 초기화
- 이를 “데이터 타입(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
- 때문에 양의 성수 시작 값은 0이 된다
- 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 환경에 따라 변경해야 할 코드를 대폭 줄일 수 있다
- 실행환경에 따라 크기가 가변적인 자료형
- Int는 Int8, Int16, Int32 등으로 이어지는 Int 계열 서브 자료형들에 대한 대표 자료형이라고 할 수 있다