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

struct, class의 차이점은 무엇인가요? #28

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

struct, class의 차이점은 무엇인가요? #28

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

Q. struct, class의 차이에 대해 설명해주세요.
A.
Swift에서 struct와 class의 가장 큰 차이점은 메모리 저장 방식으로 값 타입참조 타입이라는 점입니다.

먼저 struct와 class의 공통점은 모두 기본적으로 데이터를 용도에 맞게 묶어 표현하고자 할 때 사용합니다.
프로퍼티와 메서드를 통해 구조화된 데이터와 기능을 가지고 하나의 데이터 타입 모델을 표현할 수 있습니다.

반면, 차이점은
struct의 경우 값 타입으로써 구조체를 변수에 할당하거나 함수에 전달하면 값이 복사되어 새로운 변수에 저장됩니다. 각각의 구조체 인스턴스는 일반적으로 스택메모리에 독립적으로 저장되며, 다른 변수에 전달하거나 복사해도 원본이 변경되지 않습니다. 또한 구조체는 불변성과 thread-safe를 유지하기 위해 값을 변경하면 새로운 인스턴스를 생성하여 교체하기 때문에 수정에 대한 오버헤드가 큽니다.
class의 경우 참조 타입으로써 클래스 인스턴스를 다른 변수에 할당하거나 함수에 전달하면 힙영역에 저장된 해당 클래스 인스턴스의 메모리 주소값이 복사되어 저장됩니다. 하나의 클래스 인스턴스를 여러 변수에서 메모리 주소로써 참조하여 하나의 변수에서 인스턴스를 변경하면 다른 변수에서도 영향을 받습니다.

답변 의도

  • 공통점과 차이점을 설명한다.
  • 차이점은 메모리 관리 방식인 값 복사, 참조 복사 관점으로 설명한다.

꼬리 질문

  • class, struct의 성능 차이에 대해 설명해주세요
  • class를 여러 곳에서 참조하면 어떤 문제가 발생할 수 있나요?
  • struct의 메모리 낭비를 어떻게 해결할 수 있나요?
  • struct가 참조 타입 class를 포함하는 경우 어떤식으로 메모리를 관리하나요?
  • struct와 class를 선택하는 기준이 있나요?

@youn9k
Copy link
Collaborator

youn9k commented Jan 14, 2025

struct는 value타입이고 class는 reference 타입이라는 점이 가장 다릅니다.
메모리 관점에서 보게되면 스택 영역에 할당되는 값 타입이 힙 영역에 할당되는 참조 타입보다 접근 속도가 빠르다는 장점이 있습니다.
또한 변수를 다른 변수에 담아 복사하려는 상황에서도 동작이 차이가 나게 됩니다.
값 타입의 경우 완전히 새로운 인스턴스가 생성되는 깊은 복사가 일어나게됩니다. 하지만 참조 타입은 기존 인스턴스의 주소를 복사하기 때문에 같은 인스턴스를 가리키는 얕은 복사가 일어나게 됩니다. 이러한 얕은 복사의 특성을 고려하지 않으면 데이터 변경 시에 해당 인스턴스를 참조하고 있는 모든 변수에 영향을 주어 예상치 못한 결과를 가져올 수 있기 때문에 데이터 타입에 주의해야합니다.

@0Hooni
Copy link
Collaborator Author

0Hooni commented Jan 14, 2025

🙋🏻 답변

Swift에서 Struct와 Class 모두 사용자가 정의한 데이터 타입을 생성하기 위해 사용됩니다. 하지만 이 둘은 사용되는데 있어서 중요한 차이점이 있습니다.

먼저 Struct의 경우 값 타입으로 인스턴스를 복사하는 형태로 사용되고, 복사한 인스턴스에 변경을 가해도 원본을 유지하는 특성을 갖고 있습니다. 또한 class와 다르게 상속을 할 수 없어 한번 선언한 메서드를 오버라이딩 할 수 없습니다.

하지만 Class는 참조 타입으로 동일한 인스턴스를 참조하여 사용할 수 있습니다. 이렇게 참조한 인스턴스에 변경을 가한다면 원본 또한 변하는 특성을 갖고 있습니다.

이 둘은 메모리적인 관점에서도 차이점을 보이는데, struct의 경우 스택에 할당되어 자체적으로 관리가 되지만, class의 경우 힙 메모리에 할당되어 ARC가 관리해줍니다. 그렇다보니 class를 사용할 때에는 무분별한 참조가 되진 않는지 주의있게 사용해줘야되는 단점이 있습니다.

이러한 특성들로 인해 struct는 주로 간단한 데이터 모델이나 불변성이 중요한 경우에 사용되고, class는 복잡한 OOP와 같은 구조를 구축하거나 상태를 공유하는데 사용됩니다.

🏷️ 키워드

데이터모델, 값타입, 참조타입, 상속, 메모리, ARC, 주사용목적

@Kiyoung-Kim-57
Copy link
Collaborator

구조체와 클래스는 둘 다 속성과 메서드를 모아 객체 타입을 만들어 주는데 사용한다.
구조체와 클래스의 차이는 크게 참조-값 타입, 메서드 디스패치가 있습니다.

참조-값

클래스는 객체의 정보가 힙에 저장되며, 스택에는 힙에 저장된 객체의 참조 주소가 복사되어 관리되는 참조 타입입니다.
반면 구조체는 객체의 정보가 바로 스택에 저장되는 값 타입입니다.
참조 타입인 클래스의 경우 스택에서 복사될 때 참조 주소가 복사되기 때문에 복사된 참조들끼리 힙에 저장된 정보를 공유하게 됩니다. 이러한 속성 덕분에 공유 상태를 관리하는데 적합하지만 동시성 문제에서 어려움이 있을 수 있습니다.
구조체는 복사될 때 값의 복사본이 그대로 복사되기 때문에 데이터를 독립적이고 안전하게 다루는데 적합합니다. 이러한 불변성은 구조체의 장점이기도 하지만 값이 수정될 때마다 매번 새로 복사되기 때문에 빈번한 수정이 있는 환경에서 클래스에 비해 성능상으로 좋지 않습니다.

상속과 메서드 디스패치

클래스는 구조체와 다르게 상속이 가능하다는 장점이 있습니다. 상속이 가능해 자녀 클래스가 오버라이딩을 할 수 있어 메서드의 다형성을 보장해주고 확장성, 코드재사용성의 장점을 가질 수 있습니다. 다만 이 경우 메서드 호출이 동적 디스패치를 통해 이루어집니다. 동적 디스패치는 호출될 메서드를 런타임에 확정하는 방식이라 오버헤드가 다소 있습니다.
반면 구조체는 상속이 불가능하지만 메서드 호출이 정적 디스패치를 통해 이루어집니다. 정적 디스패치는 메서드 호출을 컴파일 타임에 확정하기 때문에 성능상 이점이 있습니다.
클래스의 경우 final 키워드를 통해 정적 디스패치를 사용할 수 있지만 그렇게 될 경우 상속의 이점을 포기하게 됩니다.

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