Search

Class & Struct ( 이창준 )

Class

클래스의 인스턴스 타입 → 참조 타입
Reference

Struct

구조체의 인스턴스 타입 → 값 타입
Value
인스턴스(instance)란 객체 지향 프로그래밍(OOP)에서 클래스(class)에 소속된 개별적인 객체

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 를 증감시키는 역할을 하는 retainrelease 를 삽입해서 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
복사

참고