Swift와 데이터 타입(Data Type)(2)

Youngseok-O·2023년 6월 9일
0

Swift

목록 보기
2/2

이전 글에서는 컴퓨터에서 사용할 수 있는 데이터 타입과 Swift에서 사용할 수 있는 데이터 타입을 다루었다. 본 글에서는 Swift에서 사용할 수 있는 데이터 타입 및 관련된 다양한 개념을 정리해 볼 예정이다.

Swift에서 사용하는 데이터 타입

이전 글에서 다루었던 것과 같이 Swift에서는 정수형(Int),실수형(Float, Double), 문자(Char), 문자열(String) 등의 데이터 타입을 사용할 수 있다.
추가적으로 Any 및 AnyObject, 그리고 옵셔널 등의 개념이 존재한다.

Any

Swift에서 사용하는 모든 종류의 데이터 타입을 사용할 수 있다는 뜻이다.
변수 또는 상수의 데이터 타입이 Any로 지정되어 있다면 그 변수 또는 상수에는 어떤 종류의 데이터 타입이든지 상관없이 할당이 가능하다.

변수와 상수

  • 변수란 ?
    앱이 사용하는 데이터를 저장하기 위해 예약된 컴퓨터 메모리 내의 위치이다.
    프로그래머에 의해 이름이 주어지고 값이 할당된다.
    변수에 할당된 값은 변경이 가능하고, 할당된 이름은 Swift 코드 내에서 변수에 할당된 값을 사용하기 위해 사용된다.
var name: String = "영석"
var age: Int = "27"
  • 상수란 ?
    상수 또한 변수처럼 데이터를 저장하기 위해 예약된 메모리 내의 위치이다.
    하지만 변수와 달리, 상수는 한 번 값을 할당하면 변경이 불가능하다.
    앱 안에서 반복적으로 사용되는 값이 있을 때 유용한 개념이 바로 상수다.
let name: String = "영석"
let age: Int = "27"

Any 타입을 사용하면 어떠한 타입의 값도 저장할 수 있기 때문에, 프로그래밍을 할 때 특정 타입을 지정하는 것보다 편리하다고 생각할 수 있다.
하지만 타입에 엄격한 Swift 언어 특성상 Any로 선언된 변수의 값을 가져다 쓰려면 매번 타입 확인 및 변환을 해주어야 하는 불편함과 예기치 못한 오류의 위험이 증가하기 때문에 Any 타입을 사용하는 것을 권장하지 않는다.


위 코드와 같이 변수에 Any 타입을 할당하면 언제든지 다른 타입의 값으로 변경이 가능하다. 자료형 튜플(Tuple)을 사용해 여러 타입의 값을 하나로 묶어 변수에 저장할 수도 있다.

튜플(Tuple)

Swift에서 여러 값을 하나의 항목으로 임시적으로 그루핑(Grouping)하는 데 사용되는 방법이다. 서로 다른 타입의 값들이 튜플에 저장될 수 있다.
하나의 함수에서 여러 값을 반환하는 데 주로 사용한다.

AnyObject

Any보다는 조금 한정된 의미로 클래스(Class)의 인스턴스(Instance)만 할당 가능하다.

AnyObject는 클래스의 인스턴스만 할당 가능하기 때문에 위 사진과 같이 컴파일 오류가 발생한다. AnyObject 또한 Any와 같이 Swift 언어 특성상 사용을 권장하지 않는다.

옵셔널(Optional)

옵셔널 타입은 다른 프로그래밍 언어에 대부분 없는 개념이다.
변수 또는 상수에 값이 할당되지 않은 상황을 처리하기 위해 안전하고 일관된 접근 방식을 제공하기 위해 사용된다.
변수를 선언할 때, 데이터 타입 선언 뒤에 '?' 문자를 두어 사용한다.
단순하게 생각해서 Swift의 옵셔널 타입은 값이 있을수도 있고 없을수도 있다 라고 생각하면 좋다.

var name: String?

위 코드와 같이 옵셔널 타입을 선언할 수 있으며, 어떠한 값도 할당되지 않은 name 변수는 실제로 nil이라는 값을 갖는다.

옵셔널 타입으로 선언한 변수에 할당된 값이 없어 nil값을 갖는 예제

옵셔널 타입으로 선언한 변수에 할당된 값이 있는 예제

nil

특정 타입이 아니라 없음을 나타내는 Swift의 키워드이다.
옵셔널로 선언된 변수 또는 상수에 값이 들어있지 않고 비어있음을 나타낸다.
nil 값을 갖는 변수 또는 상수에 접근했을 때 잘못된 메모리 접근으로 인해
런타임 오류가 발생한다.

만약 옵셔널에 값이 할당되어 있다면 해당 값이 옵셔널 내에서 래핑되었다(wrapped)고 말한다. 옵셔널 안에 래핑된 값을 사용하려면 강제 언래핑(forced unwrapping)과 같은 개념을 사용해야 한다.

강제 언래핑 (Forced unwrapping)

Swift에서 옵셔널 안에 래핑된 값을 사용하기 위해 이용하는 개념이다.
옵셔널 데이터 타입에서 옵셔널 이름(변수) 뒤에 '!'를 두어 사용한다.
하지만 에러 발생의 위험 때문에 Swift에서 강제 언래핑 사용을 권장하지 않는다.

옵셔널 바인딩 (Optional binding)

권장하지 않는 개념인 강제 언래핑 대신 사용할 수 있는 개념으로, 옵셔널로 할당된 값은 옵셔널 바인딩을 통해 임시 변수나 상수에 할당하여 사용할 수 있다.
여러 개의 옵셔널을 언래핑하고 조건문을 포함하는 데 사용될 수도 있다.
옵셔널 바인딩은 주로 if let 구문 또는 guard let 구문을 사용한다.

위 코드는 if let 구문을 사용해 옵셔널 바인딩을 수행하는 예제다.
if 구문 안에 있는 임시 상수 nameIndex는 if 구문 안에서만 유효한데, 즉 옵셔널로 할당된 동일한 이름을 사용해도 충돌이 발생하지 않는다는 뜻이다.

강제적으로 언래핑

옵셔널 선언 시 강제적으로 언래핑되도록 옵셔널을 선언하는 것도 가능하다.
이 방법을 사용하면 위에서 언급한 강제 언래핑이나 옵셔널 바인딩을 사용하지 않아도 값에 접근이 가능하다.
옵셔널 선언 시 '?' 대신에 '!'를 사용하여 강제적으로 언래핑되도록 하는 것이다.

옵셔널 주의점

  • 할당된 값이 없거나 nil을 할당할 수 있는 것은 옵셔널 타입뿐이다.
  • 옵셔널이 아닌 변수 또는 상수에는 nil을 할당할 수 없다.
var age = nil
var name: String = nil
  • 위 코드와 같이 변수에 nil 값을 할당하는 방법은 모두 유효하지 않다.
profile
Computer Engineering, Swift, iOS Developer

0개의 댓글