본문 바로가기
iOS/Swift 문법 심화 학습

값 타입과 참조 타입

by 황민우 2022. 1. 31.

클래스 / 구조체 / 열거형

 

클래스와 구조체, 열거형을 비교하며 값 타입과 참조 타입을 자세히 알아보겠습니다.

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

댓글