본문 바로가기

iOS 앱 개발자 프로젝트/Swift 문법 정복하기

[Swift] Data Types and Operators

2024년 3월 6일 수요일

 

  • swift 기본 개념 중, 데이터 타입과 기본 연산자에 대해 명확하게 이해하는 것이 오늘의 목표!
  • swift의 타입(Type)은 변수 또는 상수에 저장될 데이터의 종류를 정의하는 것으로 안정성과 가독성을 높여줍니다.
  • 연산자를 통해 swift는 띄어쓰기에 주의해야 하는 언어라는 것을 다시금 기억하게 되었습니다.

 

1. Data Type

01. 숫자 (Int / Float / Double)

02. 참 혹은 거짓 (Bool)

03. 문자 (String / Charactor)

04. 다양한 값의 묶음 (Tuple)

05. 모든 타입 (Any)

06. 스위프트에서의 타입** (Built-in / Custom)

 

2. Operators

01. 산술 연산자

02. 비교 연산자

03. 논리 연산자

04. 범위 연산자

05. 삼항 연산자

+ Be careful!  

 

 

1. Data Type

데이터의 종류를 표현하는 타입에 대해 공부해 봅니다. 

 

1- 01. 숫자  : Int  / Float / Double

 

Int

  • 정수를 표현하는 데이터 타입으로 -2,147,483,648 ~ 2,147,483,647 사이 숫자를 표현
var age: Int = 18 // Int 타입

 

Float

  • 소수점을 표현하는 데이터 타입으로 32비트 부동 소수를 표현
  • Float의 정밀도는 소수점 이하 6자리까지 가능
var interestRate: Float = 1.2345678910 // Float 타입
print("이자율은 \(interestRate) % 입니다")
// 출력값: 이자율은 1.2345679 % 입니다

 

Double

  • 소수점을 표현하는 데이터 타입으로 64비트 부동소수를 표현
  • Double의 정밀도는 소수점 이하 15자리 이상 가능
  • Float 와 Doublt 두 유형 모두 적합한 상황에서는 Double을 사용하는 것이 좋음
var interestRate: Double = 1.2345678910123456789 // Double 타입
print("이자율은 \(interestRate) % 입니다")
// 출력값: 이자율은 1.2345678910123457 % 입니다

 

 

1- 02. 참 혹은 거짓  : Bool
  • 참 true와 거짓 false 을 표현할 수 있는 데이터 타입
// Bool 변수 선언 및 초기화
var isOpen: Bool = true
var isLogged: Bool = false

// 조건문에서 Bool 값 사용
if isOpen {
    print("문이 열려 있습니다.")
} else {
    print("문이 닫혀 있습니다.")
}

// Bool 값을 반환하는 함수
func checkLoginStatus(isLogged: Bool) {
    if isLogged {
        print("로그인되었습니다.")
    } else {
        print("로그인되지 않았습니다.")
    }
}

// 함수 호출
checkLoginStatus(isLogged: isLogged)

 

 

1- 03. 문자  : String / Character

 

String

  • 문자열을 표현하는 데이터 타입으로 텍스트를 표현
var emptyString: String = "" 
var anotherEmptyString = String()  

var variableString = "Mom"
variableString += " and Dad"
print(variableString)
// 출력값: "Mom and Dad"

 

Character

  • 하나의 문자를 표현하는 데이터 타입
let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]
let catString = String(catCharacters)
print(catString)
// Prints "Cat!🐱"

 

 

1- 04. 다양한 값의 묶음  : Tuple

 

Tuple

  • 튜플은 여러 값을 하나로 그룹화한 값
  • Tuple은 관련 값의 단순한 그룹에 유용하며, 복잡한 데이터 구조를 만드는 데는 적합하지 않다.
let http404Error: (Int, String) = (404, "Not Found")

let (justTheStatusCode, _): (Int, String) = http404Error
print("The status code is \(justTheStatusCode)")
// 출력값: "The status code is 404"

// 튜플 값에 접근하려면 순서를 알고 있어야 합니다.
print("The status code is \(http404Error.0)")
// 출력값: "The status code is 404"
print("The status message is \(http404Error.1)")
// 출력값: "The status message is Not Found"

// 각 엘레먼트에 이름을 붙일 수 있습니다.
let http200Status: (Int, String) = (statusCode: 200, description: "OK")

// 많은 데이터를 담는 데는 적합하지 않다 - 사용하는 쪽에서 또 매핑(Mapping)을 해야 함
let myInfo: (String, Int, Int, Int, String, String) = 
(name: "peter", registrationNumber: 970212, height: 185, weight: 75, job: "developer", hobby: "soccer")

 

 

1- 05. 모든 타입  : Any
  • Any는 다양한 데이터 타입의 값을 수용
  • Any 배열을 만들면 특정 타입의 배열이 아니라 여러 타입을 담을 수 있다.
  • 하지만 Any 데이터 형을 대입하려면 반드시 형 변환이 필요하다.
var anyArray: [Any] = [1,"Hi", true]

var anyValue: Any = 1000
anyValue = "어떤 타입도 수용 가능"
anyValue = 12345.67

// 컴파일 에러
let doubleValue: Double = anyValue  // 🚨 에러 메시지: Cannot convert value of type 'Any' to specified type 'Double'
// Any 타입에 Double 값을 넣는 것은 가능하지만
// Any는 Double 과 엄연히 다른 타입이기 때문에
// Double 타입의 값에 Any 타입의 값을 할당할 때에는 명시적으로 타입을 변환해 주어야 합니다.
// 타입 변환은 이후 강의에서 배우니 타입 변환이 필요하구나까지 알고 계시면 됩니다!

 

 

1- 06. 스위프트에서의 타입

 

Swift에서의 타입(Type)은 변수 또는 상수에 저장될 데이터의 종류를 정의하는 것이다. 모든 변수, 상수, 함수 매개변수, 함수 반환 값 등은 모두 특정한 타입을 가지고 있다. Swift는 강력한 타입 추론(Type Inference)을 지원하여 코드를 작성할 때 타입을 명시적으로 지정하지 않아도 컴파일러가 타입을 유추할 수 있는 경우가 많다.

 

Swift의 타입은 크게 아래 두 가지로 나뉜다.

 


1. 기본 데이터 타입 (Built-in Data Types):

 

Swift는 기본적인 데이터 타입들을 제공합니다. 이들은 구조체로 구현되어 있으며, 각각의 타입에 해당하는 값이 메모리에 직접 저장된다. 주요한 기본 데이터 타입에는 다음과 같은 것들이 있다:

 

  • Int: 정수 타입 (Int8, Int16, Int32, Int64 등)
  • UInt: 부호 없는 정수 타입
  • Float: 단정도 부동 소수점 숫자 타입
  • Double: 배정도 부동 소수점 숫자 타입
  • Bool: 불리언 타입 (true 또는 false)
  • String: 문자열 타입
  • Character: 단일 문자 타입
  • 그 외 다양한 기본 데이터 타입들이 존재

 

2. 사용자 정의 데이터 타입 (Custom Data Types):

 

Swift는 개발자가 직접 타입을 정의할 수 있는 능력을 제공하는데 이러한 사용자 정의 데이터 타입은 다음과 같은 것들이 있다:

 

  • 구조체(Structures): 멤버 변수와 메서드를 포함하는 타입
  • 클래스(Classes): 객체 지향 프로그래밍을 위한 참조 타입
  • 열거형(Enumerations): 관련된 값들의 그룹을 정의하는 타입
  • 프로토콜(Protocols): 특정 작업 또는 기능에 대한 메서드, 속성 및 요구 사항을 정의하는 타입

 

** 사용자 정의 데이터 타입은 프로그램에서 특정한 목적을 위해 데이터를 묶고 구조화하는 데 사용됩니다. 이러한 타입들을 사용하여 코드를 조직화하고 데이터 모델을 만들어 유연하고 확장 가능한 앱을 개발합니다. **

 

    • 타입 추론
    •       - 타입을 지정하지 않아도 컴파일러* 타입을 유추해주어 지정
    •          (변수명 위에 option버튼 누르고 마우스 클릭하면 타입을 볼 수 있음)
      • 컴파일러* 란?
        • Swift 컴파일러는 Swift 프로그램을 작성한 코드를 컴퓨터가 이해하여 실행 가능한 형태로 변환해주는 프로그램
        • 변환 과정은 크게 소스 코드를 분석하고, 그것을 기계어로 번역하는 단계로 이루어진다.
          1. 소스 코드 분석:
            • Swift 컴파일러는 코드를 읽고 문법적인 구조로 분해. 이 때, 코드의 토큰(Token) 단위로 나누어지는데 이 토큰들을 이용하여 코드의 구조를 이해하고 추상적인 트리 모양의 구조를 생성.
          2. 의미 분석:
            • 코드의 의미와 상호 작용을 이해하고 검증
            • 변수 선언, 함수 호출 등이 올바르게 이루어졌는지 확인
            • 이 과정에서 타입 체크(Type Checking)와 같은 작업이 이루어져 코드의 안정성을 확인
          3. 코드 최적화
            • 코드를 실행할 때 속도를 향상시키고 메모리를 효율적으로 사용하기 위해 최적화 작업을 수행
            • 이 최적화는 코드 실행 성능을 높이고, 실행 파일의 크기를 줄여준다.
          4. 코드 생성:
            • 최종적으로 최적화된 코드를 목표 플랫폼(예: iOS, macOS 등)에서 실행할 수 있는 기계어로 변환되며 이렇게 생성된 실행 파일은 해당 플랫폼에서 실행되어 우리가 작성한 Swift 프로그램을 실행한다.

 

** Swift 컴파일러는 이러한 과정을 거쳐 우리가 작성한 코드를 실행 가능한 형태로 만들어주는 역할을 합니다. 이는 우리가 Swift로 작성한 프로그램을 컴퓨터에서 실행할 수 있도록 해줍니다. **

 

  • 타입 안정성
  •       - 데이터 타입을 명확하게 사용하기 위해 다른 타입과의 연산은 불가능
var integer = 5
var double = 3.1

integer = double -> 불가능

integer + double -> 불가능

 

 

  • 타입 형변환

                - 타입 변환은 가능

let integerString = "321"
let number = Int(integerString)

print(number) // 321

let doubleString = "321.2"
let number2 = Int(doubleString)

print(number2) // nil -> 추후 학습 예정. 값이 없음을 표현

     

 

 

2. Operator

구현하고 싶은 로직을 만들기 위한 연산자를 공부해 봅니다.

 

2- 01. 산술 연산자
  • 덧셈
    • +
    • +=
  • 뺄셈
    • -
    • -=
  • 곱셈
    • *
  • 나눗셈
    • /
  • 나머지
    • %
var result = 1 + 2
print(result)
// 출력값: 3

result += 5
// result = result + 5
print(result)
// 출력값: 8

result = 10 - 6
print(result)
// 출력값: 4

result -= 3
// result = result - 3
print(result)
// 출력값: 1

result = 8 * 2
print(result)
// 출력값: 16

result = 12 / 5
print(result)
// 출력값: 2
result = 10 % 3
print(result)
// 출력값: 1
// result는 10을 3으로 나눈 후 나머지 이므로 1

 

 

2- 02. 비교 연산자

 

  -  비교 연산자는 비교한 값을 true와 false로 반환

  • 같다 / 같지 않다
    • a == b
    • !=
  • 크다 / 작다
    • a > b (a가 b보다 크다)
    • a < b (a가 b보다 작다)
  • 크거나 같다 / 작거나 같다
    • a >= b (a가 b보다 크거나 같다)
    • a <= b (a가 b보다 작거나 같다)
var result = (1 == 2)
print(result)
// 출력값: false

result = (1 != 2)
print(result)
// 출력값: true

result = (1 > 2)
print(result)
// 출력값: false

result = (1 < 2)
print(result)
// 출력값: true

result = (1 >= 2)
print(result)
// 출력값: false

result = (2 <= 2)
print(result)
// 출력값: true

 

 

2- 03. 논리 연산자

 

  -  논리 연산자는 비교한 값을 true와 false로 반환

  • 논리 부정 NOT
    • !a
      • 논리 부정 연산자는 true를 false로, false 를 true로 변환
  • 논리 곱 AND
    • a && b
      • 논리 곱 연산자는 두 값(a, b)이 모두 true일 때 true를 반환
      • 첫번째 값이 false라면 두 번째 값을 판단하지 않고 즉시 false를 반환
  • 논리 합 OR
    • a || b
      • 논리 합 연산자는 둘 중 하나가 true면 true를 반환
      • 첫번째 값이 true라면 두 번째 값을 판단하지 않고 true를 반환
var allowedEntry = false
allowedEntry = !allowedEntry
print(allowedEntry)
// 출력값: true

let enteredDoorCode = true
let passedRetinaScan = false
let permittedAccess = enteredDoorCode && passedRetinaScan
print(permittedAccess)
// 출력값: false

let enter = allowedEntry || permittedAccess
print(enter)
// 출력값: true

 

 

2- 04. 범위 연산자

 

  • (a…b)
    • a 이상 b 이하
  • (a..<b)
    • a이상 b 미만
    • b는 범위에 포함되지 않는다.
  • a... ...a
    • 범위의 시작 혹은 끝만 지정하여 사용하는 범위 연산자
    • a는 범위에 포함
(1...5)
// 1, 2, 3, 4, 5

(1..<5)
// 1, 2, 3, 4

(3...)
// 3, 4, 5, 6, 7 ...

let names = ["안나", "알렉스", "오드리", "잭"]

for name in names[2...] {
    print(name)
}
// 출력값: 
// 오드리
// 잭

for name in names[...2] {
    print(name)
}
// 출력값: 
// 안나
// 알렉스
// 오드리

for name in names[..<2] {
    print(name)
}
// 출력값: 
// 안나
// 알렉스

 

 

2- 05. 삼항 연산자
  • a ? b : c
    • question ? answer1 : answer2
    • question의 답이 true이면 answer1을, false면 answer2 값을 사용
    • if-else 문을 간략히 표현했다고 보면 된다.
let height = 150
var nickname = (height > 185) ? "Daddy Long Legs" : "TomTom"
print(nickname)
// 출력값: TomTom

// 이를 if-else 문으로 표현하면
var nickname2 = ""
if height > 185 {
	nickname = "Daddy Long Legs"
} else {
	nickname = "TomTom"
}

 

 

 Be careful!  

" Swift는 띄어쓰기도 신경써야 하는 언어입니다.

예를들어 a - b 와 a -b는 완전히 다른 의미입니다. a - b는 a에서 b를 빼는 수식이고 a -b 는 a와 -b를 의미합니다.

그러니 띄어쓰기에 주의해야 합니다! "