구조체(struct) vs. 클래스(class)

개발조하·2023년 10월 24일
0

C#

목록 보기
2/11
post-thumbnail

1. 유사점

  • 여러 변수를 담을 수 있는 컨테이너 형식이다.
  • 생성자, 메서드, 속성, 필드, 상수, 열거형, 이벤트 및 이벤트 처리기를 포함할 수 있는 멤버가 있다.
  • 멤버들은 각각 개별적인 접근 수준을 가질 수 있다. 예를 들어, 하나의 멤버는 public으로 선언되고, 다른 멤버는 private로 선언될 수 있다.
  • 인터페이스를 구현할 수 있다.
  • 공유 생성자를 가질 수 있으며, 필요에 따라 매개 변수를 사용하여 초기화하거나 매개 변수를 사용하지 않고 기본 초기화를 수행할 수 있다.
  • 기본 속성을 노출할 수 있다. 속성이 매개 변수를 하나 이상 사용하는 경우.
    ㄴ 구조체는 필드를 노출하여 직접 접근하고, 클래스는 필드에 직접 접근하지 않고 속성을 통해 상호작용함.
  • 이벤트를 선언하고 발생시키고 대리자(delegate)를 선언할 수 있다.

2. 차이점

2.1 구조체(struct)

  • 값 형식(스택 할당)
  • 최소한 하나의 데이터 멤버(변수) 또는 이벤트를 가져야 한다.
    ㄴ 구조체는 주로 데이터를 포함하고 간단한 값 형식으로 사용되기에 데이터를 보유해야 함
  • 값 형식으로 스택에 저장되며 개체가 스택에서 빠져나갈 때 자동으로 파괴된다.(Finalize 메서드를 호출하지 않는다)
  • 구조체 안에 정의된 모든 멤버는 기본적으로 public으로 설정된다.
    ㄴ 외부 코드에서 쉽게 접근 가능하도록!
  • 구조체는 System.ValueType 클래스로부터 암시적으로 상속되며, 다른 클래스나 형식에서 상속받을 수 없다.
    ㄴ즉, System.ValueType 클래스 이외에 다른 클래스를 상속받을 수 X.
  • 상속 관계가 없는 값 형식! -> protected 선언 불가
    protected멤버는 파생 클래스에서만 접근할 수 있도록 하는 것이 목적인 접근제어자이기 때문.
  • 이벤트 처리를 위해 SharedSub프로시저와 AddHandler문을 사용해야 한다.
  • 구조체 변수의 배열은 선언 시 크기나 초기값을 설정할 수 없다.
    ㄴ 반드시 나중에 별도의 할당 또는 초기화 단계에서 처리되어야 한다.
  • 구조체는 생성자가 필수적으로 필요하지 않기 때문에 구조체를 정의할 때 생성자를 명시적으로 선언하지 않아도 된다.
    ㄴ 기본 생성자가 자동으로 제공되며 필요시 사용자 지정 생성자를 추가할 수 있다.
  • 즉, 생성자가 필요한 경우에는 매개 변수를 받는 생성자를 정의하고, 필요하지 않은 경우에는 매개 변수를 받지 않는 생성자를 정의한다.

2.2 클래스(class)

  • 참조 형식(힙 할당)
  • 가비지 컬렉터(GC)에 의해 관리된다.
    ㄴ 클래스 인스턴스가 더이상 활성참조를 가지고 있지 않을 때 CG는 클래스의 Finalize메서드를 호출하여 리소스 관리와 정리를 수행한다.
  • 클래스 안에 정의된 변수(멤버변수)와 상수는 기본적으로 private로 설정된다.
    ㄴ 외부에서 직접 접근하지 못하도록 보호하기 위함
  • 클래스 안의 다른 멤버(메서드, 속성, 이벤트 등)은 기본적으로 public으로 설정
    ㄴ 클래스를 사용하는 코드에서 클래스의 다양한 멤버에 쉽게 접근하도록!
  • 클래스는 비어있어도(멤버 X)도 유효하다.
  • 클래스는 System.ValueType 클래스를 제외한 다른 클래스나 형식으로부터 상속 받을 수 있다.
    ㄴ 다른 클래스를 확장하거나, 인터페이스를 구현하거나, 새로운 기능을 추가하는 등 다양한 상속 및 확장 가능성을 제공한다.
  • 클래스는 상속할 수 있기 때문에 protected 선언 가능
  • 이벤트 처리를 위해 "Handles" 키워드 또는 "AddHandler"문을 사용하여 이벤트 처리를 할 수 있다.
  • 클래스 변수의 배열은 선언 시에 크기나 초기값을 설정할 수 있다.
  • 클래스를 정의할 때 최소한 하나의 생성자를 명시적으로 선언해야 한다.
    ㄴ 객체의 초기화와 상태 설정을 위해 생성자가 필수적이다.
    ㄴ C#에서 클래스를 정의할 때 생성자를 명시적으로 선언하지 않으면 매개 변수가 없는 '기본 생성자(default constructor)'가 생성된다.

3. 예시로 살펴보기

먼저, 구조체는 '값형식'이고, 클래스는 '참조형식'임을 알아야 한다.
(*값형식과 참조형식은 아래 포스팅을 참고해주세요!)
링크_값형식과 참조형식 포스팅

구조체

ㄴ 값형식이기 때문에 ani.Name = "Dog"ani2.Name = "Cat"이 각각 출력됨.

클래스

ㄴ 참조형식이기 때문에 ani2.Name = "Cat"으로 모두 덮어짐.

4. 마치며

구조체(Struct)의 쓰임에 대해서 GC의 부담을 줄이며 메모리의 효율을 추구하기 위해서 사용한다는 의견이 많다. 하지만 OOP(객체지향프로그래밍)에서 구조체를 무리하게 쓰다보면 헷갈림을 유발하기 쉬워서 오류가 발생하거나 코드를 짜기 어려울 수 있다.. (굳이 구조체를 쓰지 않아도 된다고 함)

📄참고자료
[인프런] C# 프로그래밍 기초 - 이교준
구조체와 클래스(visual Basic)

profile
Unity 개발자 취준생의 개발로그, Slow and steady wins the race !

0개의 댓글