ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] Swift 문법 - (2) Types
    Front-End(Mobile)/iOS & Swift 2022. 1. 11. 02:36
    반응형

    이번 포스팅은 Swift 언어의 다양한 타입 및 자료형들에 대해 알아보려고 한다.

    Swift는 기본적으로 정적 타입(변수에 타입을 선언) 방식을 채택하기 때문에, 데이터 타입에 대해 짚고 넘어가는 것이 중요하다.


    📙 Data Types (데이터 타입)

    Swift에서도 다른 프로그래밍 언어들과 유사하게 데이터 타입들을 적용하고 있다.

    배열과 객체 같은 것들은 문법은 비슷하나, 명칭과 사용하는 방식들이 언어에 따라 조금씩 달라지곤 한다.

    아래 Swift 자료형들을 하나씩 확인해보자!

    • Boolean(불리언)
    • Int(정수), UInt(0, 양의 정수)
    • Float, Double(부동소수)
    • Character(문자), String(문자열)
    • Array(배열 혹은 리스트)
    • Dictionary(객체 혹은 사전형)
    • Range(범위형)
    • 튜플(타입 집합)
    • Any, AnyObject(모든 타입)
    • nil(없음), Optional(옵셔널)

     

     

     

    1. Bool(불리언)

    프로그래밍 언어에서 통용되는 true/false 찬반 형태의 자료형이다. 

    var t: Bool = true
    let f: Bool = false
    var nt: Bool = !t	// false

     

     

    2. Numeric(숫자형) - Int(정수), UInt(0, 양의 정수)

    정수 타입을 의미하며, Int는 양/음의 정수와 0을 / UInt는 0과 양의 정수만을 의미한다.

    또한, 정수 리터럴은 Int 외에도 Int8, Int16, Int32, Int64 등이 존재한다.

    var integer: Int = -100
    let unsignedInteger: UInt = 50
    
    var intMax = Int.max	// 9223372036854775807
    let intMin = Int.min	// -9223372036854775808

    Int의 최대값은 9223372036854775807, 최소값은 -9223372036854775808 이다. (Int.min, Int.max 로 확인가능)  

     

     

    3. Numeric(숫자형) - Float, Double(부동소수)

    부동소수점(.)을 사용하는 실수형이며, 이는 위 정수타입보다 더 넓은 범위의 수를 표현할 수 있다.

    Float는 32비트(최대 6자리), Double은 64비트(최대 15자리) 소수를 표현할 수 있다. 그렇기에, 모호한 경우 Double을 쓸 것을 추천한다.

    var b: Float = 22.45
    var c = Double(100.99)

     

     

    4. Character(문자), String(문자열)

    Character는 말 그대로 하나의 '문자'를 의미한다. Swift에서 문자를 지정할 때는 큰따옴표("")를 사용한다.

    let alphabetA: Character = "A"
    let commandCharacter: Character = "♡"
    let 한글변수이름: Character = "ᄀ"

    * 한글 및 유니코드 역시 문자 자료형으로 활용할 수 있음!

     

    String은 문자열(문자의 나열)을 의미한다. 마찬가지로 큰따옴표("")로 표현할 수 있다. (1개 문자인 Character도 String에 포함)

    let strA = "STRING A"
    var strB = B"
    var strC: String = "STRING C"
    var strD = String("STRING D")

     

    * String Interpolation

     

    Swift에도 string interpolation(문자열 보간식, Template Literals) 문법이 존재한다. 

    마찬가지로 큰따옴표("") 안에 작성하되, "\(변수명)" 양식으로 작성하면 된다.

    let test: String = "테스트"
    
    print("test: \(test)");		// test: 테스트

     

    * String Methods

     

    count(문자열 길이), index(특정 인덱스), contains(포함여부), prefix/suffix(접두어/접미어) 등등 String에 활용할 수 있는 함수들이 있다. (관련 링크)

     

     

     

    아래 일부 자료형들은 Collection Type(컬렉션 타입) 에 해당된다. (Array, Dictionary, Set)

    * Collection(컬렉션) : 하나 이상의 데이터를 보관할 수 있는 특수한 자료구조를 의미.

     

    5. Array(배열, 리스트)

    Array순서를 가진 컬렉션으로 Element(요소)의 타입을 선언해서 사용할 수 있다. (Array(String), Array(Int) 등)

    Array() 함수 혹은 대괄호([]) 문법을 통해 배열을 생성할 수 있다.

    let decimals = [ 10, 20, 30, 40 ]
    let names = [ "Chris", "Alex", "Ewa", "Barry", "Daniella" ]
    let complexes = [ 10, "str", 20 ]
    
    // 타입 선언
    // ~XCode6
    let animals: String[] = [ "cow", "dog", "cat" ]
    // XCode Beta3~
    let animals: [String] = [ "cow", "dog", "cat" ]

    Array는 특히, 이후에 배울 반복문(for...in 문 등)을 통해 각 요소를 순차적으로 접근할 수 있다.

    let nums : [Int] = [1, 2, 3, 4, 5]
    
    for num in nums {
      print(num)
    }
    
    // 1 2 3 4 5

     

    Array 역시 다양한 메서드 및 문법들을 지원하고 있다. (관련 링크)

    • count : Array 길이를 계산
    • Array[index] : 해당 index의 요소 추출
    • append(contentsOf) : 배열 맨 끝에 요소 추가
    • insert(contentsOf, at) : 특정 인덱스(at)에 요소를 추가
    • index(of) : 특정 요소의 인덱스를 추출
    • first / last : 처음 / 끝 요소를 추출
    • remove(at), removeFirst(), removeLast() : 특정 인덱스, 처음 및 끝 요소를 각각 제거
    • zip(arr1, arr2) : 복수의 배열을 병합해준다. (Javascript의 concat과 유사)

     

    * Set (중복없는 배열)

     

    Swift 1.2에서 "Set" 컬렉션 타입이 추가되었다. 배열과 유사하되, 중복되지 않는 값들을 보관하기 위한 목적이다. (집합)

    {요소1, 요소2, 요소3 ...} 형태로 자료형이 표현되며, 각 요소들은 반복해서 insert 해도 중복되지 않는다.

    var evenNumbers = Set([2, 4, 6, 8, 10])
    var oddNumbers = Set<Int>()
    
    oddNumbers.isEmpty
    // true
    
    oddNumbers.insert(1)
    oddNumbers.insert(3)
    oddNumbers.insert(1)    // returns 'nil'
    oddNumbers  // {3, 1}
    
    oddNumbers.insert(5)
    oddNumbers.insert(7)
    oddNumbers  // {3, 1, 5, 7}
    
    oddNumbers.insert(8)
    oddNumbers  // {3, 1, 5, 7, 8}
    oddNumbers.remove(8)
    oddNumbers  // {3, 1, 5, 7}

    이처럼, insert/remove로 추가/제거가 가능하며, 이미 존재하는 값이 들어오면 추가는 하되 nil을 반환하게 된다.

    또한, 집합의 개념으로 다양한 메서들들이 존재한다.

    • A.isDisjointWith(B) : A, B 두 집합의 교집합 존재 여부
    • Child.isSubsetOf(Parent) : Child 집합이 Parent 집합의 부분집합인지 여부
    • Parent.isSupersetOf(Child) : Parent 집합이 Child 집합을 부분집합으로 포함할 수 있는지 여부
    • A.union(B) / A.intersect(B) : A와 B의 합집합 / 교집합

     

     

    6. Dictionary(딕셔너리)

    딕셔너리 타입 Key(키) & Value(값) 쌍을 갖는 컬렉션이며, 키를 값에 접근하는 용도로 사용된다. (그렇기에, 키는 유니크함)

    Dictionary<Key, Value> 로 키와 값의 타입을 지정하며, ["Key1": Value1, "Key2": Value2, ...] 문법으로 쓸 수 있다.

    // 타입선언 (구)
    let a: Dictionary<Int, String> = [1: "a", 2: "b", 3: "c"]
    
    // 타입선언 (신)
    let a: [Int: String] = [1: "a", 2: "b", 3: "c"]
    // 반복문 접근
    
    var cars: [String: Int] = ["bmw": 3, "honda": 1, "lexus": 2]
    
    for (key, value) in cars {
      print(key, value)
    }
    
    // bmw 3
    // honda 1
    // lexus 2

     

    Dictionary도 다양한 메서드 및 문법을 지원한다. (관련 링크)

    • count : Dictionary 길이를 계산
    • Dictionary[key] : 해당 key의 value를 추출 (단, key가 존재하지 않아도 에러가 발생하지 않음. 대신, nil을 반환)
    • keys / values : key 값들 / value 값들 을 추출
    • first / last : 처음 / 끝 요소를 추출
    • updateValue(Value, forKey) : 특정 키(forKey)의 값을 Value 로 갱신

     

     

    7. Range(범위형)

    Range는 Swift에만 존재하는 특수 타입니다. 점 3개(...)는 이상/이하, 점 2개 + 부등호(..<)는 미만의 범위를 의미한다 .

    통상, for...in 반복문에서 많이 사용된다.

    1...5      // 1, 2, 3, 4, 5
    0..<10      // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    for n in 1...5 {
      print(n)
    }
    
    // 1
    // 2
    // 3
    // 4
    // 5

     

     

    8. Tuple(튜플)

    튜플은 단순히 변경이 불가능한 배열이라고 할 수 있다. 그렇기에, 대괄호가 아닌 괄호()로 정의한다. (파이썬과 유사)

    튜플은 특히 다양한 타입의 요소들을 담을 수 있으며, 이 요소들에 [튜플].[인덱스] 를 통해 순차적으로 접근할 수 있다.

    let tup = (1, "second item", 0.3)
    
    let first = tup.0      // 1
    let second = tup.1     // "second item"

    또한, 딕셔너리와 같이 Key-Value 형태로 대응시킬 수 있으며, 키 값을 통해 특정값을 가져올수도 있다.

    let httpStatus = (code: 404, description: "Not Found")
    
    println(httpStatus.code)   // 404

     

    튜플은 구조체(struct), 클래스(class) 등에서의 변수선언 및 활용을 대체할 수 있다. (통상, 객체 개념)

    또한, 함수나 API에서 다양한 타입이나 값들을 반환할 때 이를 효율적으로 할당할 수 있다.

    func plusAndMinus(a: Int, b: Int) -> (Int, Int) {
        return (a + b, a - b)
    }
    
    let (plusResult, minusResult) = plusAndMinus(1, 2)
    
    print(plusResult)	// 3
    print(minusResult)	// -1

     

     

    9. Any, AnyObject (모든 타입)

    Any는 말 그대로 모든 데이터 타입을 사용할 수 있다는 의미이다.

    편리해보일 수 있지만 그만큼 정확성이 결여되며, Any 변수에 각종 연산을 적용하면 에러가 발생한다. (타입확인 필요)

    let a: Any = 1
    let b: Any = 2
    
    a + b   // Complie error

    AnyObject모든 Object(클래스를 통해 생성된 인스턴스) 들을 지칭한다.

     

    또한, 이 Any, AnyObject 변수에는 "is" 연산자를 적용하여 타입의 일치유무를 확인할 수 있다.

    let some: Any = dec
    if some is Int {
        println("some is Int!!")
    }

     

     

    10. nil(없음), Optional(옵셔널)

    nil은 대체로 null, None, undefined와 같이 존재하지 않는 값의 의미이다.

    특히, 0 혹은 ""(Empty String)과 다르게 Swift의 nil은 정말 '데이터가 없음' 을 명확하게 의미한다.

    Swift의 모든 상수 혹은 변수는 기본적으로 nil 값을 가질 수 없으나, Optional 을 통해 이것이 가능해진다.

    var optionalString: String = nil		// error!
    var optionalString: String? = nil

    * Optional은 Swift에서 존재하는 특수한 문법이다.

     

    // Optional<Wrapped>
    enum Optional<Wrapped> {
        case none
        case some(Wrapped)
    }
    
    let n = Optional<Int>.none
    print(".none: \(n)")        // nil
    
    let s = Optional<Int>.some(5)
    print(".some: \(s)")        // Optional(5)
    
    
    // [변수명] : [타입]? 문법
    var a: Int?
    
    a = nil             // nil 리터럴 대입에 의한 .none 생성
    a = Optional(5)     // 이니셜라이저에 의한 .some 생성
    a = 3               // 대입에 의한 .some 생성

    위 예시처럼 Optional<Wrapped> enum을 통해 타입을 지정할 수 있으며, 더 쉬운 방법은 [타입]? 문법을 사용한다. 

     

    0) Wrapping

     

    Optional 값을 사용하려고 하면, 값이 존재하는지 혹은 nil인지 알 수 없으므로 wrap 된 상태로 반환된다.

    var optionalString: String? = “Hello”
    print(optionalString)		// Optional(“Hello”)

    이를 Unwrapping 할 수 있는 3가지 방법을 알아보자!

     

    1) Forced Unwrapping

     

    위 Wrapping된 Optional 값을 활용하기 위한 문법으로, [옵셔널]! 문법을 사용한다. 

    var optionalString: String? = “Hello”
    print(optionalString!)		// “Hello”
    let value1: String? = nil
    let value2: String! = nil // 여기서는 에러가 아닙니다.
    
    print(value) // nil 출력
    print(value2) // error

    두 번째 예시처럼 변수가 nil인 경우가 존재할 수 있으므로, 추천하는 방법이 아니다.

     

    2) ?? 연산자

     

    Optional<Wrapped> 값이 nil인 경우 대체할 수 있는 값을 지정하는 문법이다.

    let a: Int? = 10
    let b = a ?? 3 
    print(b)	// 10
    
    a = nil
    print(b)	// 3

     

    3) Optional Binding

     

    조건문 형태로 Optional<Wrapped> 값이 존재하는 경우에만 실행하는 구문을 작성할 수 있다.

    let a = Optional("한")       //Optional<String> 타입
    
    if let r = a {
        // do something         // a값이 존재하는(nil아 아닌)경우에 실행
    }

     

     

    11. Type Alias (타입 명명)

     

    Swift도 타입을 별도로 명명하여 사용할 수 있으며, 코드 가독성 향상을 위해 사용한다.

    typealias MyInt = Int;
    var tmp: MyInt = 100;

    이번에는 Swift에 존재하는 다양한 타입들, 또 해당 타입들로 이루어진 몇 가지 자료형(컬렉션, 튜플)들을 알아봤다.

    Type의 개념이 JS와 크게 다르지 않았으나, 상대적으로 정적인 언어인 만큼 nil(빈 값) 관리가 철저하였다. (Optional)

     

    특히, String, Array, Dictionary 등에서 쓰이는 다양한 메서드들 중 유용한 것들을 추후 별도로 정리해야할 필요성을 느꼈다.

     

    다음에는, 좀 더 복잡한 자료형인 Class(클래스), 그리고 이와 유사해 보이면서 Swift에서 처음으로 접한 Struct(구조체) 에 대해 알아보겠다.

     

     

    📎 출처

    - [Swift5 강의] iOS Academy(Part 3 - Types) : https://www.youtube.com/watch?v=48v8FH46mQs&list=PL5PR3UyfTWvfacnfUsvNcxIiKIgidNRoW&index=3 

    - [Swift5 강의] iOS Academy(Part 14 - Strings Tutorial) : https://www.youtube.com/watch?v=TqN9Asm0Zvo&list=PL5PR3UyfTWvfacnfUsvNcxIiKIgidNRoW&index=14

    - [Swift5 강의] iOS Academy(Part 15 - Array & Dictionaries) : https://www.youtube.com/watch?v=TqN9Asm0Zvo&list=PL5PR3UyfTWvfacnfUsvNcxIiKIgidNRoW&index=15

    - [Swift5 강의] iOS Academy(Part 16 - Ints, Floats, Doubles) : https://www.youtube.com/watch?v=TqN9Asm0Zvo&list=PL5PR3UyfTWvfacnfUsvNcxIiKIgidNRoW&index=16

     

    - throughkim 님의 블로그 : http://throughkim.kr/2017/04/05/swift-study

    - [자료형 기본] 야곰 님의 블로그 : https://blog.yagom.net/527  

    - [자료형 - 컬렉션] 야곰 님의 블로그 : https://blog.yagom.net/528

    - [String, Array Methods] tngusmiso 님의 블로그 : https://tngusmiso.tistory.com/44

    - seorenn 님의 블로그 : http://seorenn.blogspot.com/2014/06/swift_10.html

     

    반응형
Designed by Tistory.