ecsimsw

OOP / Class vs Struct / Memory aspects 본문

OOP / Class vs Struct / Memory aspects

JinHwan Kim 2019. 1. 16. 08:50

Class & Struct

  • Class & Struct
      앞서 참조와 값 형식의 차이에 대해서 공부하였고 struct와 class를 비교하여 공부하면 더 명확하게 이해 할 수 있을 것이라고 생각하였다.
      두 형식 모두 같은 기능이나 속성을 갖은 것들을 캡슐화하기 위한 장치인 것과 형식적인 차이점은 알고 있으나,
      두 개가 어떤 차이가 있는지, 만약 그 쓰임이 같거나 한쪽이 우월하다면 다른 쪽 도구는 왜 존재하는지가 궁금하여 공부하였다.
  • Class & Struct _ Usage aspects
    - 우선 사용 측면에서의 다른 점은 다음과 같다.
    1) struct는 값 형식, class는 참조 형식이다.
      : struct는 new 연산자 없이 생성해도 자체 호출이 되서 생성이 가능하다.
      : 개체 복제 시 struct는 개체의 값을 복사해 대입하고, class는 개체의 주소를 가져온다.
    2) struct는 다른 구조체나 클래스에 상속 받을 수 없다.(인터페이스 구현은 가능하다.)
    3) struct는 생성자 정의 시 모든 멤버를 명시적으로 초기화 해야한다.
    3) default access modifier가 struct는 public, class는 private이다.
  • Class & Struct _ Memory aspects
    메모리 관리 측면에서 둘의 차이점은 사실 이전 포스팅 참조 형식과 값 형식의 차이에서 설명된다.
    - class는 heap 영역에 원본 데이터가 저장되고 stack에서는 참조를 위한 변수만을 저장하여 함수의 내부, 외부에 관련 없이 데이터가 유지된다. 또한 참조를 통해 수정을 하므로 원본 데이터를 직접 수정하여 다형성을 가할 수 있다.
    - 반면 struct는 함수 호출 시 데이터가 스택에 쌓이고 스코프 밖에서는 소멸된다. 그렇기 때문에 데이터를 가져오거나 수정하기 위해선 원본 데이터를 이용하는 것이 아닌, 그 값의 값을 리턴하여 대입해야한다. 반대로 참조를 안하고 값 대입만으로 처리한다. 즉 빠르다는 말도 될 수 있을 것이다.
    > FPS 게임의 총알을 생각해보자. 무수한 총알 객체가 빠르게 생성되고 소멸함을 반복할 것이다. 이런 데이터를 만일 class로 작성한다면 소멸전에는 굳이 데이터가 잔여할 것이고, 가비지 컬렉터가 메모리를 해제 시켜주지만 많은 overhead를 발생 시킬 것이다.
      이처럼 생명이 짧고 상속이나 직접 원본 데이터를 관리할 필요가 없는 객체를 위해서는 struct가 메모리 측면에서 더 유리하고 이를 구별하여 struct로 구현하는 습관을 길러야한다. (MS DOCS에선 객체의 좌표를 예시로 들었다.)
    > 반대로 struct를 이용하여 수명이 길면서 데이터의 개수가 많거나 수정을 많이 필요로 하는 객체가 있다고 생각해보자.
     이런 객체들을 관리하려면 stack에는 그 데이터들이 다 적재되어야하고 이는 stack overflow를 야기시킬 것이다. 따라서 이런 객체 형을 결정할 때는 원본 데이터의 주소를 데이터로 갖고 있는 class가 훨씬 유리할 것이다.

'Language > C++, C#' 카테고리의 다른 글

C# / Iterators/ IEnumerator, IEnumerable / yield  (0) 2019.03.01
C# / Is와 As  (0) 2019.01.18
OOP / Up Casting / Down Casting  (0) 2019.01.18
OOP / Encapsulation  (0) 2019.01.15
Reference type / Value type  (0) 2019.01.14
Comments