(주말공부)XR 플밍 - (6) 구조체와 클래스의 차이점 분석 (3/30)

이형원·2025년 3월 30일
0

XR플밍

목록 보기
28/215

이번 주말 공부 주제에 관해 생각해 보며 문득 내가 정리했던 구조체(struct)와 클래스(class)의 내용을 살펴 보았다.

  1. 구조체 : 사용자 정의 데이터 유형(Data Type), 비유하자면 여러 데이터를 담을 수 있는 박스이다.

  2. 클래스 : 데이터와 관련 기능을 캡슐화할 수 있는 참조 형식으로, 객체지향 프로그래밍에 객체를 만들기 위한 설계도이다. 이를 통해 만들어진 객체는 인스턴스라 한다.

간략하게 적어놨던 내용이지만, 오늘의 주제에 대한 기록을 남기기 위해서만큼 구조체와 클래스가 정확히 무엇인지 제대로 파악해 보기로 했다.

1. 구조체와 클래스, 다시 한 번 제대로 알아보자.

1.1 구조체란?

구조체는 데이터, 즉 하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형(Data Type)이다.
int, double 등과 같은 기본적으로 제공되는 변수 유형이 아닌 새로운 유형, 여러가지 유형을 사용하기 위해 사용자가 직접 만들어 사용할 수 있다. C#에서 구조체는 일반 변수와 같이 값 형식의 데이터이다.

1.2 클래스란?

클래스는 객체를 만들어 낼 수 있는 틀이며, 객체 지향 언어에서 하나의 프로그램 단위라 할 수 있다. C#에서 클래스는 참조 형식의 데이터이다.
클래스의 구성요소를 살펴 보자면 아래와 같다.

  • 생성자, 상수, 멤버 변수(필드), 함수, 인덱서, 중첩클래스, 종료자 등

1.3 구조체와 클래스의 공통점

이와 같이 구조체와 클래스는 같은 듯 다른 역할을 하고 있음을 알 수 있다.

각각의 정의를 살펴 보았을 때 구조체와 클래스는 아래와 같은 공통점을 지니고 있다고 생각된다.

  1. 서로 다른 자료형을 하나의 집합으로 묶을 수 있다는 점
  2. 사용자가 직접 정의하여 새로운 자료형처럼 사용 가능하다는 점

실제로 처음 써 봤을 때는 구조체와 클래스의 사용방법이 유사하다고 느낄 수도 있다. 다만 이미 정의에서도 언급했다시피 실제로는 역할과 사용 방법이 다르다.

2. 구조체와 클래스의 차이점

2.1 구조체 : 값 타입 / 클래스 : 참조 타입★

구조체와 클래스의 정의에서부터 언급했다시피, 구조체는 값 타입, 클래스는 참조 타입이라고 정의되어 있다. 이 부분에 대해서 우리는 조금 깊게 다뤄 볼 필요성이 있다.

값 타입과 참조 타입, 두 개가 어떻게 다른 걸까?

  • 값 타입

    -변수가 값을 담는 데이터 형식
    -스택 메모리 영역에 정보가 저장됨
    -Primitive Type(int, float, bool, char 등) 과 구조체가 이에 해당함
    -변수의 선언과 동시에 값을 할당할 수 있음
    -단일할 공간에 생성된 데이터는 직접적이며, 변수의 대입이나 매개변수로 데이터를 전달할 때 '값에 대한 복사'가 일어남

즉 값 타입의 핵심은,
값을 담는 데이터 형식으로 스택에 정보가 저장되며, 변수를 대입이나 매개변수로 사용 시에 '값에 대한 복사'가 일어난다는 것이다.

참조 타입

-변수가 값이 있는 곳(주소)를 담는 데이터형식
-참조 타입의 데이터는 힙에 저장되고 그 참조를 위한 주소가 스택 공간에 분리되어 저장된다.
-Class, String, Object, 배열, list 등
-참조 타입을 사용하기 위해선 new 키워드를 통해 객체를 초기화한 후 힙에 할당된 메모리를 스택공간에서 참조함
-참조 타입의 변수를 대입하거나 매개변수로 데이터를 전달할 때, reference만 복사되고 데이터가 직접 복사되진 않음

즉, 참조 타입의 핵심은,
참조에 의한 데이터 형식으로 힙에 정보가 저장되며 그 주소가 스택에 저장되고, 변수를 대입이나 매개변수 형태로 전달 시에 '주소에 대한 복사'가 일어난다는 것이다.

이와 같은 특징을 생각해 보면, 구조체는 스택에 저장되고 클래스는 힙에 저장된다는 사실을 알 수 있다. 이와 같은 이유로, 구조체는 속도가 빠르고 클래스는 상대적으로 속도가 느리다는 점을 기억하도록 한다.

2.2 상속

두 번째 차이점으로는 구조체는 상속이 불가능하고 클래스는 상속이 가능하다는 점이 있다

  1. 구조체 : 상속이 불가능하다. 구조체는 다른 구조체나 클래스를 상속할 수 없다.
  2. 클래스: 상속이 가능하다. 한 클래스는 다른 클래스에서 상속을 받아 기능을 확장할 수 있다.

2.3 데이터의 불변성

  1. 구조체 : 내부 데이터의 특정 값을 직접 세팅할 수 없다. 따라서 상태 변경이 가능한 구조체를 만들 수 없다.
  2. 클래스 : 내부 데이터의 특정 값을 세팅해줄 수 있고, 변경이 가능하다. 이를 가변성이라고 한다.

2.4 성능

앞선 2.1의 타입에 따라 발생하는 성능 차이이다.

  1. 구조체 : 스택 메모리에서 데이터를 가져오기 때문에 메모리 할당과 해제가 클래스보다 빠를 수 있다. 구조체의 크기가 작을 수록 성능 면에서 유리하다.
  2. 클래스 : 메모리 할당과 해제가 느릴 수 있지만, 크기가 크거나 복잡한 데이터를 조작할 때 더 효율적일 수 있다.

3. 구조체와 클래스를 구분해서 사용할 방법?

위와 같은 특징을 종합해 보았을 때 구조체와 클래스를 사용해야 할 장소가 확연히 다르다는 사실을 알 수 있다.

  1. 구조체의 사용
  • 16 바이트가 넘지 않는 작고 간단한 데이터 구조
    (16 바이트 이하로 사용하길 MSDN에 명시되어 있음)
  • 불변성을 갖고 있을 것
  • 메모리 효율성이 중요한 경우
  • 상속이 필요 없는 경우
  • 자주 복사되는 데이터
  1. 클래스의 사용
  • 상속이 필요한 경우
  • 참조로 데이터 공유가 필요한 경우
  • 큰 데이터 구조인 경우
  • 가변 상태를 가지는 객체 - 객체의 상태가 자주 변경되거나, 다양한 상태를 가져야 하는 경우
  • 수명 주기 관리가 필요한 경우
profile
게임 만들러 코딩 공부중

0개의 댓글