[Swift] 구조체와 클래스
2022. 9. 16. 17:07
참조 : Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)
구조체(Struct)
- struct 키워드로 정의
- 구조체의 인스턴스는 값 타입
- 구조체를 정의하고 인스턴스를 생성하고 초기화하고자 할떄는 기본적으로 생성되는 멤버 와이즈 이니셜라이즈를 사용
- 구조체를 상수 let으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경 불가, 변수 var로 선언하면
내부의 프로퍼티가 var로 선언된 경우에 값을 변경 가능
- 사용자 정의 이니셜라이저도 구현이 가능
struct BasicInformation{
var name: String
var age: Int
}
var kimInfo: BasicInformation = BasicInformation(name: "kim", age: 15)
kimInfo.age = 100
kimInfo.age = "park"
print(kimInfo.age) // 100
print(kimInfo.name) // park
let leeInfo: BasicInformation = BasicInformation(name: "lee", age: 55)
print(leeInfo.name) // lee
print(leeInfo.age) // 55
클래스(Class)
- 스위프트의 클래스는 부모클래스가 없더라도 상속 없이 단독으로 정의가 가능
- class 키워드 사용
- 클래스의 인스턴스는 참조타입
- 클래스 이름 뒤에 콜론(:)을 써주고 부모클래스를 명시
- 클래스를 정의한 후, 인스턴스를 생성하고 초기화하고자 할 대는 기본적인 이니셜라이저를 사용
- 인스턴스가 생성되고 초기화된 후 (이니셜라이즈) 프로퍼티 값에 접근하고 싶다면 마침표(,)를 사용
class Person{
var height: Float = 0.0
var weight: Float = 0.0
}
var kim: Person = Person()
kim.height = 169.9
kim.weight = 75.3
print(kim.height, ", " , kim.weight) // 169.9, 75.3
클래스 인스턴스의 소멸
- 클래스의 인스턴스는 참조 타입이므로 더는 참조할 필요가 없을 때 메모리에서 해제됨
- 소멸 직전에 deinit 메서드 호출됨
- deinit 메서드는 디이니셜라이저라고 하며, 클래스당 하나만 구현할 수 있으며, 매개변수의 변환 값을 가질 수 없음
- deinit 메서드에서는 인스턴스가 메모리에서 해체되기 직전에 처리할 코드를 삽입
구조체 vs 클래스
구조체(Struct) | 클래스(Class) | |
공통점 | - 값을 저장하기 위해 프로퍼티를 정의 가능 - 기능 실행을 위해 메서드 정의 가능 - 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 서브스크립트를 정의 가능 - 초기화될 때의 상태를 지정하기 위해 이니셜라이저를 정의 가능 - 초기구현과 더불어 새로운 기능 추가를 위해 익스텐션을 통해 확장 가능 - 특정 기능을 실행하기 위해 특정 프로트콜을 준수 |
|
차이점 | - 값 타입(전달될 값이 복사되어 전달) - 상속 불가 |
- 참조 타입 (참조(주소)가 전달됨, 포인터와 유사) - 타입캐스팅 허용 - deinit 활용 가능 - 참조 횟수 계산(Refernce Counting) 가능 |
※ 스위프트의 기본 타입(Bool, Int, Array, Dictionary, Set 등)도 String 타입과 마찬가지로 모두 구조체로 구현되어 있음
728x90
'iOS > Swift' 카테고리의 다른 글
[Swift] print(_:separator:terminator:) (0) | 2022.09.21 |
---|---|
[Swift] 프로퍼티와 메서드 (0) | 2022.09.20 |
[Swift] 모나드 (0) | 2022.09.16 |
[Swift] 옵셔널(Optional) (0) | 2022.09.15 |
[Swift] 함수 (0) | 2022.09.14 |