Class
•
클래스의 인스턴스 타입 → 참조 타입
•
Reference
Struct
•
구조체의 인스턴스 타입 → 값 타입
•
Value
Reference & Value
Reference
•
Class, Function, Actor
•
Heap 영역에 저장
•
Value 보다 느림
•
Thread 가 안전하지 않음 ( Actor 는 제외 )
•
할당 및 전달 시,
원본 인스턴스에 대한 새 참조가 생성
•
동기화 보장
Value
•
Struct, Enum, String, Int …
•
Stack 에 저장
•
Reference 보다 빠름
•
Thread 가 안전
•
할당 및 전달 시, 새로운 데이터 복사본이 생성
Heap
•
Reference Type 참조
•
Thread 끼리 공유되는 영역
Stack
•
Value Type 저장
•
메모리에 직접 저장 ( 접근 빠름 )
•
각각의 Thread 에 Stack 이 있음
Thread
하나의 프로세서 ( 실행 중인 프로그램 ) 에서 각 독립적인 일의 단위
Actor
•
Class, Struct, Enum 과 같은 Object Type
•
class 와 다르게 상속은 지원하지 않고, 암시적으로 Sendable
•
[ 동기, 비동기 & 직렬, 병렬 ] 을 알고 보자 - !
Sendable
값을 동시성 도메인에 안전하게 전달할 수 있는 타입
Class & Struct
프로그램의 코드를 조직화 하기 위해 일반적으로 사용
OOP 를 위한 필요 요소
Apple 에서는 Class 의 특징을 사용하기 위함이 아닌 이상, Struct 사용을 권장
공통점
•
변수나 상수를 사용하여 값을 저장하는 프로퍼티 선언 가능
•
서브스크립트 ( subscript ) 를 정의하여 내부 프로퍼티 접근 가능
•
메서드 선언 가능
•
init 을 통해 초기 상태 설정 가능
•
확장 ( extends ) 구문 사용 가능
•
Protocol 을 사용하여 기능 설정 가능
차이점
Class
•
Reference - 참조
•
상속 ( Ingeritance ) 가능
•
인스턴스 소멸 시, deinit 호출 가능
•
같은 클래스 인스턴스 생성 후,
값 변경 시, 모든 변수에 영향
•
참조, deinit ?
→ 참조 카운트 ( Reference Count ) 가 존재
→ ARC 를 사용하여 메모리 관리
Struct
•
Value - 값
•
상속 X
•
deinit X
•
여러 인스턴스를 생성 후,
값 변경 시, 각 인스턴스의 값에 영향 X
•
생성자 ( init ) 를 구현하지 않아도
default initalizer 사용 가능
•
Swift 표준 라이브러리의 기본 타입 모두 구조체
ARC - Auto Reference Counting
•
자동으로 메모리를 관리해주는 역할
•
객체에 대한 Reference Count - 참조 카운트 를 관리
0이 되면 ( deinit ) 자동으로 메모리 해제
•
run time 에 계속 실행되지는 않고, compile time ( build 시 ) 실행
→ compile time 에 적절한 위치에서,
Reference Count 를 증감시키는 역할을 하는 retain 과 release 를 삽입해서 run
예시 - 공식 문서
Class
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
Swift
복사
let someVideoMode = VideoMode()
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is 0"
someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is now 1280"
Swift
복사
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// Prints "The frameRate property of tenEighty is now 30.0"
Swift
복사
Struct
struct Resolution {
var width = 0
var height = 0
}
Swift
복사
// init 생성자 없이, initializer 사용 가능
// 아래 예시는 Memberwise Initializer
let someResolution = Resolution(width: 640, height: 480)
print("The width of someResolution is \(someResolution.width)")
// Prints "The width of someResolution is 640"
Swift
복사
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
print("cinema is now \(cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"
print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"
Swift
복사