여러 프로퍼티와 메서드를 담아 이를 묶어 하나의 사용자 정의 데이터 타입으로 만든 것
구조체와 클래스는 비슷하면서도 차이가 있음.
클래스는 구조체에 여러가지 필요한 기능을 플러스 알파한 것.
구조체의 정의는 struct
키워드로
struct Student {
}
struct Student {
var name = "Min"
var age = "25"
}
let min = Student()
Student
구조체는 그냥 타입임. 쉽게 이야기하면 틀.
우리가 직접 사용하려면 틀을 이용해 찍어낸 인스턴스를 호출해야 함.
빈 괄호를 작성하면 기본값으로 초기화된다.
나머지 경우는 뒤의 memberwise 초기화 구문을 참고하면 된다.
struct Student {
var name = "Min"
let age = 25
}
var min = Student()
print(min) // Student(name: "Min", age: 25)
min.name = "Mini"
print(min) // Student(name: "Mini", age: 25)
인스턴스를 변수에 할당해 보자.
var
로 선언된 프로퍼티들은 변경이 가능하다.let
으로 선언된 멤버 프로퍼티들은 변경할 수 없다.min.age = 30 // 🚨 Cannot assign to property: 'age' is a 'let' constant
min
은 상수로 선언되었으니 수정 불가하다.let min = Student()
min.name = "Mini" // Cannot assign to property: 'min' is a 'let' constant
struct Student {
var name = "Min"
var age = "25"
}
let min = Student()
print(min.name) // Min
dot syntax(점 찍기)로 인스턴스의 프로퍼티에 접근 가능
struct Student {
var name = "Min"
var age = "25"
}
var min = Student()
print(min.name) // Min
min.name = "Min2"
print(min.name) // Min2
min
을 var
로 선언해주면 프로퍼티에 새로운 값 할당 가능
init(name: String, age: String) {
self.name = name
self.age = age
}
struct Student {
var name: String
var age: Int
}
//let min = Student() // error
let min = Student(name: "Min", age: 25) // good 👍🏻
struct Student {
var name = "Min"
var age: Int
}
//let min = Student() // error
//let min = Student(name: "Mini") // error
let min = Student(age: 27) // 👍🏻 Student(name: "Min", age: 27)
let mini = Student(name: "mini", age: 26) // 👍🏻 Stuent(name: "mini", age: 26)
value type: 변수 또는 상수에 할당될 때나 함수에 전달될 때 복사되는 것
배열, 딕셔너리, 문자열 같은 Swift의 collection은 최적화를 하여 복사 성능 비용을 줄임
즉시 복사본을 만드는 대신, 원본 인스턴스 - 복사본 간 요소가 저장된 메모리 공유
복사본 중 하나가 수정되면, 요소는 수정되기 직전 복사됨
→ 우리 눈에는 항상 바로 복사가 일어나는 것처럼 보임
let people = ["Kim", "Lee", "Park", "Choi"] var newPeople = people // 이때는 저장된 메모리를 공유 // 수정되기 직전 복사되는 것 newPeople[1] = "Nam" print(newPeople) // ["Kim", "Nam", "Park", "Choi"]
쉽게 이해할 수 있도록 예시를 들어보자면 요런 느낌?!
swift 공식 document에서 인용해 왔는데 요론식으로 최적화를 하는구나 하고 넘 신기했음
struct Student {
var name: String
var age: Int
}
let min = Student(name: "Min", age: 25)
var anotherMin = min
anotherMin.age = 6
print("anotherMin의 나이:", anotherMin.age) // anotherMin의 나이: 6
print("min의 나이:", min.age) // min의 나이: 25a
anotherMin
은 기존 min
의 복사본이 할당min
, anotherMin
은 아예 다른 인스턴스, 서로 영향을 주지 않음 → value typehttps://bbiguduk.gitbook.io/swift/language-guide-1/structures-and-classes