Computer >> 컴퓨터 >  >> 스마트폰 >> iPhone

한 어머니와 두 아들의 이야기:Swift의 값 유형 대 참조 유형

Swift는 어머니이고 두 아들이 있습니까?-

  • 값 유형 ??‍♀️
  • 참조 유형 ?‍♂️

근데 그들의 특징은??‍♂️

그들은 서로 같은 행동을 합니까 아니면 반대로 행동합니까? ?‍♂️

Swift는 iOS, macOS, watchOS, tvOS, Linux 및 z/OS용으로 Apple에서 개발한 다중 패러다임 프로그래밍 언어입니다.?

다른 객체 지향 프로그래밍 언어와 마찬가지로 Swift에는 메서드, 속성, 이니셜라이저를 정의할 수 있고 프로토콜을 준수하고 상속 및 다형성을 지원할 수 있는 빌딩 블록으로 클래스가 있습니다.?

하지만, 잠깐만 기다려...????

Swift에도 구조체가 있으며 메서드, 속성, 이니셜라이저를 정의할 수 있으며 상속을 제외하고는 프로토콜을 따를 수 있습니다.?

뭐? 지금 나는 혼란스럽다!!! ???

이제 혼란을 가중시키겠습니다. Swift에서 구조체는 값 유형일 뿐만이 아닙니다. 튜플과 열거형도 값 유형입니다. 클래스가 참조 유형으로 사용되는 유일한 것은 아닙니다. 함수와 클로저도 참조 유형입니다. 그러나 안도의 표시로 최소한 이러한 유형의 사용에 대한 주요 초점 및 전문화를 알고 있습니다.

그래서 지금까지 구조체와 클래스의 사용에 대해 한 가지 큰 혼란만 남았습니다.?

그럼, 혼란을 해소하러 가볼까요.?‍♂️

저장 위치

세 가지 유형의 스토리지를 사용할 수 있습니다.

  • 등록하시겠습니까?
  • 스택 ☄️
  • 힙?

수명이 짧은 객체는 레지스터나 스택에 저장되고 수명이 긴 객체는 힙에 저장됩니다.?

값 유형은 스택에 할당된 메모리에 내용을 저장하므로 Swift에서는 값 유형이 스택에 할당된다고 말할 수 있습니다. ?

하지만 값 유형에 대한 일반적인 오해가 있습니다. 들어보셨나요??‍♂️

대부분의 사람들은 값 유형이 항상 스택에 저장되어 있다고 생각하는 것으로 오해하고 있습니다.

❌❌ 잠깐만 — 항상 그런 것은 아닙니다. ❌❌

값 유형은 임시 또는 지역 변수일 때 스택 내부에 저장할 수 있습니다. 그러나 값 유형이 참조 유형 안에 포함되어 있으면 어떻게 될까요?

이 경우 힙 메모리 내부에 저장할 수 있습니다. ?

와...멋지네요!!!?

따라서 값 유형은 수명이 짧든 오래가든 수명에 따라 레지스터, 스택 또는 힙 내부에 저장할 수 있습니다. 지역 변수인 경우 스택 내부에 존재할 수 있고 클래스의 일부인 경우 힙 메모리 내부에도 존재할 수 있습니다.✅

반면 참조 유형은 힙 메모리에 할당된 메모리에 내용을 저장하고 변수는 실제 데이터가 저장된 해당 메모리 위치에 대한 참조만 보유합니다. ??

참조 유형에 대해 어떻게 작동합니까?

따라서 참조 유형의 경우 동일한 메모리 위치에 대한 참조를 보유하는 여러 변수가 있을 수 있는 매우 일반적인 상황입니다.⚔️

값 유형 인스턴스가 변수에 할당되거나 함수에 전달되면 인스턴스가 복사되어 해당 변수에 할당됩니다. 그러나 참조 유형을 사용하면 참조만 복사되고 새 변수는 동일한 메모리 위치에 대한 동일한 참조를 보유합니다. ?

가변성 측면의 차이점

변수에는 두 가지 상태가 있을 수 있습니다.

  • ?‍♀ ️변경 가능?‍♀
  • ?️‍♂️ 불변 ?️‍♂️

값 유형 인스턴스가 변경할 수 없는 변수에 할당되면 인스턴스도 변경되지 않습니다. 결과적으로 해당 인스턴스를 변경할 수 없습니다.?‍♂️

값 유형 인스턴스가 변경 가능한 변수에 할당된 경우에만 인스턴스를 변경 가능하게 만듭니다. ?‍♂️

그러나 참조 유형의 경우 상황이 완전히 다릅니다. 변수와 변수가 할당된 인스턴스는 완전히 다릅니다. 클래스에 대한 참조를 보유하는 불변 변수를 선언하면 보유하고 있는 참조가 절대 변경되지 않음을 의미합니다. 참조를 변경할 수 없으며 항상 동일한 참조를 가리킵니다. ?

구조 유형

구조적 유형의 값은 속성 또는 요소 측면에서 동일한지 비교됩니다. 모든 해당 속성이 동일한 경우에만 값 유형이 다른 유형과 같다고 말할 수 있습니다. ???

음...강한 단어가 너무 많습니다...무슨 뜻인가요???

사람이 있다고 가정해 보겠습니다. firstName과 같은 속성이 있는 값 유형 성.

struct Person {
   var firstName: String
   var lastName: String
}

var person1 = Person(firstName: "foo", lastName: "bar")

var person2 = Person(firstName: "foo", lastName: "bar")

person1 둘 다 &사람2 인스턴스가 firstName에 대해 동일한 값을 보유하고 있습니다. ("후") 성("막대") <엠>. 따라서 우리의 이해에 따르면 두 인스턴스는 속성(firstName & ) 같은 값을 유지하고 있습니다.

하지만 이에 국한되지 않습니다. 앞으로 firstName에 대해 동일한 값을 보유하는 두 사람 인스턴스 & 서로 동등합니다.

따라서 지금까지의 이해에 따르면 다음과 같이 말할 수 있습니다.

값 유형에는 ID가 없으므로 참조할 수 없습니다. 값 유형은 얼굴이 없습니다.

뭐? 어떻게 그런 말을 할 수 있죠????

var myAge: Int = 21
var friendAge: Int = 21

myAge 둘 다 &friendAge 값이 21인 정수형 변수입니다.

서로 구별할 수 있습니까? ?

아니요, 같은 값을 가지고 있기 때문입니다.

값이 21인 정수 변수는 값이 21인 다른 정수 변수와 다를 수 없습니다. 그렇게 간단합니다.???

정체성이 없다는 것은 가치 유형에 또 다른 이점을 제공합니다. 실질적으로 생각하면 정체성이 없는 경우 동일한 특성을 가진 사람이 당신을 대체하거나 대체할 수 있다고 상상할 수 있습니다. ???

우리도 인간으로서 생각할 수 있는 것과 같습니다. 아이디가 없으면 성격이 같은 사람이 대신할 수 있다???. 우리에게 정체성이 있다는 것은 좋은 일입니다. 그렇지 않으면 우리의 존재에 큰 위험이 될 것입니다.?

그러나 값 유형의 경우 ID가 없으며 이점이 있습니다. ?

값 유형을 사용하면 어떤 이점이 있습니까?

? 경쟁 조건 및 교착 상태 없음:?

다중 스레드 환경의 값 유형의 경우 한 스레드가 다른 스레드에서 사용되는 동안 인스턴스의 상태를 변경하는 것은 불가능합니다. 따라서 경쟁 조건이나 교착 상태가 없을 것이라고 말할 수 있습니다.

⚔️ 보유 주기 없음:⚔️

서로에 대한 강력한 참조를 유지하고 서로가 메모리에서 할당 해제되는 것을 방지하는 두 개의 참조 유형 인스턴스가 있는 경우 이를 유지 주기라고 합니다. 값 유형은 참조로 작동하지 않으므로 값 유형에 대한 유지 주기가 없다고 말할 수 있습니다.

?‍?‍?‍? 자동 참조 카운팅:?‍?‍?‍?

참조 유형의 경우 Swift는 자동 참조 카운팅을 사용하여 모든 라이브 또는 활성 객체를 추적하고 더 이상 강력한 참조가 없을 때만 인스턴스를 할당 해제합니다. 조금 생각해보면 Swift 런타임이 항상 객체를 추적해야 하기 때문에 일종의 무거운 작업이라고 말할 수 있습니다. 그러나 값 유형은 스택에 할당되므로 ARC가 필요하지 않습니다. 그래서 더 싸고 빨라요??.

하지만 잠깐... 배열, 사전 및 문자열에 대한 메모리를 어떻게 관리합니까?

컴파일 시 배열, 사전, 문자열의 실제 크기가 얼마인지 알 수 없으므로 컴파일 시 할당할 범위가 없습니다. 내부적으로는 값 유형이지만 스택에 할당할 수 없습니다. 힙 메모리에 할당해야 하며 이를 관리하기 위해 Swift는 copy on write를 제공합니다. .?

근데 이게 뭐야??

한 인스턴스가 다른 인스턴스의 복사본이라고 말할 때 이는 실제로 동일하다는 의미이며 동일한 값을 포함합니다. 그러나 Swift에서는 위의 유형(Array, Dictionary, String 등)에 대해 인스턴스가 변경될 때만 힙에 실제 복사본이 만들어집니다. 이를 값 유형에 대한 성능 최적화 기술이라고 합니다.???

결론

값 유형을 사용할 때와 참조 유형을 사용할 때를 정의하는 엄격한 규칙은 없습니다. 값 유형은 참조 유형에 비해 몇 가지 고유한 이점이 있으며 그 반대의 경우도 마찬가지입니다. 둘 다 각자의 방식으로 독특합니다. 그것은 실제로 귀하의 요구 사항과 달성하려는 목표에 달려 있습니다. 코드를 가장 잘 알고 있기 때문에 코드의 의미를 알아야 하므로 선택은 귀하에게 달려 있습니다. 당신에게는 완전한 자유가 있습니다.

따라서 값 유형과 참조 유형을 놓고 싸우기보다 현명하게 사용하세요.

??? 건배!!! 읽어 주셔서 감사합니다!! ???

✅✅✅ 에서 저를 찾을 수 있습니다 트위터 .✅✅✅