구조체와 클래스의 차이 - C# 위주로

Jinho Lee·2024년 8월 7일
0

개요

  • 회사에서 C#으로 구조체 생성자를 쓸 일이 있었는데, 클래스 생성자처럼 매개변수 없이 바로 쓰고 사용하려 했을 때 생각처럼 안 돌아갔다. 여기서 내가 구조체와 클래스 차이를 잘 모른다는 걸 알고 조사해보았다.

구조체와 클래스 (C#)

  • 구조체와 클래스는 모두 다양한 변수를 멤버로 가질 수 있는 컨테이너로, C#의 경우 둘 모두 생성자, 메소드, 속성, 필드를 가지는 등 많은 면에서 비슷하다. 하지만 이 둘은 C#에서 아래와 같은 차이를 가진다.

C#에서 구조체와 클래스의 차이

  1. 구조체는 값 형식이고, 클래스는 참조 형식이다.

    • 가장 기본적이고 일견 당연해보이는 차이이지만, 이 차이로 인해 아래 2, 3과 같은 차이가 생긴다.
  2. 구조체는 스택 할당이고, 클래스는 힙 할당이다.

    • 따라서 구조체는 런타임에서 할당하지 않아 퍼포먼스 상 이점이 있지만, 스택 메모리에는 한도가 있어 주의하지 않으면 스택 오버플로우가 일어날 수 있다.

    2-1. 구조체는 가비지 컬렉션의 대상 밖이다.

    • 이러한 이유로 구조체가 클래스보다 성능 상 이점이 있을 수 있다.
  3. 구조체는 상속할 수 없고, 클래스는 할 수 있다.

    3-1. 구조체 요소는 protected로 선언될 수 없다.

  4. 구조체의 기본 한정자는 public이고, 클래스는 private이다. 한정자를 지정하지 않는다면 기본 한정자로 선언한 것으로 간주된다.

  5. 구조체는 매개변수 없는 기본 생성자를 선언할 수 없다.

    • 따라서, 생성자를 이용해 초기화하고 싶으면 매개변수를 반드시 넣자!

C++의 경우

  • 재미있게도, C++의 경우에는 둘 사이의 차이가 거의 없다고 한다.

  • 둘의 차이는 기본 한정자가 구조체가 public, 클래스가 private인 정도로, 구조체가 상속도 가능하고 클래스와 차이가 없다고 한다. 구조체에 함수 포인터를 더한 게 클래스일 정도라고.

  • C++에서 이 둘을 나눠쓰는 것은 OOP를 추구하기 위한 코딩 스타일이라고 받아들이면 될 것 같다.

참고

0개의 댓글