struct 구조체 이름 {
프로퍼티와 메서드들
}
struct BasicInformation {
var name: String
var age: Int
}
struct BasicInformation {
var name: String
var age: Int
}
// String 타입인 name과 Int 타입인 age라는 저장 프로퍼티
// 프로퍼티 이름(name, age)으로 자동 생성된 이니셜라이저를 사용하여 구조체를 생성
var JinInfo: BasicInformation = BasicInformation(name: "Jin", age: 88)
JinInfo.age = 100 // 변경 가능
JinInfo.name = "Seba" // 변경 가능
// 프로퍼티 이름(name, age)으로 자동 생성된 이니셜라이저를 사용하여 구조체 생성
let SebaInfo: BasicInformation = BasicInformation(name: "Seba", age: 99)
SebaInfo.age = 100 // 변경 불가 / 상수
JennyInfo.name = "Seba" // 변경 불가 / Jenny 없음
class 클래스 이름 {
프로퍼티와 메서드들
}
class 클래스 이름: 부모클래스 이름 {
프로퍼티와 메서드들
}
class Person {
var height: Float = 0.0
var weight: Float = 0.0
}
// Float 타입인 height와 weight 저장 프로퍼티가 있는 Person 클래스
// Person 클래스에서는 프로퍼티의 기본값이 지정되어 있으므로 전달 인자를 통해 따로 초깃값을 전달 해주지 않아도 된다.
class Person {
var height: Float = 0.0
var weight: Float = 0.0
}
var Jin: Person = Person()
Jin.height = 123.4
Jin.weight = 123.4
let Jenny: Person = Person()
Jenny.height = 123.4
Jenny.weight = 123.4
class Person {
var height: Float = 0.0
var weight: Float = 0.0
deinit {
print("Person 클래스의 인스턴스가 소멸됩니다.")
}
}
var Jin: Person? = Person()
Jin = nil //Person 클래스의 인스턴스가 소멸됩니다.
같은 점
차이점
정리
구조체와 클래스의 차이(값 타입과 참조 타입의 차이)
// 예시 1
// 구조체로 만든 경우 (위 생략)
var iPhone1 = Phone(modelName: "iPhone 13", manufacturer: "Apple")
var iPhone2 = iPhone1
iPhone1.modelName = "iPhone 14"
print(iPhone2.modelName)
print(iPhone1.modelName)
// iPhone 13 / iPhone 14
// iPhone2는 iPhone1의 값을 '복사'했기에 이후 iPhone1의 값이 변경되어도 영향을 받지 않음.
// 클래스로 만든 경우 (위 생략)
var jrDeveloper1 = iOSDeveloper(name: "John", hours: 8)
var jrDeveloper2 = jrDeveloper1
jrDeveloper1.name = "Billy"
print(jrDeveloper1.name)
print(jrDeveloper2.name)
// Billy / Billy
// jrDeveloper2는 jrDeveloper1을 '참조'했기에 이후 jrDeveloper1의 값이 바뀌면 jrDeveloper2의 값도 바뀜
// 예시 2
struct BasicInformation {
let name: String
var age: Int
}
var JinInfo: BasicInformation = BasicInformation(name: "Jin", age: 99)
JinInfo.age = 100
var friendInfo: BasicInformation = JinInfo
// JinInfo의 값을 복사하여 할당함
print("Jin`s age: \(JinInfo.age)")
print("friend's age: \(friendInfo.age)")
friendInfo.age = 999
print("Jin's age: \(JinInfo.age)")
print("friend's age: \(friendInfo.age)")
// 999 - friendInfo는 JinInfo의 값을 복사해왔기 때문에 별개의 값을 가짐
class Person {
var height: Float = 0.0
var weight: Float = 0.0
}
var Jin: Person = Person()
var friend: Person = Jin
print("Jin's height: \(Jin.height)")
print("friend's height: \(friend.height)")
friend.height = 179
print("Jin's height: \(Jin.height)")
// 179 - friend는 Jin을 참조하기 때문 값이 변동됨
print("friend's height: \(friend.height)")
// 179 - 이를 통해 Jin이 참조하기 곳과 friend가 참조하는 곳 같음을 알 수 있음
func changeBasicInfo(_ info: BasicInformation) {
var copiedInfo: BasicInformation = info
copiedInfo.age = 1
}
func changePersonInfo(_ info: Person) {
info.height = 155.3
}
// changeBaicsInfo(_:)로 전달되는 전달인자는 값이 복사되어 전달됨
// Jin이 참조하는 값들에 변화
changePersonInfo(Jin)
print("Jin's height : \(Jin.height)") // 155.3