티스토리 뷰

Swift에는 4가지 기본 인터페이스가 있다. 가장 추상적인 인터페이스인 protocol부터 OOP에서 가장 많이 사용하는 class, 그리고 struct, enum 등이 있다. C++에서 struct와 enum은 기본 자료형을 묶어서 구조체로 만들거나 숫자 리터럴을 키워드로 변경하기 위한 용도 등으로 사용했지만 Swift는 좀 더 많은 기능을 가지고 있다. 예를 들어 struct와 enum 모두 class처럼 함수를 가질 수 있다.

이로써 struct와 class의 경계가 모호해졌다고 볼 수 있지만 여전히 두 인터페이스는 다른 사용성을 가지고 있다.

 

 

 

차이점

value type vs reference type

struct는 value type이고 class는 reference type이다.

때문에 struct는 함수의 파라미터로 전달될 때 값이 통째로 복사되어 전달되고, class는 메모리 주소가 복사되어 함수 내에서도 동일한 메모리에 접근할 수 있다. 즉, struct를 전달받은 함수에서 아무리 값을 바꿔도 외부에 있는 struct 인스턴스는 전혀 영향을 받지 않지만 class를 전달받은 함수에서 class의 내용을 변경하면, 외부에서도 그 변경이 적용된다.

상속 받을 수 있는 인터페이스의 제한

struct는 protocol만 상속 받을 수 있고, class는 protocol 또는 다른 class를 상속 받을 수 있다.

이유는 type의 차이를 생각해 보면 유추할 수 있는데, value type은 함수와 변수의 선언만 할 수 있는 protocol만 상속 받아서 언제나 같은 크기의 데이터를 정의할 수 있고, reference type은 protocol 뿐 아니라 다른 class를 상속 받아서 데이터의 크기가 커져도 변경된 크기에 따라 동적으로 메모리를 할당할 수 있다.

 

 

 

궁금한 점

struct가 class의 인스턴스를 가지고 있으면 어떻게 될까

struct는 class를 상속받을 수는 없지만 class의 인스턴스를 멤버로 가지고 있을 수 있다. class 인스턴스를 가지고 있는 struct를 복사하면 어떻게 될까?

 

class Cls {
	var index: Int = 0

	// 1
	init() {
		print("init")
	}

	deinit {
		print("deinit")
	}

	func increase() {
		index += 1
	}
}

struct Stt {
	var number: Int
	// 2
	let cls: Cls

	func show() {
		print("\(number) \(cls.index)")
	}
}

// 3
var s1 = Stt(number: 5, cls: Cls())  // init
s1.show()  // 5 0
s1.cls.increase()
s1.show()  // 5 1
  1. class Cls의 생성자와 소멸자가 실행될 때 알 수 있도록 print()를 추가한다.
  2. struct Stt가 class Cls의 인스턴스를 가지고 있다.
  3. struct Stt의 인스턴스를 생성하고 Cls.index를 증가시켰다.

여기에서 s1을 복사하면 어떻게 될까?

 

// 1
var s2 = s1  // copy
s2.show()  // 5 1

// 2
s2.cls.increase()
s1.show()  // 5 2
  1. s2에 s1 struct를 복사한 후 출력해보면 그대로 5 1이 출력된다.
  2. s2.cls.index를 증가시키고 s1을 출력해도 변화가 적용된 것을 볼 수 있다.

그렇다면 이 경우 Cls의 메모리는 언제 해제될까? 메모리 해제 시점을 알아보기 위해 미리 deinit()에 print()를 추가해 두었다.

 

// 1
var s1 = Stt(cls: Cls())
var s2 = Stt(cls: Cls())  // deinit
  1. s1, s2 모두 새로운 Stt를 대입하면 s2에 대입했을 때 deinit이 출력된다. 즉, s1의 값이 s2로 복사되면서 cls에 대한 ARC가 증가했다는 뜻이다.

'Programming > Swift' 카테고리의 다른 글

Swift Expert | Codable  (0) 2020.12.02
Swift Beginner | 인터페이스  (0) 2020.11.18
Swift Beginner | 타입캐스팅 is as  (0) 2020.11.18
Swift Beginner | 함수의 시작과 끝 guard defer  (0) 2020.11.18
Swift Beginner | Closure  (0) 2020.11.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함