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 프로그램을 작성한 코드를 컴퓨터가 이해하여 실행 가능한 형태로 변환해주는 프로그램
- 변환 과정은 크게 소스 코드를 분석하고, 그것을 기계어로 번역하는 단계로 이루어진다.
- 소스 코드 분석:
- Swift 컴파일러는 코드를 읽고 문법적인 구조로 분해. 이 때, 코드의 토큰(Token) 단위로 나누어지는데 이 토큰들을 이용하여 코드의 구조를 이해하고 추상적인 트리 모양의 구조를 생성.
- 의미 분석:
- 코드의 의미와 상호 작용을 이해하고 검증
- 변수 선언, 함수 호출 등이 올바르게 이루어졌는지 확인
- 이 과정에서 타입 체크(Type Checking)와 같은 작업이 이루어져 코드의 안정성을 확인
- 코드 최적화
- 코드를 실행할 때 속도를 향상시키고 메모리를 효율적으로 사용하기 위해 최적화 작업을 수행
- 이 최적화는 코드 실행 성능을 높이고, 실행 파일의 크기를 줄여준다.
- 코드 생성:
- 최종적으로 최적화된 코드를 목표 플랫폼(예: 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로 변환
- !a
- 논리 곱 AND
- a && b
- 논리 곱 연산자는 두 값(a, b)이 모두 true일 때 true를 반환
- 첫번째 값이 false라면 두 번째 값을 판단하지 않고 즉시 false를 반환
- a && b
- 논리 합 OR
- a || b
- 논리 합 연산자는 둘 중 하나가 true면 true를 반환
- 첫번째 값이 true라면 두 번째 값을 판단하지 않고 true를 반환
- a || b
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를 의미합니다.
그러니 띄어쓰기에 주의해야 합니다! "
'iOS 앱 개발자 프로젝트 > Swift 문법 정복하기' 카테고리의 다른 글
[Swift] array, set, dictionary and OOP (1) | 2024.03.10 |
---|---|
[Swift] queue & stack (0) | 2024.03.10 |
[Swift] optional & nil (0) | 2024.03.08 |
[Swift] if, switch & for, while (4) | 2024.03.07 |
[Swift] Property, Print and Function (0) | 2024.03.05 |