본문 바로가기

iOS/Swift - UIKit

[Swift 객체지향] 1 - 클래스와 구조체의 생성, 초기화, 소멸

✳️구조체와 클래스

✨ 개요

구조체와 클래스는 데이터를 용도에 맞게 묶어 표현하려고 할 때 유용하고, 모습과 문법이 서로 비슷하다.

그러나 구조체의 인스턴스는 값 타입이고, 클래스의 인스턴스는 참조 타입이다.

이러한 타입의 차이는 이후 구조체와 클래스의 활용에서 큰 차이를 만들어낸다.

✳️ 구조체

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의 특징

클래스당 하나만 구현

매개변수와 반환값을 가질 수 없다

📌 활용

소멸 전에 데이터를 옮기거나 다른 객체에 소멸 사실을 알려야 할 때 사용한다.