구조체와 클래스
구조체는 struct 키워드로 정의한다. 구조체를 정의한다는 것은 새로운 타입을 생성해주는 것과 마찬가지로 첫 글자를 대문자로 사용한다.
struct Basic{ //B는 대문자로
var mutableproperty: Int = 100 //mutableproperty은 가변 프로퍼티
let immutableproperty: Int = 100 // immutableproperty는 불변 프로퍼티
}
var mutable: Basic = Basic() //Basic이라는 하나의 타입이 됨(구조체로 인하여)
//let으로 선언하면 인스턴스 변경 불가능
//mutable이라는 새로운 가변 인스턴스를 생성함
mutable.mutableproperty = 200
mutable.immutableproperty = 200 //불가능 프로퍼티
Basic.(static으로 정의한 것)
인스턴스라는 말이 그 구역 안에서만 사용할 수 있다는 뜻인듯?
class라는 키워드를 사용하여 정의한다.
구조체와 매우 유사하지만 구조체는 값타입인 반면에 클래스는 참조타입이다.
클래스를 생성하고 인스턴스를 생성한 뒤 인스턴스에서클래스 안에 구조체의 프로퍼티 값에 접근하고 싶다면 . 을 사용하면 된다. (구조체도 마찬가지)
class person {
var height: Float = 0.0
var weight: Float = 0.0
var KIM: person = person() //인스턴스를 생성함
KIM.height = 175.5
KIM.weight = 67.0 //. 를 통해 프로퍼티에 접근함
static func ~~ //재정의 가능
vs
class func ~~ //재정의 불가
struct Basic{
var mutableproperty: Int = 100
*var immutableproperty: Int = 100 //구조체 안에서 var라면 인스턴스에서 변경 가능
}
var mutable: Basic = Basic() //Basic이라는 하나의 타입이 됨(구조체로 인하여)
//let으로 선언해도 인스턴스 변경 가능
//mutable이라는 새로운 가변 인스턴스를 생성함
mutable.mutableproperty = 200
mutable.immutableproperty = 200 //변경 가능
*let으로 설정됐다면 변경 불가
구조도 비슷하고 프로퍼티를 정의할 수 있는점에서 같은 점이 굉장히 많다. 그러나 큰 차이점들이 존재한다.
-> 클래스가 참조될 필요가 없을때 소멸하는데, 그때 클래스 내부에 deinit 메서드를 구현함으로써 소멸하기 전 메서드를 호출하는것
-> 둘을 구분 짓는 가장 큰 차이점은 값과 참조 타입이라는 점인데, 그렇기 떄문에 당연하게도 참조 횟수 계산은 클래스에서만 가능하다.
결론적으로 구조체는 구조체 내부에서 값을 지정한 후, 외부에서 구조체내부의 같은 프로퍼티를 이용해 생성됐더라도 두 개의 인스턴스가 서로 값에 영향을 주지 못한다.
그러나 클래스는 클래스 내부 프로퍼티를 '참조' 하는것이기 때문에 외부 인스턴스에서 값이 서로 영향을 준다.