클래스와 구조체

프로그래머가 데이터를 용도에 맞게 표현하고자 할 때 용이하다. 프로퍼티와 메서드를 사용해서 구조화된 데이터와 기능을 가질 수 있어 하나의 새로운 사용자 정의 데이터타입을 만들어 준다. 사용법은 거의 같다. 하지만 다른 점이 있다. 구조체의 인스턴스는 값타입이고 클래스의 인스턴스는 참조타입이다.

구조체 정의 struct 구조체 이름 { 프로퍼티와 메서드 }

구조체

예시

struct User {
    var nickname: String
    var age: Int
}
var user = User(nickname: "Woo", age: 25)
user.nickname
user.age

프로퍼티 값 변경

user.nickname = "albert"
user.nickname

함수 사용

struct User {
    var nickname: String
    var age: Int
    
    func information() {
        print("\(nickname) \(age)")
    }
}
user.information()

클래스

클래스 정의 class 클래스 이름 { 프로퍼티와 메서드 }

예시

class Dog {
    var name: String = ""
    var age: Int = 0

    init() { 
		// 인스턴스가 생성되면 호출
		// 클래스에서는 생성자를 정의해야한다. 인스턴스를 생성하고 초기화하고자 할 때 기본적인 생성자를 사용한다.
    }

    func introduce() {
        print("name \(name) age \(age)")
    }
}
var dog = Dog()
dog.name = "CoCo"
dog.age = 3
dog.name // CoCo
dog.age // 3
dog.introduce() // name CoCo age 3

초기화(Initialization)란?

클래스 구조체 또는 열거형의 인스턴스를 사용하기 위한 준비 과정

init(매개변수: 타입, ...) {
    // 프로퍼티 초기화
    // 인스턴스 생성시 필요한 설정을 해주는 코드 작성
}

예시

class User {
    var nickname: String
    var age: Int
    
    init(nickname: String, age: Int) {
        self.nickname = nickname
        self.age = age
    }
    
    init(age: Int) {
        self.nickname = "albert"
        self.age = age
    }
}
var user = User(nickname: "Woo", age: 25)
user.nickname // Woo
user.age // 25
var user2 = User(age: 25)
user2.nickname // albert
user2.age // 25

초기화 해제(Deinitialization)

이니셜라이저와 반대 역할을 한다. 인스턴스가 메모리에서 해제되기 직전에 호출된다. 클래스 인스턴스와 관련하여 원하는 정리 작업을 구현할 수 있다. 클래스 인스턴스에만 구현할 수 있다. 예시

deinit {
    print("deinit user")
}
var user3: User? = User(age: 23)
user3 = nil // deinit user 출력

인스턴스에 nil이 들어가면 deinit가 호출된다.