스위프트에는 다른 언어처럼 구조체와 클래스가 있다.
이 둘은 공통적인 목적을 갖고 만들어졌다.
프로그램 소스코드의 추상화를 위해 사용하며
다른 언어와는 다르게 인터페이스와 파일이 필요 없다.
참고로 스위프트의 기본 데이터 타입은 모두 구조체로 이루어져 있다.
공통점
• 프로퍼티를 정의할 수 있다.
• 메서드를 정의할 수 있다.
• 서브스크립트를 사용해(SomeClass.num같이) 프로퍼티에 접근할 수 있다.
• 객체를 초기상태로 설정해 주는 초기화 블록 정의 가능
• 객체에 함수적 기능 추가를 위한 확장(extends) 구문을 쓸 수 있다.
• 특정 형식의 함수적 표준을 제공하기 위한 프로토콜 구현할 수 있다.
차이점
구조체
• 구조체는 값타입.
• 값타입이기 때문에 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체가 할당된다.
클래스
• ARC로 메모리를 관리
• 상속 가능하다.
• 클래스는 참조타입
• 같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 한 변수에서만이라도 값을 변경하면 할당한 모든 변수가 영향을 받는다.
• 타입 캐스팅으로 런타임때 클래스의 인스턴스 타입을 확인할 수 있다.
• 클래스의 인스턴스만 deinit을 호출할 수 있다.(인스턴스에 nil을 할당하면 메모리에서 해제되며 자동으로 실행된다.)
• 참조 횟수 계산은 클래스의 인스턴스에만 적용된다.
선언
둘 다 선언방법은 똑같다.
//구조체
Struct SampleStruct {
//body
}
//클래스
Class SampleClass {
//body
}
작명방식 또한 대문자 카멜케이스로 같다.
사용
//class 예시
class Human {
var age: Int = 0
var height: Double = 0.0
}
var jason = Human()
jason.age = 19
jason.height = 180.4
//struct 예시
struct Person {
var age: Int = 0
var height: Double = 0.0
}
var amy = Person()
amy.age = 12
amy.height = 142.1
기본적인 사용방법은 같다.
그러나 class는 반드시 위처럼 초기화를 해주거나 init메서드를 통해서 초기값을 무조건 지정해야 한다.
struct는 초기화가 없어도 나중에 인스턴스 생성 시에 값을 넣으며 생성할 수 있다.
아래 예시를 보자.
struct DrinkA {
let name: String
let alcohol: Double
}
class DrinkB {
let name: String
let alcohole: Double
init(name: String, alcohole: Double) {
self.name = name
self.alcohole = alcohole
}
}
var beer = DrinkA(name: "beer", alcohol: 5.0)
let soju = DrinkB(name: "soju", alcohole: 15.6)
Struct를 써야 하는 때
기본적으로 구조체와 클래스가 비슷하니까 그냥 둘 중 하나만 쓰면 되지 않나 생각할 수 있는데
애플에서는 다음 조건중 하나라도 해당되면 구조체의 사용을 권장한다.
1. 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
2. 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
3. 구조체에 저장된 프로퍼티가 value타입이며 참조보다 복사가 합당할 때
4. 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
스위프트 - 구조체, 클래스
'공부 > Apple' 카테고리의 다른 글
[스위프트] UILabel의 폰트사이즈를 label width에 맞추기 (0) | 2023.08.28 |
---|---|
[스위프트] MVC 패턴 (0) | 2023.08.26 |
[스위프트] 델리게이트 패턴 (delegate) (0) | 2023.08.06 |
[스위프트] 클로저(Closures) (0) | 2023.07.10 |
[스위프트] defer(디퍼) (0) | 2023.07.10 |