이번 포스팅은 구조체와 클래스에 대해 작성하고자 한다.
사실 우리가 변수 하나만 가지고 원하는 것을 만드지 못한다. 따라서 여러 가지 변수를 통해 모델을 만드는데, 이 모델을 class와 struct로 생성할 수 있는 것이다.
struct Student { //구조체 선언
var name: String = "unknown" //가변 프로퍼티
var `class`: String = "Swift" //백틱 : class라는 변수명을 쓰고 싶어서 사용, 가변 프로퍼티
static func selfIntroduce() { //타입 메서드
print("학생타입입니다")
}
func selfIntroduce() { //인스턴스 메서드
print("저는 \(self.class)반 \(name)입니다")
}
}
Student.selfIntroduce() //학생타입입니다. (구조체 타입 자체(Student)를 가져왔기 때문에 타입메서드를 사용 가능
var yagom: Student = Student() //인스턴스 선언 (가변 인스턴스)
yagom.name = "yagom"
yagom.class = "스위프트"
yagom.selfInroduce() //저는 스위프트반 yagom입니다. (가변 인스턴스이기 때문에 인스턴스 메서드가 사용됨)
let jenny: Person = Person()
jenny.height = 123.4 //가능
jenny.weight = 123.4 //가능
구조체 : 값타입
클래스 : 참조타입
구조체 : 전달될 값이 복사되어 전달됨 (새로운 것이 계속 생성되는 느낌)
클래스 : 전달될 값이 복사되는 것이 아니라 기존 인스턴스의 참조(주소)가 전달됨 (그렇다고 모든 인스턴스들이 같은 값을 가진다는 뜻은 아님. 그냥 주소에서 클래스만 가져오는 느낌,,?)
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
var A = Person(name: "aa", age: 12)
var B = Person(name: "bb", age: 13)
print(A.name) //aa
print(B.name) //bb
print(A.name) //aa
//기존 인스턴스의 참조를 전달한다고 해서 변수에 들어가는 값이 같아진다는 뜻은 아님!
[출처] 스위프트 프로그래밍 (야곰), 야곰의 스위프트 기초문법 강좌, 개발하는 정대리 스위프트 강좌