본문 바로가기
Programming/Swift

[iOS Swift5] 상수와 변수 데이터 타입 옵셔널, 옵셔널 바인딩, 강제언래핑

by 개발자 염상진 2023. 12. 26.

Swift5 상수와 변수

프로그래밍 언어에서 데이터를 표현하는 방법은 다양합니다. iOS 8 이전까지는 Objective-C로 개발했지만 스위프트 언어가 등장하고 나서는 대부분 흐름이 스위프트로 새로운 기능들이 대체되고 있는 상황입니다.

 

 

스위프트 언어에서 가장 먼저 익혀야 되는 부분은 데이터타입입니다. 프로그램은 RAM에 올라가 CPU의 자원을 사용해 Bit라고 불리는 0 혹은 1의 데이터에서 시작합니다. 비트가 바이트가 되고, 우리가 원하는 2진수 혹은 문자열의 데이터를 저장할 수 있게 됩니다. 

여기서 변수와 상수가 나뉘게 됩니다. 변수 Variables는 애플리케이션에서 사용되는 데이터를 저장하기 위해 생성하는 컴퓨터 메모리 내의 위치를 의미합니다. 개발자는 메모리 주소에 이름을 지정하고 값을 할당하게 됩니다. 변수 뿐만 아니라 상수도 메모리의 주소에 이름을 지정하고 값을 할당합니다. 변수와 상수의 차이점은 값을 변경할 수 있느냐의 여부입니다. 

 

 

 

스위프트에서는 변수는 var, 상수는 let으로 지정합니다. 변수냐 상수냐를 지정하는 키워드는 이 두가지 밖에 없습니다. 가급적이면 변수보다는 상수를 사용하는 것이 권장됩니다. 상수를 사용하면 값이 런타입 환경에서 변경되는 부분을 막을 수 있고, 가독성을 높여주기 때문입니다. 

var name: String = "About Tech"
let priceApple: Int = 12_000

 

 

타입 애너테이션 Type Annotation

스위프트 언어는 타입 안전한 언어입니다. 즉 모든 데이터에 들어갈 데이터 타입을 컴파일 단계에서 미리 검수를 하면서 혹여나 런타임 환경에서 일어날 타입 충돌을 예방하기 위함입니다. 스위프트에서는 타입 안정성을 보장하기 위해서 타입 애너테이션(Type Annotation)을 사용합니다. 

먼저 name이란 변수를 선언하고 그 뒤에 콤마를 붙인 다음 String을 적어줍니다. 이제 name 이라는 변수는 문자열만 받을 수 있는 변수로 선언된 것입니다. 

var name: String = "About Tech"

 

name 변수에 문자열이 아닌 Bool이나 Int 형 숫자 값을 할당하게 되면 아래와 같은 에러를 반환하게 됩니다. 

 

스위프트 변수 타입 추론(Type Inference)

스위프트 언어에서는 타입 추론(Type Inference) 기능도 제공하고 있습니다. 처음 변수를 선언할 때 타입 애너테이션을 적어주지 않더라도 처음 할당된 값을 통해서 변수의 타입을 추론할 수 있습니다. 물론 처음 할당된 데이터 타입과 다른 값을 할당하게 되면 위의 에러를 반환하게 됩니다.

 

 

 

Swift 데이터타입

1. 정수형 데이터타입

숫자를 저장하는 데이터타입입니다. 스위프트 정수형 데이터타입은 부호있는 데이터와 부호없는 데이터로 구분됩니다. 부호 있는 데이터는 0 이상의 데이터 즉, 양의 값을 저장합니다. Int, Int8, Int16, Int32, Int64가 있습니다.

var number: Int = 10
print("Int64 max value : \(Int64.max)")
print("Int64 min value : \(Int64.min)")

반대로 부호 없는 데이터타입은 양의 값과 음의 값을 함께 저장하는 데이터타입입니다. UInt, Uint8, Uint16, Uint32, Uint64가 있습니다.

var number: UInt = 10
print("UInt64 max value : \(UInt64.max)")
print("UInt64 min value : \(UInt64.min)")

 

2.  부동소수점 데이터타입

소수점이 있는 값을 저장하는 데이터타입입니다. Swift에서는 부동소수점 데이터 타입에 Float과 Double 2가지 타입이 있습니다. 

  • Float : 최대 32비트 부동소수점 처리
  • Double 최대 64비트 부동소수점 처리

Float이 상대적으로 낮은 정밀도를 가지는데요, 그만큼 메모리 용량이 줄어들기 때문에 높은 성능을 제공합니다. 특히 Float에서는 Float16도 제공하고 있으므로 더 나은 성능을 기대할 수 있습니다. 

var float: Float16 = 0.254

print(float)

 

3. Boolean 타입

참과  거짓을 표현하는 데이터입니다. true와 false 값 2개 중 하나를 선택합니다.

var isUser: Bool = true

 

4. 문자열 데이터 타입

문자열을 저장하는 데이터 입니다. 스위프트에서는 문자열을 둘 이상의 유니코드 스칼라를 합친 형태로 저장하기 때문에 일반 문자열 뿐만 아니라 유니코드도 표현할 수 있습니다. 

var greeting = "Hello Swift"
var unicodeEx = "\u{8c46}"

스위프트에서 문자열을 포함할 때는 보간(String Interpolation)을 사용할 수 있습니다. 변수의 값을 문자열에 포함하여 한번에 표현하는 방식입니다. 

var greeting = "Hello Swift"
var unicodeEx = "\u{8c46}"

var message = "hello \(unicodeEx), Message is \(greeting)"

여러줄의 문자열을 출력하기 위해서는 따옴표를 세개 사용해서 표현할 수도 있습니다.

var multiMessage = """
    hello,.
    today is good.
    I'm iOS Developer
    Nice to meet you

"""

 

스위프트 옵셔널

스위프트에서는 옵셔널이라는 특수한 데이터 타입을 제공합니다. 값이 없음을 나타내는 데이터 타입입니다. 변수를 선언하기는 했지만 혹시 값이 없을 수도 있음을 나타내기 위해(?)를 타입 애너테이션 옆에 붙여줍니다. 처음 변수를 선언하고 값을 할당하지 않으면 옵셔널이 들어가게 됩니다. 

변수를 사용하기 위해서는 옵셔널을 언래핑해서 사용해줘야 합니다. 예를 들어 name이라는 변수를 선언하고 String 타입의 애너테이션을 붙여줬습니다. 그리고 ? 마크를 붙여줍니다. 이제 name을 그대로 출력하면 nil이 출력됩니다. 옵셔널로 선언되었다는 뜻입니다.

var name: String?

print(name)

 

실제 코드에서 옵셔널로 선언된 변수를 사용하기 위해서는 옵셔널 변수를 언래핑해서 사용해줘야 합니다. 옵셔널을 언래핑 하는 방법은 강제 언래핑옵셔널 바인딩이 있습니다.

강제 언래핑은 옵셔널로 선언된 변수 끝에 ! 마크를 붙여줍니다. 이 뜻은 nil이 아닌 진짜 값이 할당되어 있으니 그대로 출력해도 된다라는 의미입니다. 

var name: String?

name = "about tech"

print(name!)

 

옵셔널 바인딩은 임시 변수에 할당해서 옵셔널 값을 쉽게 말해 까보는 것입니다. 만약 옵셔널 변수에 nil이 할당되어 있다면 해당 코드를 건너 뛰어버리면 됩니다. 스위프트  5.7 버전 이상에서는 따로 변수에 옵셔널 변수값을 할당할 필요 없이 바로 사용할 수 있는 if-let 구문이 도입되었습니다. 

if let name = name {
    print(name)
} else {
    print("name에 nil이 들어있다 - \(name)")
}

아래 처럼 새로운 변수를 생성할 필요없이 기존 옵셔널 변수를 그대로 사용할 수 있습니다. 

if let name {
    print(name)
} else {
    print("name에 nil이 들어있다 - \(name)")
}

 

이 후에 다루겠지만 함수내에서 옵셔널 바인딩을 사용하는 방법으로는 guard let 구문도 있습니다. if 조건문 보다 더욱 빠르게 nil 값을 감지하고 코드를 탈주할 수 있습니다. 

 

func optionalTest() {
    
    guard let name else {return}
    print(name)
}

optionalTest()

 

 

스위프트 언어에서 nil 값을 담을 수 있는 변수는 옵셔널 변수 밖에 없습니다. String, Int 타입 변수에 nil을 할당하게 되면 컴파일 에러가 발생합니다. 

 

🚀️ 도움이 되셨다면 구독좋아요 부탁드립니다 👍️

 

 

[iOS Swift5] Objective-C를 넘어선 Swift5 언어의 등장

Swift 5 언어의 출현 현재 애플의 기기에 들어가는 소프트웨어를 개발하기 위해서는 Swift언어를 사용합니다. 애플 에코시스템에서 개발자가 되기 위해서는 Swift 언어를 익혀야 하는데요, Swift 프로

about-tech.tistory.com

 

댓글