값 타입과 참조 타입

손호준·2022년 6월 9일
0

swift

목록 보기
8/12

클래스, 구조체, 열거형 비교

클래스(Class)

  • 전통적인 OOP관점에서의 클래스
  • 단일상속만 가능
  • (인스턴스/타입) 메서드
  • (인스턴스/타입) 프로퍼티
  • 참조 타입
  • Apple 프레임워크 대부분의 큰 뼈대는 모두 클래스로 구성

구조체(Struct)

  • C언어 등의 구조체보다 다양한 기능
  • 상속 불가
  • (인스턴스/타입) 메서드
  • (인스턴스/타입) 프로퍼티
  • 값 타입
  • Swift 대부분의 큰 뼈대는 모두 구조체로 구성

열거형(Enum)

  • 다른 언어의 열거형과는 많이 다른 존재
  • 상속 불가
  • (인스턴스/타입) 메서드
  • (인스턴스/타입) 연산 프로퍼티
  • 값 타입
  • Enumeration
  • 유사한 종류의 여러 값을 유의미한 이름으로 한 곳에 모아 정의 (eg. 요일, 상태값, 월 등)
  • 열거형 자체가 하나의 데이터 타입이고, 열거형의 각 case 전부 하나의 유의미한 값으로 취급
  • 선언 키워드 - enum
			|Class		|Struct		|Enum
type 		|Reference	|Value		|value
Subclassing	|O			|X			|X
Extension	|O			|O			|O

구조체를 사용하는 경우

  • 연관된 몇몇의 값들을 모아서 하나의 데이터 타입으로 표현하고 싶을 때
  • 다른 객체 또는 함수 등으로 전달될 때
  • 참조가 아닌 복사를 원할 때
  • 자신을 상속할 필요가 없거나, 자신이 다른 타입을 상속받을 필요가 없을 때
  • Apple 프레임워크에서 프로그래밍을 할 때에는 주로 클래스를 많이 사용

값(Value) vs 참조(Reference)

  • 값(Value)
    - 데이터를 전달할 때 값을 복사하여 전달
  • 참조(Reference)
    - 데이터를 전달할 때 값의 메모리 위치를 전달
///struct와 class의 비교///
struct ValueType {
	var property = 1
}

class ReferenceType {
	var property = 1
}

let firstStructInstance = ValueType()
var secondStructInstance = firstStructInstance
secondStructInstance.property = 2

print("first struct instance property : \(firstStructInstance.property)")    // 1 ///struct는 값을 복사하기 때문에 원본 값이 변하지 않음
print("second struct instance property : \(secondStructInstance.property)")  // 2


let firstClassReference = ReferenceType()
var secondClassReference = firstClassReference
secondClassReference.property = 2

print("first class reference property : \(firstClassReference.property)")    // 2 ///class는 값을 참조하기 때문에 원본 값(참조값)이 2로 바뀜
print("second class reference property : \(secondClassReference.property)")  // 2

스위프트의 데이터 타입

스위프트 대부분의 데이터 타입은 구조체임

public struct Int
public struct Double
public struct String
public struct Dictionary<Key : Hashable, Value >
public struct Array<Element>
public struct Set<Element : Hashable>
  • 스위프트는 구조체, 열거형을 선호
  • Apple 프레임워크는 대부분 클래스 사용
  • Apple 프레임워크 사용시 구조체/클래스 선택은 우리의 몫
profile
Rustacean🦀/Data engineer💻

0개의 댓글