Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Value / Reference semantics에 대하여 설명해주세요. #31

Open
0Hooni opened this issue Jan 12, 2025 · 4 comments
Open

Value / Reference semantics에 대하여 설명해주세요. #31

0Hooni opened this issue Jan 12, 2025 · 4 comments

Comments

@0Hooni
Copy link
Collaborator

0Hooni commented Jan 12, 2025

No description provided.

@hsw1920
Copy link
Owner

hsw1920 commented Jan 14, 2025

값 타입(value type)

값 타입의 대표적인 타입은 구조체와 열거형이 있습니다.

값 타입 인스턴스를 생성하여 변수에 저장하게 되면 Data 영역에 저장된 구조체에서 인스턴스가 생성되어 스택 영역에 저장됩니다.

값 타입은 생성된 인스턴스의 실제 값을 가지고 복사본을 생성하기 때문에 원본과 별개로 독자적인 데이터 값을 가지게 됩니다. 따라서 값 타입으로 선언한 경우에는 하나의 인스턴스에 대해 여러개의 복사본이 존재할 수 있고, 복사본들은 원본에 영향을 주지 않는 자신만의 데이터를 갖게 됩니다.

참조 타입(reference type)

참조 타입의 대표적인 타입은 class입니다.

참조 타입의 경우 값 타입과 달리 인스턴스의 실제 메모리는 Heap(힙) 영역에 저장되고,
Stack(스택) 영역에는 인스턴스의 실제 위치인 Heap 영역에 있는 메모리 주소가 저장됩니다.

스택 영역에 직접 값을 저장하는 값 타입과 달리 참조 타입은 실제 값을 저장하는 것이 아닌 인스턴스가 위치하고 있는 메모리 주소 값을 복사해서 저장하기 때문에 하나의 인스턴스에 대한 복사본이 여러개 존재하는 값타입과 달리 하나의 클래스 인스턴스가 존재하고, 그 클래스 인스턴스의 주소를 참조하는 여러 개의 참조체가 존재하게 됩니다. 따라서 참조체의 값을 변경하게 되면 원본 클래스 인스턴스의 값을 변경하게 되고 이를 참조하는 모든 참조체들에 변경이 일어납니다.

@youn9k
Copy link
Collaborator

youn9k commented Jan 14, 2025

Value Semantics는 서로 다른 변수들이 완전히 독립적인 값을 가진 것처럼 동작한다는 것을 의미합니다.
한 변수에서 다른 변수로 값을 복사하면 각 변수는 서로의 변경에 대해 영향을 받지 않습니다. Swift에선 이러한 Value Semantics를 강조하며 Value 타입인 Struct 나 Enum 타입을 사용하는걸 권장하는 것으로 알고 있습니다.

Reference Semantics는 서로 다른 변수가 동일한 인스턴스를 참조하여 메모리 효율적으로 동작하는 것을 의미하는 것 같습니다.
한 변수에서 다른 변수로 참조 타입을 복사하면 각 변수는 동일한 인스턴스의 메모리 주소를 가리키게 됩니다.
Reference 타입이나 Collection 타입, String 처럼 복사할 때마다 새로운 인스턴스가 생성되면 비효율적인 구조에서 하나의 인스턴스를 참조하여 메모리를 효율적으로 사용하는 방식을 의미하지 않나 싶습니다.

@0Hooni
Copy link
Collaborator Author

0Hooni commented Jan 14, 2025

🙋🏻 답변

값 타입과 참조 타입은 데이터를 어떤 형태로 전달하고 관리할지를 결정하는데 중요한 요소입니다.

우선 값 타입의 경우 struct, enum, tuple과 같은 타입이 대표적인 예시입니다. 값 타입은 변수나 상수에 할당될 때 복사되어 사용합니다. 그렇다보니 복사한 인스턴스에 별도의 변경을 가해도 원본에는 변경이 반영되지 않는 특성을 갖고 있습니다. 또한 값이 복사될 때 마다 스택 메모리에 새롭게 할당되고, 자동으로 관리가 됩니다.

참조 타입의 경우 class, function, closuer와 같은 타입이 대표적인 예시입니다. 참조 타입이 할당될 때는 한번만 힙에 할당되고, 이후 상수에 변수에 할당할 때 인스턴스의 참조가 복사됩니다. 이러한 특성덕분에 다른 인스턴스에 변경을 가하면 해당 인스턴스를 참조하고 있던 모든 곳에서 변경이 반영됩니다.

🏷️ 키워드

예시, 할당방식, 변경시, 메모리, 관리

@Kiyoung-Kim-57
Copy link
Collaborator

값 타입의 대표적인 예시는 구조체와 열거형입니다.
값 타입은 객체 또는 데이터를 복사할 때 실제 값 자체를 복사하는 깊은 복사가 일어납니다. 그래서 데이터의 불변성을 유지할 수 있습니다. 주로 독립적인 데이터를 다룰 때 사용됩니다.

참조 타입의 대표적인 예시는 클래스와 클로저입니다.
참조 타입은 객체 또는 데이터를 복사할 때 메모리 참조 주소를 복사하는 얕은 복사가 일어납니다. 이러한 특성 덕분에 여러 변수가 동일한 상태를 공유할 수 있습니다. 다만 동시성 프로그래밍에서 데이터 경합 문제가 발생할 수 있으니 조심해야 합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants