1. Swift의 기본 데이터 타입
1.1 변수와 상수
- 변수(Variable): var 키워드를 사용하여 선언하며, 값을 변경할 수 있습니다.
- 상수(Constant): let 키워드를 사용하여 선언하며, 한 번 값이 설정되면 변경할 수 없습니다.
var name = "Alice"
var age = 20
let birthYear = 2003
print("이름: \(name), 나이: \(age), 출생 연도: \(birthYear)")
name = "송눈섭"
birthYear = 2005 // Error!!
요렇게 var, let 키워드를 활용해서 변수, 상수 선언을 하고 후에 상수를 변경하려고 하면 에러를 볼 수 있게 된다 !
1.2 자료형
타입 | 설명 | 예제 |
Int | 정수형 숫자 (64비트 정수형) | let id: Int = 14 |
Double | 소수점을 포함한 숫자 (64비트 부동소수형) | let pi: Double = 3.14159 |
Float | 소수점을 포함한 숫자 (32비트 부동소수형) | let shortPi: Float = 3.14 |
String | 텍스트 데이터(문자열)를 저장하는 타입 (문자 타입: Character) | let message: String = "무야호~" |
Bool | 참(true) 또는 거짓(false) 값을 저장 | let isBandBoomOn: Bool = true |
1.3 데이터 타입 변환(Type Casting)하기
Swift에서는 서로 다른 데이터 타입 간 변환이 필요할 때 명시적 변환을 사용한다.
- 정수 --> 실수 : Double(정수)
- 실수 --> 정수 : Int(실수) // 소수점 이하 버림
- 숫자 --> 문자열 : String(숫자)
let score: Double = 95.7
let intScore = Int(score)
let age = 20
let ageMessage = "나는 \(String(age))살입니다."
print("정수형 점수: \(intScore)") // 정수형 점수: 95
print(ageMessage) // 나는 20살입니다.
상수 Score의 95.7이라는 값을 가지고 intScore에 정수로 변환된 값으로 선언해줌. 그럼 소수점 빠져서 95가 되어 들어감!
age라는 정수를 String(age)를 통해 문자열로 변환시켜 ageMessage 문자열에 포함시켜줬으니 나는 20살입니다. 가 나옴!
2. 연산자의 이해
2.1 산술 연산자 (Arithmetic Operators)
가장 익숙한 연산자다. 덧셈 뺄셈 곱하기 나누기 나머지~
연산자 | 설명 | 에제 |
+ | 덧셈 | let sum = 10 + 5 |
- | 뺄셈 | let diff = 10 - 5 |
* | 곱셈 | let product = 10 * 5 |
/ | 나눗셈 | let quotient = 10 / 5 |
% | 나머지 연산 | let remainder = 10 % 3 |
let a = 10
let b = 3
print("덧셈: \(a + b), 뺄셈: \(a - b)")
print("곱셈: \(a * b), 나눗셈: \(a / b), 나머지: \(a % b)")
2.2 비교 연산자 (Comparison Operators)
연산자 | 설명 | 예제 |
== | 값이 같은지 비교 | a == b |
!= | 값이 다른지 비교 | a != b |
> | 왼쪽 값이 더 큰지 비교 | a > b |
< | 오른쪽 값이 더 큰지 비교 | a < b |
>= | 왼쪽 값이 크거나 같은지 비교 | a >= b |
<= | 오른쪽 값이 크거나 같은지 비교 | a <= b |
let height1 = 176.3
let height2 = 177.8
print("키 비교: \(height1 > height2)") // true, false로 출력됨
예를 들어 비밀번호 설정 로직에서 비밀번호, 비밀번호 확인 필드에 있는 값이 유효한지도 봐야하지만 서로 같은지 또한 봐야하는데 이럴 때 쓴다~
2.3 논리 연산자(Logical Operators)
연산자 | 설명 | 예제 |
&& | AND (둘 다 참이어야 참) | true && false -> false |
! | NOT (참을 거짓으로, 거짓을 참으로) | !true -> false |
|| | OR (둘 다 거짓이어야 거짓) | false || true -> true |
if !emailField.text.isEmpty && validateEmail(emailField.text) {
print("이메일 필드 유효성 검증 성공!")
}
뭐 요런 느낌으로 ... 쓴다.
2.4 할당 연산자(Assignment Operators)
연산자 | 설명 | 예제 |
= | 값 할당 | var x = 10 |
+= | 더한 후 할당 | x += 5 // x = x + 5 |
-= | 뺀 후 할당 | x -= 5 // x = x - 5 |
*= | 곱한 후 할당 | x *=2 // x = x * 2 |
/= | 나눈 후 할당 | x /= 2 // x = x / 2 |
var number = 10
number += 5
print("현재 값: \(number)")
2.5 응용
1. 값을 바꿔보면서 출력해봅시다~
var num1 = 12 // 후에 값을 한번 바꿔줄거니깐 var로 선언
let num2 = 7
let sum = num1 + num2
let difference = num1 - num2
let product = num1 * num2
let quotient = num1 / num2
let remainder = num1 % num2
print("덧셈: \(sum), 뺄셈: \(difference)")
print("곱셈: \(product), 나눗셈: \(quotient), 나머지: \(remainder)")
num1 = 15
let newSum = num1 + num2
let newDifference = num1 - num2
let newProduct = num1 * num2
let newQuotient = num1 / num2
let newRemainder = num1 % num2
print("덧셈: \(newSum), 뺄셈: \(newDifference)")
print("곱셈: \(newProduct), 나눗셈: \(newQuotient), 나머지: \(newRemainder)")
2. 성적 평가 프로그램
let score = 78
if score >= 90 {
print("A 등급입니다!")
} else if score >= 80 {
print("B 등급입니다!")
} else if score >= 70 {
print("C 등급입니다!")
} else {
print("더 노력하세요!")
}
C 등급입니다! 가 출력되겠지요
3. 조건문 이해하기
3.1 if - else 문
- 특정 조건이 참(true)이면 실행되고, 거짓(false)이면 다른 코드가 실행됨.
- 단순한 조건을 확인할 때 주로 사용된다. (요런 쓰임새 알려주는거 좋네)
- 한 가지 조건이 참일 경우와 그렇지 않을 경우의 두 가지 경우를 나누어 처리하고 싶을 때 유용합니다.
let temperature = 30
if temperature > 25 {
print("더운 날씨입니다.")
} else {
print("시원한 날씨입니다.")
}
temperature이 30이기에 25보다 크지요? 그러므로 if 조건에서 참으로 실행이 됩니다.
반대로 그 외 모든 경우엔 else 블록에 있는 코드들이 실행됩니다.
주로 참 혹은 거짓 딱 두 가지 경우로 나뉘는 상황에서 쓰임.
3.2 else if 문
- 여러 개의 조건을 순차적으로 검사해야 할 때 사용된다.
- 조건이 하나로 끝나는 것이 아니라, 추가적인 조건을 확인해야 할 경우에 적합하다.
let score = 85
if score >= 90 {
print("A 등급입니다!")
} else if score >= 80 {
print("B 등급입니다!")
} else {
print("더 노력하세요!")
}
3.3 switch 문
- 여러 경우의 고정된 값을 비교해야 할 때 사용된다.
- 비교할 값이 많아질 경우 if-else if 문보다 코드가 깔끔해지고 가독성이 높아진다.
- Swift의 switch문은 범위 값을 지원하므로 다양한 경우에 유용하다.
var errorMessage: String {
switch self {
case .invalidResponse:
return "Invalid response from server"
case .alreadyRegistered:
return "이미 존재하는 유저입니다."
case .tooManyRequestCode:
return "이메일 인증 요청은 하루 최대 3회까지 요청할 수 있습니다.\n24시간 뒤에 다시 시도해주세요."
case .failedToSendEmail:
return "이메일 전송에 실패했습니다."
case .notValidCode:
return "유효하지 않은 인증 코드입니다."
case .tooManyAttempts:
return "이메일 인증 횟수 초과"
case .unknownUser:
return "알 수 없는 유저입니다."
case .passwordAlreadyExists:
return "비밀번호를 이미 설정하셨습니다."
case .nicknameAlreadyExists:
return "이미 설정된 닉네임입니다."
case .passwordNotSet:
return "비밀번호를 아직 설정하지 않으셨습니다."
case .profileNameNotSet:
return "프로필 이름을 아직 설정하지 않으셨습니다."
case .serverError:
return "Server error occured"
case .networkError:
return "Network error occured"
case .unknown(let message):
return message
}
}
enum이 같이 쓰이는 경우인데, 후에 이 방법 좀 많이 쓸 것 같다.
3.4 요약
- if-else 문: 단순한 참/거짓 조건 처리
- else if 문: 여러 개의 조건을 순차적으로 검사
- switch 문: 고정된 값에 따라 다양한 경우를 처리할 때, 특히 조건이 많을 때.
3.4 응용
1. 나이에 따른 영화 관람 가능 여부
let age = 14
if age >= 19 {
print("청소년 관람 불가 영화를 볼 수 있습니다.")
} else if age >= 13 {
print("일반 영화는 볼 수 있지만 청소년 관람 불가 영화는 볼 수 없습니다.")
} else {
print("보호자 동반이 필요합니다.")
}
2. 시험 점수에 따른 학점 부여
let score = 87
var grade = ""
if score >= 90 {
grade = "A"
} else if score >= 80 {
grade = "B"
} else if score >= 70 {
grade = "C"
} else if score >= 60 {
grade = "D"
} else {
grade = "F"
}
print("점수: \(score)\n\(grade) 학점")
답안에선 직접 다 print해줬는데 그냥 다른 방식으로 한번 해보았다.
4. 반복문 이해하기
4.1 for-in 문
- 가장 익숙한 반복문이다. 정해진 횟수만큼 반복해야 할 때 사용한다.
- 배열(Array) 또는 범위(Range)의 요소를 순회할 때 사용한다.
- 단, 반복 횟수가 미리 정해져 있어야 함.
- 범위를 사용하여 특정 범위의 숫자를 반복할 수 있음.
let names = ["Alice", "Bob", "Charlie"]
for name in names {
print("이름: \(name)")
}
for i in 1...5 {
print("반복 \(i)회")
}
4.2 while 문
- 반복 횟수가 정해져 있지 않고, 특정 조건이 참(true)일 동안 반복할 때 사용한다.
- 루프를 실행하기 전 조건을 먼저 검사.
- 조건이 거짓(false)이면 반복을 실행하지 않음.
- 사용 사례
- 반복 횟수를 미리 알 수 없을 때.
- 사용자가 특정 조건을 만족할 때까지 반복해야 할 때.
- 게임의 메인 루프처럼 계속 실행해야 할 때.
var number = 1
while number <= 10 {
print("현재 숫자: \(number)")
number += 1
}
var input = -1
while input != 0 {
print("숫자를 입력하세요 (0을 입력하면 종료): ")
if let userInput = readLine(), let num = Int(userInput) {
input = num
}
}
print("프로그램 종료")
오랜만에 저학년 때 C로 쓰던 코드 생각나네요
4.3 repeat-while 문
- 최소 1회 실행이 보장된 상태에서 특정 조건이 참일 동안 반복할 때.
- while 문과 달리, 먼저 실행한 후 조건을 검사.
- 조건이 거짓(false)이더라도 한 번은 반드시 실행.
- 사용 사례
- 사용자 입력을 최소 한 번 이상 받아야 할 때.
- 최소 한 번 실행이 필요한 루프(예: 로그인 시 비밀번호 입력).
- 데이터를 처리한 후 조건을 검사해야 할 때.
// 1회 이상 실행 후 조건 검사
var count = 0
repeat {
print("반드시 한 번 실행됩니다! (현재 count: \(count))")
count += 1
} while count < 3
repeat 문은 이전에 몰랐는데 ...!
이러면 2까지는 실행된다~!
var password = ""
repeat {
print("비밀번호 입력: ")
password = readLine() ?? ""
} while password != "1234"
print("비밀번호가 맞습니다!")
요 예제는 Playground 특성상 readLine()이 안되는 게 있어서 New Project -> macOS - Command Line Tool로 생성해서 테스트할 수 있다고 한다.
4.4 응용
1~100 사이의 랜덤하게 정해져 있는 숫자를 사용자가 맞추는 게임.
let answer = Int.random(in: 1...100)
var guess = 0
while guess != answer {
print("숫자를 입력하세요: ")
if let input = readLine(), let num = Int(input) {
guess = num
if guess > answer {
print("더 작은 숫자를 입력하세요!")
} else if guess < answer {
print("더 큰 숫자를 입력하세요!")
} else {
print("축하합니다! 정답입니다!")
}
}
}
기초 다질 겸 다시 한번씩 보는데 각 자료형이 몇 바이트를 차지하는지 배웠던 기억이 있는데 기억이 안나 오랜만에 검색해보았다.
나중에 효율적으로 메모리쓰려면 꼭 알아야된다는 생각이 있어서...!
이거 코드 블럭 테마도 바꿔줘야겠네,,
'iOS > Swift' 카테고리의 다른 글
[TIL / 25.02.11] 사이드메뉴를 구현해보자 . . . ! (0) | 2025.02.11 |
---|---|
[TIL / 25.02.10] 헤더를 이용한 테이블뷰를 구성, 셀과 헤더 높이 자동 계산 (4) | 2025.02.10 |
[TIL / 25.02.07] 라이브러리 사용해서 상단 탭바 구현하기 2 (0) | 2025.02.07 |
[TIL / 25.02.06] 라이브러리 사용해서 상단 탭바 구현하기 1 (5) | 2025.02.06 |
[TIL / 24.02.05] 함수의 기초 복습해봅시다 ! (5) | 2025.02.05 |