✳️구조체와 클래스
✨ 개요
구조체와 클래스는 데이터를 용도에 맞게 묶어 표현하려고 할 때 유용하고, 모습과 문법이 서로 비슷하다.
그러나 구조체의 인스턴스는 값 타입이고, 클래스의 인스턴스는 참조 타입이다.
이러한 타입의 차이는 이후 구조체와 클래스의 활용에서 큰 차이를 만들어낸다.
✳️ 구조체
1️⃣ 구조체의 정의
struct 구조체이름 {
프로퍼티와 메서드
}
2️⃣ 구조체 인스턴스의 생성 및 초기화
struct Member {
var name: String
var age: Int
}
// 초기화 이후 프로퍼티에 접근하여 수정 가능
var firstMember: Member = Member(name: "Duno", age: 25)
firstMember.name = "Ted"
firstMember.age = 12
// 아래는 let으로 선언하였기에 오류가 발생한다.
let firstMember: Member = Member(name: "Duno", age: 25)
firstMember.name = "Ted"
firstMember.age = 12
📌 구조체 정의 후에 이니셜라이저를 사용하여 구조체 생성 및 프로퍼티 초기화를 할 수 있다.
매개변수는 구조체의 내부의 프로퍼티 이름으로 자동 지정된다.
📌 .을 이용하여 프로퍼티의 값에 접근할 수 있다.
구조체룰 let으로 선언하면 수정 불가능 / var로 선언하면 수정 가능하다.
✳️클래스
1️⃣ 클래스의 정의
스위프트의 클래스는 부모클래스 상속 없이 단독으로 정의 가능하다.
class 클래스이름: 부모클래스이름 {
프로퍼티와 메서드
}
class Food {
var price: Int = 0
var weight: Float = 0.0
}
Food 클래스 안에 Int와 Float형 저장 프로퍼티가 있는 모습이다.
2️⃣ 클래스 인스턴스의 생성과 초기화
var kimchi: Food = Food()
kimchi.price = 2500
kimchi.weight = 500
// 구조체와 다르게 let으로 선언해도 프로퍼티 값 수정 가능
let kimchi: Food = Food()
kimchi.price = 2500
kimchi.weight = 500
클래스의 인스턴스는 참조 타입이므로 구조체와 달리 let으로 선언해도 프로퍼티의 값을 변경할 수 있다.
3️⃣ 클래스 인스턴스의 소멸(deinitializer)
클래스의 인스턴스는 참조 타입이므로 참조할 필요가 없을 때 메모리에서 해제된다.
이를 인스턴스의 소멸이라고 하는데, 클래스 내부에 deinit 메서드를 구현해주면 소멸 직전에 deinit(디이니셜라이저) 메서드가 호출된다.
⭐ 클래스에 nil값을 대입하여 인스턴스를 소멸시킬 수 있다. 이러한 경우 인스턴스를 옵셔널 형식으로 선언해야 한다.
class Food {
var price: Int = 0
var weight: Float = 0.0
deinit {
print("Food 클래스의 인스턴스가 소멸됩니다.")
}
}
var kimchi: Food? = Food()
kimchi = nil
📌 deinit의 특징
클래스당 하나만 구현
매개변수와 반환값을 가질 수 없다
📌 활용
소멸 전에 데이터를 옮기거나 다른 객체에 소멸 사실을 알려야 할 때 사용한다.
'iOS > Swift - UIKit' 카테고리의 다른 글
[Swift] Notification Center 개념 (0) | 2022.05.21 |
---|---|
[UIKit] CompositionalLayout으로 당근마켓 게시글 상세보기 뷰 구현하기 (7) | 2022.05.19 |
[Swift] URLSession(1) - 개념 모아보기(URLSession, URLSessionConfiguration, URLSessionTask) (0) | 2022.03.29 |
[Swift 문법] Error Handing(오류처리), try-throw와 do-catch, rethrow, defer (2) | 2022.03.27 |
[Swift 객체지향] 2 - 구조체와 클래스의 차이점 (0) | 2022.02.10 |