일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- motion.div
- axios
- hydration mismatch
- animation
- react-native-image-picker
- 비동기
- react native
- promise.all
- no-permission-handler-detected
- react
- CS
- named type
- React-Native업데이트
- Promise
- RN새로운아키텍쳐
- ios
- RN아키텍쳐
- react-native
- react-native-permissions
- RN업데이트
- Hash-table
- Swift
- async
- await
- private-access-to-photos
- debounce
- Throttle
- react animation
- rn
- javascript
- Today
- Total
하루살이 개발일지
Swift에서의 기본 데이터 타입 본문
Swift에 대한 다른 글
Swift의 변수, 상수, 정적 변수
Swift에서의 types
Swift는 강력한 타입 시스템을 가지고 있는 정적 타입 언어이다. 데이터 타입이란 다루어지는 데이터의 종류라고 할 수 있다.
모든 데이터 타입은 모두 Struct(구조체)를 기반으로 구현되어 있다.
데이터 타입
다음과 같은 것들이 있다.
문자열 타입 |
String (문자열 값) |
Character (한 글자를 표현하기 위함) | |
정수 타입 | Int (기본적으로 64비트 정수) |
UInt (부호 없는 정수) | |
부동 소수점 타입 | Double (64비트 부동 소수점 숫자) |
Float (32비트 부동 소수점 숫자) | |
불리언 타입 | Bool (true 또는 false) |
1. 문자열 타입 : String, Character
var name: String = "Haru"
String 타입은 여러 문자를 표현할 수 있다. 큰 따옴표("")로 감싸 표현한다.
var cha: Character = "😀"
cha = "하"
cha = "하루" // 에러! 한 문자가 아닌 String 타입이므로 할당이 불가능
반면 Character 타입은 한 글자(문자)를 표현하기 위한 타입이다. 큰 따옴표("")로 감싸 표현한다. 유니코드 내 모든 문자를 표현할 수 있다.
2. 정수 타입 : Int, UInt
var integer: Int = -42
var unsignedInteger: UInt = 42
Int에는 플랫폼에 따라 32비트 또는 64비트 정수 타입을 저장한다. 양수와 음수 모두 저장 가능하다.
반면 UInt는 부호 없는 정수 타입이며, 0과 양수만을 저장할 수 있다.
3. 부동 소수점 타입 : Double, Float
let highPrecisionNumber: Double = 12345.67890123456789012345
print(highPrecisionNumber) // 출력: 12345.678901234567
let lowPrecisionNumber: Float = 12345.67890123456789012345
print(lowPrecisionNumber) // 출력: 12345.6787
Swift에서 부동 소수점 타입은 소수점이 있는 숫자를 표현한다. Float와 Double의 차이점은 정밀도와 메모리 사용량에 있다.
Double은 64비트 부동 소수점 타입으로 약 15자리의 유효숫자를 저장할 수 있다. 높은 정밀도가 필요한 계산에 사용되며, 상대적으로 메모리 사용량이 많다.
Float는 32비트 부동 소수점 타입으로 약 6~7자리 유효 숫자를 저장할 수 있다. 메모리 사용량이 적지만 상대적으로 덜 정밀한 계산에 사용된다.
4. 불리언 타입 : Bool
var isComplete: Bool = false
Bool 타입은 true 또는 false 값을 가질 수 있다.
Any, AnyObject, nil
Any
Any는 Swift 내 모든 타입을 가리키는 타입이다.
var someAny: Any = 100
someAny = "어떤 타입도 수용 가능"
someAny = 123.12
AnyObject
AnyObject는 모든 클래스 타입을 지칭하는 타입이다. 클래스의 인스턴스만 지칭할 수 있기 때문에, 클래스의 인스턴스가 아니면 할당할 수 없다.
class SomeClass {}
var someAnyObject: AnyObject = SomeClass()
someAnyObject = 123.12 // 컴파일 오류발생
타입 세이프티(Type Safety)와 타입 추론(Type Interference)
Swift는 타입-세이프 (type-safe) 언어이다. 타입 세이프 언어를 사용하면 코드에서 사용할 수 있는 값의 타입을 명확하게 알 수 있다.
Swift는 타입 세이프이기 때문에 코드를 컴파일할 때 타입 검사를 수행하고, 일치하지 않는 타입을 오류로 표시한다. 이를 통해 개발 단계에서 가능한 빨리 오류를 포착하고 수정할 수 있다.
한편 모든 상수와 변수의 타입을 반드시 지정해야 하는 것은 아니다. 필요한 값의 특정 타입을 지정하지 않으면 Swift는 타입 추론(Type Inference)을 사용하여 적절한 타입으로 결정한다. 타입 추론을 통해 컴파일러는 코드를 컴파일할 때 제공된 값을 검사하여 특정 식의 타입을 자동으로 추론할 수 있다. 이 덕분에 C나 Object-C등과 같은 언어보다 타입 선언이 덜 필요하다.
타입 추론은 상수 또는 변수에 초기값을 선언할 때 매우 유용하다. 이는 종종 선언 시점에 상수 또는 변수에 리터럴 값(literal value)을 지정하여 수행된다. (리터럴 값은 소스 코드에 직접 표시되는 값이다. 예: 42 및 3.14159)
let meaningOfLife = 42
// meaningOfLife는 Int 타입으로 추론
이처럼, 어떤 타입인지 선언하지 않고 새로운 상수를 42의 리터럴 값으로 지정하면 Swift는 정수처럼 보이는 숫자로 초기화했기 때문에 상수가 `Int`라고 추론한다.
반대로 어떤 부동 소수점 리터럴의 타입인지 선언하지 않으면 Swift는 부동 소수점 숫자의 타입을 추론할 때 항상 `Float`보다 `Double`을 선택한다.
let pi = 3.14159
// pi는 Double 타입으로 추론
표현식에서 정수와 부동소수 리터럴을 결합하면 컨텍스트에서 `Double` 타입으로 추론된다.
let anotherPi = 3 + 0.14159
// anotherPi는 Double 타입으로 추론
여기서 3이라는 리터럴 값에는 명시적인 타입이 없으므로, 추가로 부동 소수점 리터럴이 존재하는 경우 `Double`로 추론된다.
타입 별칭 (Types Aliases)
타입 별칭이란 이미 존재하는 타입을 다른 이름으로 정의하는 것이다. `typealias` 키워드를 사용해 정의한다.
이는 외부에서 상황에 맞는 이름으로 기존 타입을 참조해야 할 경우 유용하다.
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
// maxAmplitudeFound is now 0
AudioSample은 UInt16의 별칭으로 정의되었고, AudioSample.min은 UInt16.min을 실제로 호출한다.
튜플 (Tuples)
튜플이란, 사용자가 임의로 여러 개의 값(또는 데이터)을 묶은 것이다. 튜플 안의 값은 어떤 타입이든 가능하고 서로 같은 타입일 필요는 없다.
사용 방법
1. 원하는 변수나 상수에 데이터 값들을 `()` 안에 넣어주면 된다. 튜플에서도 Swift의 타입 추론이 적용되므로, 데이터 타입을 생략할 수 있다.
let http404Error: (Int, String) = (404, "Not Found")
let http404Error = (404, "Not Found") // 타입 선언을 생략해도 된다.
2. 튜플의 내용을 별도의 변수나 상수로 분해(decompose)하여 사용할 수도 있다. 주의할 점은 튜플의 구성 요소 개수만큼 변수나 상수를 선언해주어야 한다.
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)") // Prints "The status code is 404"
print("The status message is \(statusMessage)") // Prints "The status message is Not Found"
3. 튜플의 값 중 일부만 필요한 경우 밑줄(_) 처리해 무시할 수 있다.
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)") // Prints "The status code is 404"
4. 인덱스를 사용해 튜플의 값에 접근할 수도 있다.
print("The status code is \(http404Error.0)") // Prints "The status code is 404"
print("The status message is \(http404Error.1)") // Prints "The status message is Not Found"
5. 튜플을 정의할 때 튜플의 요소에 이름을 정할 수 있다. 이렇게 이름이 있다면 요소의 값에 이름으로 접근할 수 있다.
let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)") // Prints "The status code is 200"
print("The status message is \(http200Status.description)") // Prints "The status message is OK"
사용 상황
튜플은 반환값이 여러개인 함수의 반환 값으로 유용하다. 앞서 예시로 들었던 데이터를 불러오는 경우 (Int, String) 을 반환하는 함수를 만들 때 유용할 수 있다. 그러나, 복잡한 데이터 구조를 생성하는 경우 튜플보다는 클래스(class) 또는 구조체(Structure) 가 더욱 적합하다.
Reference
https://bbiguduk.gitbook.io/swift/language-guide-1/the-basics
https://www.youtube.com/watch?v=48v8FH46mQs&list=PL5PR3UyfTWvfacnfUsvNcxIiKIgidNRoW&index=3
'앱개발 > Swift' 카테고리의 다른 글
[Swift] 함수 (1) | 2024.06.08 |
---|---|
Swift란? Swift에서의 변수, 상수, 정적 변수 (1) | 2024.05.30 |