Swift

Swift - 1. 데이터 타입

iosos 2023. 12. 24. 19:03

정수형 데이터 타입

  • 부호 있는 정수(signed) : 양수, 음수, 0 값 저장
  • 부호 없는 정수 (unsigned) : 양수, 0 값 저장

 

 

정수 지원

  • 8비트, 16비트 ,32비트, 64비트 지원
  • Int8, Int16, Int32, Int64
  • 부호 없는 비트 : UInt8, UInt16, UInt32, UInt64

→ Int 데이터 타입 사용 권장 : 코드가 실행되는 플랫폼에 맞는 정수 크기를 사용

  • 모든 정수형 데이터 타입은 해당 데이터 타입이 지원하는 최댓값, 최솟값을 알 수 있도록 범위 속성을 가짐
print("Int32 Min = \(Int32.min) Int32 Max = \(Int32.max)")
// Int32 Min = -2147483648 Int32 Max = 2147483647

 

 

 

부동소수점 데이터 타입

  • Float : 최대 32비트의 부동소수점 수 저장하기 위해 사용 (적어도 6자리)
  • Double : 최대 64비트의 부동소수점 수 저장하기 위해 사용 (적어도 15자리), Default

 

 

불리언 데이터 타입

  • Boolean : true, false 제공

 

 

 

문자 데이터 타입

  • 스위프트에서 문자는 내부적으로 그래핌 클러스터의 형태로 저장
    • 그래핌 클러스터 : 눈에 보이는 하나의 문자를 표현하기 위해 결합된 둘 이상의 유니코드 스칼라로 구성
var myChar1 = "f"
var myChar2 = ":"
var myChar3 = "X"

var myChar4 = "\u{0058}" // "X"

 

 

 

 

문자열 데이터 타입

  • 내부적으로 문자들의 집합으로 표시, 문자는 하나 이상의 유니코드 스칼라 값
  • 문자열 보간이라는 개념을 이용하여 변수, 상수, 표현식, 함수 호출을 조합하여 구성 가능
var userName = "John"
var inboxCount = 25
let maxCount = 100

var message = "\(userName) has \(inboxCount) messages. Message capacity remaining is \(maxCount-inboxCount) messages"
print(message)

// John has 25 messages. Message capacity remaining is 75 messages

 

 

 

  • 여러줄의 문자열은 삼중 따옴표 사용
  • 각 줄의 들여쓰기는 들여쓰기된 만큼에서 마지막 닫는 삼중 따옴표가 들여쓰기된 만큼을 뺀 양으로 계산
var multiline = """
        The console glowed
    Clealy Time was running out.

        "I thought you said"
    """
print(multiline)

/*
	The console glowed
Clealy Time was running out.

    	"I thought you said"
*/

 

 

 

특수 문자/이스케이프 시퀀스

var newline = "\n"      // 개행 문자
var backslash = "\\"    // "\"
/*
 \n : 개행
 \r : 캐리지 리턴
 \t : 탭
 \\ : 역슬래시
 \" : 쌍따옴표
 \' : 홑따옴표
 */

 

 

타입 선언과 타입 추론

  • 스위프트는 데이터 타입이 안전한 프로그래밍 언어
    • 변수의 데이터 타입이 한 번 정해지면 다른 타입의 데이터는 저장할 수 없음
var userCount : Int = 10

 

  • 타입 추론
    • 변수 또는 상수가 초기화되는 시점에 할당된 값의 타입을 판단하여 해당 타입으로 지정
    • 타입 선언 없이 상수를 선언하게 될 경우, 반드시 선언 시점에서 값을 할당해야 함
    • 하지만, 상수 선언 시 타입 선언을 사용하면 나중체 초기자에서 할당 가능
var signalStrength = 2.331    // Double 타입으로 간주
let conpanyName = "My Company" // String 타입으로 간주

let bookTitle : String
if false{
    bookTitle = "SwiftUI"
}else{
    bookTitle = " Andorid"
}

 

 

튜플

  • 여러 값을 하나의 항목으로 임시적으로 그루핑하는 방법
  • 서로 다른 타입의 값들이 튜플에 저장 가능
  • 인덱스 위치를 사용하여 접근 가능
let myTuple = (10, 432.443, "This is String")
let myString = myTuple.2
print(myString) // This is String

 

 

  • 하나의 구문으로 튜플에 있는 모든 값을 추출하여 변수 또는 상수에 각각 할당하는 방법
  • 선택 추출 방법
let (myInt, myDouble, myStr) = myTuple
print(myInt, myDouble, myStr) // 10 432.443 This is String

var (myInt, _, myStr) = myTuple

 

 

 

  • 튜플 생성 시점에 각각의 변수 할당 가능
let myTuple = (count :10, length : 432.433, message : "This is a String")
print(myTuple.length)   // 432.433

→ 튜플이 가진 강력한 기능 : 하나의 함수에서 여러 값을 반환 가능

 

 

 

 

옵셔널 타입

  • 목적 : 변수 또는 상수에 값이 할당되지 않은 상황을 처리하기 위해 안전하고 일관된 접근 방식 제공
  • 변수 선언 시, 데이터 타입 선언 다음 ‘?’ 문자를 두어 옵셔널이 되게 함
  • 어떤 값도 할당되지 않은 옵셔널은 실제로 nil 값을 가짐
var index : Int? 

 

 

  • 만약 옵셔널 값이 할당되었으면 해당 값이 옵셔널 내에서 ‘래핑되었다’ 고 말함
  • 옵셔널 안에 래핑된 값을 사용할 때는 ‘강제 언래핑’이라는 개념을 이용한다
  • 래핑된 값은 옵셔널 데이터 타입에서 옵셔널 이름 뒤에 느낌표(!)를 두어 추출
var index : Int?

index = 3
var treeArray = ["Oak", "Pine", "Yew", "Birch"]

if index != nil{
    print(treeArray[index!])
}else{
    print("index does not contain a value")
}
// Birch

→ print(treeArray[index]) (느낌표 제거 시 에러 발생)

error: DataType.xcplaygroundpage:74:21: error: value of optional type 'Int?' must be unwrapped to a value of type 'Int'

print(treeArray[index])

 

 

  • 옵셔널 바인딩
    • 지정된 옵셔널이 값을 가지고 있는지 확인
    • 옵셔널 변수가 값을 가지고 있는 경우 그 값을 변수 또는 상수에 할당하고 코드 실행
var index : Int?

index = 3
var treeArray = ["Oak", "Pine", "Yew", "Birch"]

// 옵셔널 바인딩
if let myValue = index {
    print(treeArray[myValue])
} else{
    print("index does not contain a value")
}
// Birch
  • myValue 상수는 if문 내에서만 사용 가능

 

 

 

타입 캐스팅과 타입 검사

  • 컴파일러가 어떤 값의 특정 타입을 식별하지 못하는 경우 발생
  • 이런 경우는 메서드나 함수가 반환하는 값이 불명확하거나 예상되지 않은 타입의 값일 때 발생함
  • as 키워드를 사용하여 코드가 의도하는 값의 타입을 컴파일러가 알 수 있게 함 → 타입 캐스팅(형 변환)
  • object(forKey:)  메서드가 반환하는 값을 String 타입으로 처리해야 한다고 알려주는 코드
let myValue = record.object(forKey: "comment") as! String 

 

 

  •  업캐스팅
    • 특정 클래스의 객체가 상위 클래스들 중 하나로 변형되는 것
    • as 키워드를 사용하여 수행
    • 변환이 성공할 것이라고 컴파일러가 알려줄 수 있기에 보장된 변환이라고 함
    • UIButton 클래스는 UIControl 클래스의 하위 클래스 → 안전하게 업캐스팅 가능
    let myButton : UIButton = UIButton()
    let myControl = myButton as UIControl
    

 

  • 다운 캐스팅
    • 어떤 클래스에서 다른 클래스로 만드는 변환이 일어날 때 발생
    • 안전하게 수행되거나 유효하지 않은 변환 시도를 컴파일러가 보장할 수 없음
    • 어떤 클래스에서 그 클래스의 하위 클래스로 변환
    • as! 키워드 사용 (강제 변환)
    • UIScrollView 클래스는 UITableView, UITextView 클래스라는 하위 클래스를 가짐
    • UIScrollView 객체를 UITextView 클래스로 변환하기 위해서는 다운 캐스팅 필요함
    let myScrollView : UIScrollView = UIScrollView()
    let myTextView = myScrollView as UITextView
    // 컴파일 에러 발생 (안정성 보장 X)
    
    let myTextView = myScrollView as! UITextView
    // 컴파일은 되지만, 실행 중에 충돌 발생 
    
    • 안전한 방법은 as? 를 사용한 옵셔널 바인딩
    • 변환이 수행되면 지정한 타입의 옵셔널 값이 반환되며, 오류 발생한 경우 nil
    import UIKit
    let myScrollView : UIScrollView = UIScrollView()
    
    if let myTextView = myScrollView as? UITextView{
        print("type cast to UITextView succeeded")
    } else{
        print("type cast to UITextView failed")
    }
    
    // type cast to UITextView failed
    

 

  • 타입 검사
    • is 키워드 사용
    • 해당 객체(myobject)가 MyClass 라는 이름의 클래스의 인스턴스인지 검사하는 코드
    if myobject is MyClass {
    	//myobject는 MyClass의 인스턴스이다.
    }
    

'Swift' 카테고리의 다른 글

Swift - 3. 제어 흐름  (0) 2023.12.26
Swift - 2. 연산자와 표현식  (0) 2023.12.24
Swift - Dictionary  (0) 2023.09.02
Swift - HIG (Human Interface Guide)  (0) 2023.08.28
Swift - Extension (확장)  (0) 2023.08.24