코딩하는 제리

[Swift] swift 구조체/클래스 본문

iOS/SwiftUI

[Swift] swift 구조체/클래스

JerryCho 2022. 1. 3. 14:00

// 구조체와 클래스의 차이
// - 타입캐스팅은 클래스의 인스턴스에만 허용
// - 구조체는 상속할 수 없음
// - deinit 메서드는 클래스의 인스턴스에서만 사용가능
// - 참조 횟수 계산은 클래스의 인스턴스에만 적용

// 구조체
// 구조체를 상수로 선언하면 프로퍼티 값을 변경할 수 없다.
// 변수로 선언하면 내부 프로퍼티가 변수로 선언된 경우에만 값 변경 가능
struct Food {
	var name: String
	var price: Int
}

var favoriteFood: Food = Food(name: "sushi", price: 10000)
favoriteFood.name = "pizza"
favoriteFood.price = 20000

// 클래스
// 클래스 인스턴스는 참조 타입이므로 인스턴스를 상수로 선언해도 내부 프로퍼티 값을 변경할 수 있다.
// 더 참조할 필요가 없을 때 메모리에서 삭제된다.
// 인스턴스가 소멸되기 직전에 deinit 메서드가 호출된다.
// deinit은 클래스당 하나만 구현가능. 매개변수와 반환 값을 가질 수 없다.
// deinit 메서드 안에는 인스턴스가 메모리에서 해제되기 직전에 실행할 코드를 넣는다.
class Book {
	var title: String = ""
	var author: String = ""
    
	deinit {
		print("인스턴스 소멸")
	}
}

let myBook: Book = Book()
myBook.title = "tom and jerry"
myBook.author = "tom"

// 구조체와 클래스 중 어떤 것을 선택해야할까?
// 애플은 가이드라인에서 다음 조건 중 하나 이상에 해당한다면 구조체를 사용할 것을 권장하고 있다.

// - 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
// - 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
// - 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
// - 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때

 

- 구조체는 value 타입이라 메서드 안에서 프로퍼티 값 변경이 불가능.

- 하지만 mutating 키워드를 사용하면 프로퍼티 값 변경 가능.

struct IntStack {
	var items = [Int]() // 배열 선언

	mutating func push(_ item: Int) {
		items.appned(item) // 배열에 아이템 추가
	}

	mutating func pop() -> Int {
		return items.removeLast() // 배열의 마지막 아이템 삭제
	}
}

 

 

'iOS > SwiftUI' 카테고리의 다른 글

[Swift] swift 클로저  (0) 2022.01.03
[Swift]열거형(enum)/rawValue  (0) 2022.01.03
[Swift] swift 조건문/반복문  (0) 2022.01.03
[Swift] swift 함수  (0) 2022.01.03
[Swift] swift 자료형  (0) 2022.01.03
Comments