구조체와 클래스는 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질수 있다
즉, 하나의 사용자 정의 데이터 타입을 만드는 것
구조체의 인스턴스는 값 타입이며, 클래스의 인서턴스는 참조 타입이다
소스피일 하나에 복수의 구조체나 클래스가 들어와도 아무 상관이없고 중첩 함수와 같이 중첩 구조체, 중첩 클래스 등의 중첩 타입의 정의 및 선언이 가능하다
//struct키워드를 이용하여 정의
struct Student {
//프로퍼티와 메서드
var age: Int
var name: String
}
var student_1: Student = Student(age: 10, name: "woon")
student_1.age = 20 //변경가능
student_1.name = "woonsik" //변경가능
print(student_1)
let student_2 : Student = Student(age: 20, name: "byeori")
//student_2.age = 23 //변경 불가능
//student_2.name = "byori" //변경 불가능
print(student_2)
//출력
Student(age: 20, name: "woonsik")
Student(age: 20, name: "byeori")
//class키워드를 사용하여 정의
class Person/*( : 상속받을 부모 클래스 이름 )*/{
//프로퍼티와 메서드
var height: Double = 0.0
var weight: Double = 0.0
func printInfo() {
print("height: \(height), weight: \(weight)")
}
}
class StudentC : Person {
var ID: Int = 0
var PhoneNumber: Int = 0
}
//참조 타입인 클래스의 인스턴스는 let으로 선언해도 내부 프로퍼티 값을 변경할 수 있다
let 학생: StudentC = StudentC()
let 행인: Person = Person()
학생.height = 177
학생.weight = 70
학생.printInfo()
행인.printInfo()
//출력
height: 177.0, weight: 70.0
height: 0.0, weight: 0.0
클래스의 인스턴스는 참조타입이므로 더이상 참조할 필요가 없을 때 메모리에서 해제된다
이 과정을 소멸이라 하고 소멸 되기 직전 deinit이라는 메서드가 호출된다
클래스 내부에 deinit메서드를 구현해주면 소멸되기 직전의 deinit메서드가 호출되고 이 deinit 메서드
는 디이니셜라이저라고 부른다
deinit메서드는 클래스당 하나만 구현할 수 있으며 매개변수와 반환값을 가질수 없다, 매개변수를 위한 소괄호도 올수 없다
deinit메서드를 구현하여 삭제되기전에 추가적인 처리를 진행 후 삭제하게 할 수 있다
class Info {
var age: Int = 26
var name: String = "woonsik"
func InfoPrint() {
print("나이: \(age)\n이름: \(name)")
}
deinit {
InfoPrint()
print("delete info")
}
}
let _: Info = Info()
//출력
나이: 26
이름: woonsik
delete info
구조체는 값 타입이므로 전달인자로 전달될 값이 복사되어 전달된다
클래스는 참조 타입이므로 전달인자로 값이 복사되지 않고 참조(주소)가 전달된다
스위프트의 기본 타입은 모두 구조체로 구현되어 있다
대다수의 사용자 정의 데이터 타입은 클래스로 구현할 일이 더 많다