본문 바로가기
비전공자 IT 이야기/C#

기술 면접 STRUCT와 CLASS의 차이점은?

by 도쿄 정대리 2022. 6. 22.

면접 질문에서 C# '스트럭트와 클래스의 차이를 설명해주세요'라고 질문을 받고 잘 모르겠다고 할 수는 없습니다. 그럼 구조체(struct)와 클래스(class) 그리고 이 둘의 차이를 바로 알아 보도록 하겠습니다.

 

구조체(struct)란?

구조체 코드 예시 사진
struct 정의 예시

구조체는 사용자 정의 데이터 유형(Data Type)으로 int, double 등과 같은 기본적으로 제공되는 변수 유형이 아닌 새로운 유형, 여러가지 유형을 사용하기위해 사용자가 직접 만들어 사용됩니다. C#에서 구조체는 일반 변수와 같이 값 형식의 데이터 형식입니다. (클래스는 참조형식)

 

위와 같이 구조체를 정의하려면 struct 문을 사용합니다.struct문은 프로그램에서 두개 이상의 멤버(변수)가 있는 새로운 데이터 형식을 정의합니다.예를들어, 학생이라는 변수를 만들려고할 때 필요한 멤버들은 이름, 학생번호, 나이 등이 있습니다. 

구조체 사용 예시 코드 그림
구조체 사용 예시

C#에서의 구조체는 전통적인 C/C++의 구조체와 상당히 다른점이 존재합니다.C# 구조체에는 다음과 같은 특징들이 존재합니다.

・구조체는 클래스와 같이 메서드, 프로퍼티 등 거의 비슷한 구조를 가지고 있습니다.
・new 연산자를 사용하지 않고 인스턴스화 할 수 있습니다.
・생성자를 선언할 수 있으나 반드시 파라미터가 있어야 합니다.
・메소드, 필드, 속성등을 가질 수 있습니다.
・구조체에 기본(Default) 생성자를 정의할 수 없습니다.
・구조체에 소멸자를 정의할 수 없습니다.
・구조체는 다른 구조체나 클래스의 기본 구조체(상속 불가)가 될 수 없습니다.

구조체는 스택에 바로 할당되기 때문에 가비지 컬렉션이 발생하지 않아서 속도면에서 시스템에 부하를 적게 주나,구조체 내에 변수가 많으면, 크기가 제한적인 스택에 저장되기 때문에, 스택 오버플로우가 발생할 수 있습니다.
변수의 개수가 적으면(3개 정도), 구조체를 사용하면 좋습니다.

(혹시나 스택과 힙에 관해 잘 모르시면,  스택과 힙 내용을 참고하면 좋습니다.)

클래스(class)란?

클래스 소스 코드 예시 그림
클래스 코드

객체지향 언어에서 하나의 프로그램의 단위는 클래스입니다.

클래스는 하나의 사물에 비유할수 있고 데이터타입의 일종입니다.

고유 속성과 행동이 정의된 사물이고 new 키워드로 객체를 생성해야 하나의 생명체(객체)가 됩니다.

​1. C# 생성자
・객체를 생성할때 클래스에 정의된 생성자를 호출해서 객체가 됩니다. 즉, 맨 처음 실행되는 진입점이 됩니다.
・객체를 초기화할때 값을 인자로 넘겨서 초기화합니다.

2. C# 멤버변수 / 속성
・클래스에 정의된 변수를 멤버변수라고 하고 public으로 선언하여 외부에서 접근 가능한 변수를 속성이라 합니다.

3. C# 상수
・ 정해진 숫자값을 정의하고 사용합니다.

​4.C# 함수(메서드)
・ 클래스의 행동을 정의합니다.

5. C# 이벤트
・ 버튼클릭 등 각종 이벤트와 행동을 저의합니다.

6. C# 인덱서
・ 클래스나 구조체의 인스턴스를 배열처럼 인덱싱할 수 있습니다.

7. C# 중첩클래스
・ 클래스 내에 클래스를 중첩해서 선언할 수 있습니다.

​8. C# 종료자
・ 생성자와 반대로 객체가 종료될때 호출이 됩니다.

 

타입 차이(Type)

구조체(struct)는 값 타입(value)
・스택메모리에 생성
・속도 빠름

클래스(class)는 참조 타입(reference)
・힙 메모리에 생성
・상대적 속도 느림
(힙과 스택(heap & stack)에 대한 설명은 링크를 클릭)

'값타입과 참조타입이 대체 뭐지?'라는 생각이 들 수 있습니다. 아래 코드를 통해서 간단히 설명하도록 하겠습니다.

struct 와 class 타입의 차이를 코드로 표시한 사진
struct와 class 타입 실행 결과

구조체(struct)는 함수안에서 1로 변경을 해도 외부 Main에서 값이 변경되지 않습니다. 복사된 데이터는 원본 데이터가 아니기 때문에 복사된 값을 수정하면, 스택에 복사된 값을 변경하게 되는것입니다. (수정한 값은 복사한 struct의 값으로 메소드가 종료되면 사라지게 됩니다.)

 

클래스(class)는 참조타입으로 힙의 주소를 전달하기 때문에 값이 아닌 같은 주소가 참조됩니다. 
그래서 Main으로 출력했을 때, 값이 변경되지 않고 원본값을 출력하는 것 입니다.(변경된 데이터들은 함수가 종료되어도 남아있습니다)

 

 

 

참조 블로그

https://funfunhanblog.tistory.com/96

https://yeolco.tistory.com/141

https://tutorials-korea.tistory.com/5

댓글