클래스 / 구조체 / 열거형
클래스와 구조체, 열거형을 비교하며 값 타입과 참조 타입을 자세히 알아보겠습니다.
Class | Struct | Enum |
참조 타입 | 값 타입 | 값 타입 |
단일 상속 | 상속 불가 | 상속 불가 |
(인스턴스/타입)메서드 | (인스턴스/타입)메서드 | (인스턴스/타입)메서드 |
(인스턴스/타입)프로퍼티 | (인스턴스/타입)프로퍼티 | (인스턴스/타입)연산 프로퍼티 |
Apple 프레임워크의 큰 뼈대는 모두 클래스로 구성 |
Swift의 대부분의 큰 뼈대는 모두 구조체로 구성 |
다른 언어의 열거형과는 많이 다른 존재 |
열거형 자체가 하나의 데이터 타입 | ||
열거형의 case 하나하나 전부 하나의 유의미한 값으로 취급 |
*클래스, 구조체, 열거형 모두 Extension기능 사용 가능*
구조체의 사용
Swift에서 대부분의 뼈대는 모두 구조체로 구성된다고 하였는데,
클래스와 구조체는 매우 비슷해보이는데, 대체 언제 구조체를 사용할까요?
- 연관된 몇몇의 값들을 모아서 하나의 데이터타입으로 표현하고 싶을 때
- 다른 객체 또는 함수 등으로 전달 될 때, 참조가 아닌 복사를 원할 때
- 자신을 상속할 필요가 없거나, 자신이 다른 타입을 상속받을 필요가 없을 때
값 타입과 참조 타입의 데이터 전달
※ 값 타입
- 값을 복사하여 전달
※ 참조 타입
- 메모리 위치를 전달
예제
직접 구조체와 클래스를 만들어 차이점을 알아보겠습니다.
구조체
구조체 상수와 변수를 만들어,
구조체 상수에는 구조체 인스턴스를 만들어 할당하였고
구조체 변수에는 구조체 인스턴스로 초기화한 뒤 변수의 프로퍼티 값을 변경 시켰습니다.
-
결과를 실행해보면
첫 번째 프로퍼티의 값은 1이 출력되고,
두 번째 프로퍼티의 값은 2가 출력됩니다.
이 말은 secondStructInstance라는 변수에 firstStructInstance라는 상수가 새로 복사되어 저장되었다는 의미입니다.
즉, firstStructInstance와 값은 똑같지만, 새로운 무언가가 만들어져 저장이 된 것이죠.
struct ValueType {
var property = 1
}
let firstStructInstance = ValueType()
var secondStructInstance = firstStructInstance
secondStructInstance.property = 2
print("first Struct Instance Property : \(firstStructInstance.property)")
print("second Struct Instance Property : \(secondStructInstance.property)")
실행결과
클래스
클래스도 마찬가지로 상수와 변수를 만들어,
클래스 상수에는 클래스 인스턴스를 만들어 할당하였고
클래스 변수에는 클래스 인스턴스로 초기화한 뒤 변수의 프로퍼티 값을 변경 시켰습니다.
-
결과를 실행해보면
구조체와 다르게
첫 번째 프로퍼티의 값과 두 번째 프로퍼티의 값 모두 2가 출력됩니다.
클래스는 구조체와 다르게 복사되는 개념이 아닌,
firstClassReference 상수의 참조값이 secondClassReference 변수에 할당됩니다.
class ReferenceType {
var property = 1
}
let firstClassReference = ReferenceType()
var secondClassReference = firstClassReference
secondClassReference.property = 2
print("first Class Reference Property : \(firstClassReference.property)")
print("second Class Reference Property : \(secondClassReference.property)")
실행결과
내용출처
https://www.youtube.com/watch?v=itMj3tVyrWo&list=WL&index=1
'iOS > Swift 문법 심화 학습' 카테고리의 다른 글
클로저 고급 (0) | 2022.02.02 |
---|---|
클로저 (0) | 2022.02.01 |
extensions (0) | 2022.01.30 |
guard (0) | 2022.01.28 |
assert (0) | 2022.01.28 |
댓글