앱을 만들다 보면 데이터를 저장하고,
필요할 때 꺼내서 바꾸거나 유지해야 할 때가 많음
ex)
점수는 계속 바뀌니까 → 변수(var)
생일은 안 바뀌니까 → 상수(let)
| 키워드 | 뜻 | 값 변경 가능? | 예시 |
|---|---|---|---|
| var | 변수 | 가능 | var name = "Alice" |
| let | 상수 | 불가능 | let birthYear = 2000 |
Swift에서는
기본적으로 let을 써서 변경 안 되는 값을 안전하게 만들고, 진짜 바꿔야 할 값만 var로 쓰는 게 좋음
💡 실전 예제
var score = 100
score = 120 // 값 바뀜 OK
let version = "1.0.0"
// version = "1.0.1" // 오류 (let은 못 바꿈)
앱에선 숫자, 글자, true/false 같은 다양한 값을 다룸
그래서 컴퓨터가 이게 무슨 종류의 데이터인지 알아야 함
ex)
나이 → 정수 Int
가격 → 실수 Double
로그인 여부 → 논리값 Bool
이름 → 문자열 String
| 타입 | 설명 | 예시 |
|---|---|---|
| Int | 정수 | let age: Int = 25 |
| Double | 소수 포함 숫자 | let price: Double = 9.99 |
| Float | 덜 정밀한 실수 | let weight: Float = 55.5 |
| String | 글자 | let name: String = "Jane" |
실전 예제 코드
let age: Int = 25
let price: Double = 9.99
let isMember: Bool = true
let greeting: String = "Hello, Swift!"
var: 바뀌는 값 저장할 때
let: 절대 안 바뀌는 값
데이터 타입은 컴퓨터가 정확하게 값을 다루기 위한 힌트
데이터의 형태(타입)를 바꾸는 것
Swift는 자동으로 형 변환을 안 해주기 때문에 개발자가 직접 바꿔야함
앱을 만들다 보면, 숫자 ↔ 문자열처럼 서로 다른 타입끼리 변환해야 할 일이 많음
ex)
"42" (문자열)을 숫자 42로 바꿔서 계산해야 할 때
Double 타입(예: 9.99)을 Int로 바꿔서 소수점 없이 사용하고 싶을 때
정수를 실수로 바꾸기 (Int → Double)
let integerNumber = 10
let doubleNumber = Double(integerNumber) // 결과: 10.0
문자열을 정수로 바꾸기 (String → Int)
let strNumber = "123"
if let number = Int(strNumber) {
print("변환된 숫자: \(number)") // 결과: 123
} else {
print("변환 실패!") // 변환이 안 되면 여기로 옴
}
여러 개의 값을 하나로 묶는 자료형
이름이 달라도 상관없이, 하나의 변수처럼 관리 가능
두 개 이상의 데이터를 한 번에 묶어서 다루고 싶을 때 사용함
ex)
이름과 나이를 함께 저장하고 싶을 때
지도에서 좌표 (x, y)를 하나로 표현하고 싶을 때
let position = (3, 4)
print(position) // (3, 4)
print(position.0) // 3
print(position.1) // 4
같은 종류의 데이터를 여러 개 한꺼번에 저장하는 자료형
데이터를 순서대로 저장하고, 번호(인덱스)로 꺼낼 수 있음
시험 점수
장바구니에 담긴 상품 가격들
하루 동안의 기온 기록
예제 코드
// 배열 만들기
var numbers: [Int] = [1, 2, 3, 4, 5]
// 값 추가
numbers.append(6) // [1, 2, 3, 4, 5, 6]
// 첫 번째 값 출력
print(numbers[0]) // 1
// 값 삭제
numbers.remove(at: 2) // [1, 2, 4, 5, 6]
// 정렬하기
let sortedNumbers = numbers.sorted()
print(sortedNumbers) // [1, 2, 4, 5, 6]
씁.. 처음에 튜플이랑 배열의 차이점을 확 실감하지 못했는데
튜플은 여러 타입의 데이터를 한 번에 받을 수 있다면
배열은 하나의 타입의 데이터를 쭉 받을 수 있음
한 마디로 튜플은 관련 있는 데이터를 모으는 느낌이라면
배열은 동일한 값들을 나열할 때 사용함
키(Key)와 값(Value)을 한 쌍으로 저장하는 자료형
이름표처럼 키를 사용해 값을 빠르게 찾을 수 있음
예시 상황
학번 → 이름
상품 ID → 상품 이름
사용자 ID → 로그인 정보
예제 코드
// 딕셔너리 만들기
var student: [Int: String] = [101: "John", 102: "Alice"]
// 값 꺼내기
print(student[101]) // John
// 값 추가
student[103] = "Bob"
// 값 수정
student[102] = "Charlie"
// 값 삭제
student.removeValue(forKey: 101)
print(student) // [102: "Charlie", 103: "Bob"]
중복 없이 저장되는 데이터 모음
순서가 없고, 같은 값은 한 번만 들어갈 수 있음
예시 상황
중복 없이 학생 ID 저장
한 사용자가 좋아요 누른 상품 목록
이미 사용된 쿠폰 코드 목록
예제 코드
// 셋 만들기
var fruits: Set<String> = ["Apple", "Banana", "Cherry"]
// 값 추가
fruits.insert("Orange")
// 값 제거
fruits.remove("Banana")
// 포함 여부 확인
if fruits.contains("Apple") {
print("Apple이 셋에 포함되어 있어요.")
}
// 셋 출력
print(fruits) // ["Apple", "Orange", "Cherry"]
| 자료형 | 특징 | 예시 |
|---|---|---|
| 배열 (Array) | 순서 있고, 중복 허용 | [1, 2, 3] |
| 딕셔너리 (Dictionary) | 키-값 쌍으로 저장 | [101: "Alice"] |
| 셋 (Set) | 순서 없고, 중복 없음 | {"Apple", "Banana"} |
어떤 조건이 맞을 때만 코드를 실행하도록 해주는 문법
상황에 따라 다른 동작을 하게 만들 수 있음
상황 예시
90점 이상 A, 80점 이상 B 등
VIP는 20% 할인, 일반회원은 5% 할인
let age = 20
if age >= 18 {
print("성인입니다.")
}
let temperature = 15
if temperature >= 20 {
print("날씨가 따뜻합니다.")
} else {
print("날씨가 쌀쌀합니다.") // 조건이 거짓이면 else 안의 코드가 실행됨
}
let score = 85
if score >= 90 {
print("A 학점")
} else if score >= 80 {
print("B 학점")
} else if score >= 70 {
print("C 학점")
} else {
print("F 학점")
} // 여러 조건 중 가장 먼저 맞는 조건 하나만 실행
let grade = "B"
switch grade {
case "A":
print("훌륭한 성적입니다!")
case "B":
print("좋은 성적입니다!")
case "C":
print("보통 성적입니다.")
default:
print("더 노력해야 합니다.")
}
let number = 7
switch number {
case 1...5:
print("1에서 5 사이입니다.")
case 6...10:
print("6에서 10 사이입니다.")
default:
print("그 외의 숫자입니다.")
}
같은 동작을 여러 번 반복할 때 사용하는 문법
상황 예시
여러 학생 점수 출력 배열에 있는 모든 점수를 차례대로 보여줌
조건이 맞을 때까지 반복 사용자가 정답을 입력할 때까지 계속 물어보기
계산 반복 1부터 100까지 더하기
for i in 1...5 {
print("\(i)번째 반복입니다.")
}
let fruits = ["사과", "바나나", "포도"]
for fruit in fruits {
print(fruit)
} // 배열에 있는 항목들을 차례대로 꺼내서 출력
var count = 3
while count > 0 {
print("남은 시간: \(count)")
count -= 1
} // 조건이 참일 동안 반복
var count = 3
repeat {
print("현재 count: \(count)")
count -= 1
} while count > 0 // 무조건 한 번은 실행한 다음 조건 검사
반복을 중간에 멈춤
for i in 1...10 {
if i == 5 {
break
}
print(i)
} // 출력: 1, 2, 3, 4
이번 반복만 건너뛰고 다음 반복으로 넘어감
for i in 1...5 {
if i == 3 {
continue
}
print(i)
} // 출력: 1, 2, 4, 5
코드를 재사용 가능하게 묶어놓은 단위
func 함수이름(매개변수: 타입) -> 반환타입 {
// 실행 코드
return 값
}
ex)
func add(a: Int, b: Int) -> Int {
return a + b
}
기타 형식
반환값이 없는 경우: -> Void 또는 생략 가능
외부 매개변수 생략: _ 사용
기본 매개변수 지정 가능: func greet(name: String = "Guest")
값이 있을 수도 있고 없을 수도 있는 변수
var name: String? // 기본값: nil
if let unwrapped = name { ... }
guard let unwrapped = name else { return }
속성과 동작(메서드)을 가진 참조 타입 객체
class 클래스이름 {
var 속성: 타입
init(속성: 타입) {
self.속성 = 속성
}
func 메서드() {
// 실행 코드
}
}
ex)
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func greet() {
print("안녕하세요, 저는 \(name)입니다.")
}
}
let person1 = Person(name: "가현", age: 20)
person1.greet()
Swift에서 값 타입으로 동작하는 사용자 정의 데이터 타입
속성과 메서드를 가질 수 있음
사용 예시
좌표 데이터 관리 – 예: x, y 좌표
네트워크 응답 데이터 저장 – JSON 응답을 임시로 담을 때
설정값 저장 – 사용자의 고정 설정값 저장
기본 문법
struct 구조체이름 {
var 속성: 타입
func 메서드이름() {
// 실행할 코드
}
}
ex)
struct Rectangle {
var width: Double
var height: Double
func area() -> Double {
return width * height
}
}
let rect = Rectangle(width: 5.0, height: 10.0)
print("면적은 \(rect.area())입니다.")
값 타입 (복사 동작)
var rect1 = Rectangle(width: 5.0, height: 10.0)
var rect2 = rect1
rect2.width = 20.0
print(rect1.width) // 5.0
print(rect2.width) // 20.0
//rect1과 rect2는 서로 다른 복사본
문법들을 정리하며 Swift 문법을 한 번 더 상기 시킬 수 있었음 !
직접 써보면서 문법을 눈에 익히는 시간이 필요할 듯