티스토리 뷰
상수 및 변수 (let, var)
상수와 변수는 사용하기 전에 선언해야 합니다.
상수
let 키워드로 상수선언
한번 선언되면 변경할 수 없습니다.
let name = "peppo"
name = "swift" // ( X ) error
변수
var 키워드로 변수선언
변수는 변경 가능합니다.
var age = 200
age = 100
정수 (Integers)
Int 키워드로 사용하며,
32비트 플랫폼 - Int32
64비트 플랫폼 - Int64
를 사용합니다.
var number = 20
var number = -20
UInt
부호 ( - )가 없는 정수 유형이 '특별히' 필요한 경우에만 사용하길 권장.
var number: UInt = 10 // (O)
var number: UInt = -10 // (X)
부동소수점 숫자 ( Float ,Double)
소숫점이 있는 숫자
Float와 Double의 차이점?
Float: 32비트 부동 소수형
Double: 64비트 부동 소수형
요약: 자릿수가 더 나옴
var floatNumber: Float = 3.142903840928409274
// 3.142904
var doubleNumber: Double = 3.142903840928409274
// 3.142903840928409
var normalNumber = 3.142903840928409274
// 3.142903840928409
마지막 normaNumber를 보면 타입을 지정해주지 않았는데
Double처럼 자릿수가 다 나오는걸로 보아
타입을 지정해주지 않으면 Double 타입으로 추론합니다.
타입 안전성 및 타입 추론 (Type Inference)
Swift는 타입에 예민한 언어로, 코드에서 값 타입을 명확하게 하도록 권장합니다.
만약 타입을 지정하지 않을시 Swift에서 타입을 추론합니다.
이렇게
var normalNumber = 3.142903840928409274
type(of: normalNumber) // Double.Type
// Double로 타입 추론
var number = 30
type(of: number) // Int.Type
// Int로 타입 추론
var guessType = "무슨타입?"
type(of: guessType) // String.Type
// String으로 타입 추론
숫자 리터럴 (Numeric Literals)
정수 리터럴을 10진수로 표현하면 접두사가 붙지 않습니다. (흔히 사용하는 숫자 리터럴)
2진수로 표현하면 접두사 0b
8진수로 표현하면 접두사 0o
16진수로 표현하면 접두사 0x가 붙습니다.
아래 내용들은 모두 17을 나타냅니다.
let decimalInteger = 17
let binaryInteger = 0b10001
let octalInteger = 0o21
let hexadecimalInteger = 0x11
숫자형 변환
정수 변환
숫자 타입 마다 저장될 수 있는 숫자의 범위가 다 다릅니다.
예를들어
Int8 타입은 -128 ~ 127까지 저장할 수 있고,
UInt8 타입은 0 ~ 255까지의 정수를 저장할 수 있는데, 해당 범위의 숫자를 넘게되면 컴파일 할 때 오류가 납니다.
let cannotBeNegative: UInt8 = -1 // UInt는 양의 정수만 저장 가능하므로 에러
let tooBig: Int8 = Int8.max + 1 // Int8은 -127 ~ 127까지 저장되므로 에러
// Int8.max + 1 = 128
예제 하나더 볼게요.
let twoThousand: UInt16 = 2000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + one // error!! Binary operator '+' cannot be applied to operands of type 'UInt16' and 'UInt8'
마지막 줄에 에러가 나오게 되는데
이유는 상수 twoThousand와 상수 one의 타입이 다르기 때문에 연산을 할 수 없기 때문에 타입을 맞춰 줘야합니다.
let twoThousand: UInt16 = 2000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one) // 2001
이런식으로 말이죠.
정수 및 부동소수점 변환
중수 타입과 부동소수점 타입의 값 사이 변환 경우엔 주의할 점이 있습니다.
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine // 3.14159
let integerPi = Int(pi) // 3
먼저 상수 three와 상수 pointOneFourOneFiveNine에 타입을 지정하지 않았습니다.
Swift는 타입 추론을 해서 three가 정수,point~Nine이 Double이라는것 유추하게 됩니다.
물론 연산을 하려면 타입을 맞춰주고 let pi = Double(three) + pointOneFourOneFiveNine
마지막 줄에 연산된 pi 값을 Int로 변환하게 되면 3 이 나오게 됩니다.
3.14159 에서 정수부분만 가지고 오는거죠 !
타입 앨리어스(Type aliases)
기존 타입이름을 다른이름으로 재정의 하는것을 말합니다.
예)
typealias EightBits = UInt8
var reg: EightBits = 0
예2)
typealias Strrr = String
var whatType: Strrr
type(of: whatType)
// String.Type
불리언 (Boolean, Bool)
참, 거짓 중 반드시 하나의 값만 가질 수 있는 타입 입니다. true, false로 나타냅니다.
let haveJob = true
먼저 상수 haveJob에 true를 저장한후 조건문을 사용해볼게요.
Bool타입은 주로 if(조건)문을 다룰때 가장 많이 사용됩니다.
if haveJob { // haveJob == true 와 같은 뜻 입니다.
print("결혼안하니") // true 일때
} else {
print("취업안하니") // false 일때
}
// "결혼안하니"
튜플(Tuple)
여러 개의 값을 하나의 복합된 값으로 무리 짓습니다.
어떤 타입이든 튜플에 속 할수 있고, 꼭 같은 타입일 필요도 없습니다.
1. 튜플을 만들 때는 어떤 타입이든 다양하게 조합할 수 있습니다.
예를들어 (Int,Int,Int) 또는 (String,Bool,Int) 같이.
let http404Error = (404, "Not Found") // (Int, String)
2. 반대로 튜플에 속한 내용물을 상수나 변수로 꺼낼 수도 있습니다.
let (statusCode, statusMessage) = http404Error
print("HTTP 상태 코드는 \(statusCode)입니다.") // HTTP 상태 코드는 404입니다.
print("HTTP 상태 메시지는 \(statusMessage)입니다.") // HTTP 상태 메시지는 Not Found입니다.
3. 만약 튜플에 속한 내용물 중에 statusMessage만 꺼내고 싶다면?
꺼내지 않고자 하는 자리에 ( _ )를 입력하거나,
내용물이 위치한 Index로 접근이 가능합니다.
// ( _ ) underbar로 접근하는 방법
let (_, justStatusMessage) = http404Error
print("HTTP 상태 메시지는 \(justStatusMessage)입니다.") // HTTP 상태 메시지는 Not Found입니다.
// Index로 접근하는 방법
print("HTTP 상태 코드는 \(http404Error.0)입니다.") // HTTP 상태 메시지는 Not Found입니다.
print("HTTP 상태 메시지는 \(http404Error.1)입니다.") // HTTP 상태 메시지는 404입니다.
4. 튜플을 정의할 때 튜플에 속한 각 내용물의 이름을 정할 수도 있습니다.
let http200Status = (statusCode: 200, description: "OK")
print("상태코드는 \(http200Status.statusCode)입니다.") // 상태코드는 200입니다.
print("상태메시지는 \(http200Status.description)입니다.") // 상태메시지는 OK입니다.
옵셔널 (Optionals)
값이 존재할 수도, 존재하지 않을 수도 있는 상황에서 옵셔널을 사용합니다.
옵셔널 타입은 String? , Int? 이런식으로 타입 뒤에 물음표를 붙입니다.
nil
옵셔널 타입의 변수를 값이 존재하지 않는 상태로 만들고 싶다면 해당 변수에 nil값을 저장하면 됩니다.
var serverResponseCode: Int? = 404
serverResponseCode = nil
만약 옵셔널 변수를 선언하는 과정에서 기본값을 제공하지 않는다면, 해당 변수에는 nil값이 자동으로 저장됩니다.
// ( O )
var surveyAnswer: String?
print(surveyAnswer) // nil
// ( X )
var surveyAnswer: String
print(surveyAnswer) // error
if문과 강제 해제
강제 해제란 옵셔널 상수나 변수가 있을때 해당 변수를 그냥 출력하게되면 Optional(해당변수 값) 형태로 출력이 됩니다.
let optional: String? = "optional 값"
print(optional)
// Optional("optional 값")
이렇게 말이죠.
옵셔널을 해제하는 방법은 몇가지 있지만 강제해제는 해당 값이 확실히 있다는걸 알고 있을때 사용합니다.
아래 if 조건문을 볼게요.
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber) // 123
if convertedNumber != nil {
print("convertedNumber 상수는 정수 값")
}
// 조건문이 참 이므로
// convertedNumber 상수는 정수 값
if convertedNumber != nil {
print("convertedNumber 상수엔 \(convertedNumber!)의 정수 값이 존재")
print("\(convertedNumber)")
}
// convertedNumber 상수엔 123의 정수 값이 존재
// Optional(123)
마지막 조건문에서 print 부분을 보면 convertedNumber! 라고 뒤에 느낌표 ( ! )를 붙여 Optional을 없애줄 수 있습니다.
NOTE
만약 값이 존재하지 않을때 (!) 로 강제해제 하려고 하면 런타임 오류가 발생해 앱이 꺼져버리니, 값이 꼭 있을때만 !! 사용합시다.
옵셔널 바인딩 (Optional binding)
옵셔널에 값이 존재하는지 확인하는 방법으로 옵셔널 바인딩이 있습니다.
만약 해당 옵셔널에 값이 존재한다면 해당 값을 일시적으로 상수, 변수로 사용가능하도록 만들 수 있습니다.
if나 while문을 사용하여 해당 옵셔널에 값 존재를 확인하고, 값이 존재하면 그 값을 상수나 변수로 추출합니다.
이런 형태를 가집니다.
if let constantName = someOption {
statements
}
예)
let possibleNumber = "123"
if let actualNumber = Int(possibleNumber) {
print("문자열 \(possibleNumber)은 \(actualNumber) 정수 값을 가집니다.")
} else {
print("문자열 \(possibleNumber)은 정수로 변환될 수 없습니다.")
}
// 문자열 123은 123 정수 값을 가집니다.
possibleNumber에 문자열 123이 저장되고,
Int(possibleNumber)로 값을 Int 타입으로 변환을 시도해서 변환이 된다면, actualNumber라는 상수에 저장을 시키고 조건문이 true이니 문자열 123은 123 정수 값을 가집니다. 라는 문구가 출력됩니다.
만약 possibleNumber가 정수로 변환될 수 없다면?
let possibleNumber = "hello"
if let actualNumber = Int(possibleNumber) {
print("문자열 \(possibleNumber)은 \(actualNumber) 정수 값을 가집니다.")
} else {
print("문자열 \(possibleNumber)은 정수로 변환될 수 없습니다.")
}
// 문자열 hello은 정수로 변환될 수 없습니다.
else문이 실행이 되겠죠??
NOTE
꼭 if let 으로 쓸 필요는 없습니다.
if var로 사용해도 되며, 이럴 경우 상수 대신 변수로 사용될 뿐입니다.
추가로
if문 안에는 여러 개의 옵셔널 바인딩과 불리언 조건을 포함시킬 수 있습니다.
단 구분을 해줘야 하기 때문에 쉼표(,)를 사용해줍니다.
만약 옵셔널들 중 하나라도 값이 nil 이거나, 불리언 조건이 false가 된다면 if문 전체가 false 처리됩니다.
예)
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
} else {
print("false가 하나라도 있으면 false 처리!")
}
// 4 < 42 < 100
if let firstNumber = Int("1000"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
} else {
print("false가 하나라도 있으면 false 처리!")
}
// false가 하나라도 있으면 false 처리!
'iOS' 카테고리의 다른 글
[Swift] 싱글톤 패턴 (Singleton) (0) | 2021.12.15 |
---|---|
[Swift] mutating (0) | 2021.12.11 |
[Swift] 기본 연산자 (Basic) (0) | 2021.12.05 |
[Swift] Lazy Stored Properties (지연 저장 프로퍼티) (0) | 2021.11.30 |
[iOS] DatePicker, DateFormatter (0) | 2021.11.25 |
- Total
- Today
- Yesterday
- iOS error
- removeLast()
- Class
- swift 고차함수
- Swift final
- swift property
- Swift 프로그래머스
- Swift Error Handling
- Swift joined()
- Combine: Asynchronous Programming with Swift
- Swift
- Swift joined
- swift reduce
- swift programmers
- Swift ModernRIBs
- Swift RIBs
- 2023년 회고
- Swift 알고리즘
- RTCCameraVideoCapturer
- Swift inout
- RIBs tutorial
- 원티드 프리온보딩
- swift protocol
- Swift Leetcode
- CS 네트워크
- swift (programmers)
- Swift init
- ios
- Swift 내림차순
- Swift 프로퍼티
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |