본문 바로가기

컴퓨터 언어

[C#] 구조체와 클래스

C# 에서의 구조체와 클래스는 C++ 에서의 구조체, 클래스와 많은 차이를 지닌다. C++에서 구조체는 접근 제어 지시자로 public을 갖고 클래스는 private을 갖는데 이는 목적의 차이가 있기 때문이다.

 

클래스는 기본적으로 객체를 생성하기 위한 설계도로써 사용되어 정보 은닉을 추구하고  내부 구현 정보를 외부에서 접근할 수 없도록 보호할 필요성, 즉 캡슐화의 필요성이 존재하기 때문에 기본적으로 접근 제어 지정자로 private를 갖는다.

 

반면 구조체는 단순히 데이터의 집합으로써 사용되었으며 이 데이터에 대해 자유로운 접근이 필요하기 때문에 기본 접근 제어 지정자가 public으로 되어 있다.

(C언어의 상위 호환 격인 C++에서 구조체를 도입할 때의 C언어와의 호환성 또한 유지해야했기에 public으로 설정했다는 이유도 있다고 한다.)

 

그렇다면 C# 에서의 구조체와 클래스의 특징과 차이는 어떤 점이 있을까

 

1) 구조체

 

C#에서의 구조체는 기본적으로 스택에 할당되고 값 형식으로 취급 되기 때문에 참조를 통한 접근보다 더 빠르고 효율적으로 처리된다. 이는  메모리를 더 효율적으로 사용하고 작은 크기의 데이터를 처리할 때 성능적으로 더 이점이 있다는 것을 뜻한다.또한 값 형식으로 취급 되는 것은 원본에 대한 참조가 이루어지지 않기 때문에 값이 변수에서 다른 변수로 복사될 때 해당 값의 복사본이 생성된다. 이는 값 형식의 특성으로 변수 간에는 별개의 값이 유지된다.

 

스택에 할당된다는 것은 힙에서 작동하는 가비지 컬렉터의 영향을 받지 않는다는 것을 뜻하고 이는 메모리 관리가 보다 프로그래머에 의해 직접적으로 이루어진다는 것을 뜻한다. 따라서 개인의 관리에  따라 프로그램의 메모리 사용을 최적화 하고 프로그램의 실행 속도 또한 향상 시킬 수 있다.

 

마지막으로 구조체는 상속을 지원하지 않는다. 간단한 데이터 구조를 표현하고 데이터의 집합으로써 사용하고자 하는 구조체의 설계 목적과 상속 관계에서 발생하는 메모리 할당, 성능 이슈 등을 미루어 볼 때 구조체가 상속에 적합하지 않기 때문이다. 상속이 안되기 때문에 하위 단계에서의 구현이 필요한 가상 함수 또한 사용할 수 없다.

 

값이 복사되는 값 타입의 특성 때문에 값이 그대로 유지된다.

 

값 형식이라도 ref 를 붙여 참조로 전달 시킬 수 있다.

2) 클래스

 

 클래스 (class)

 

C#에서의 클래스는 기본적으로 객체 지향 프로그래밍에서 객체를 만들기 위한 설계도로 사용되며 이를 통해 만들어진 객체를 인스턴스라고 한다.

 

클래스는 힙 영역에 할당되고 참조 형식으로 취급된다. 이 뜻은 해당 변수가 실제 객체가 있는 힙 메모리에 할당되고  변수가 객체를 직접 포함하는 것이 아니라 객체에 대한 메모리 주소가 변수에 할당된다는 것을 뜻한다.

C++로 따지자면 포인터 변수가 변수에 할당되는 것을 뜻하는데 메모리 주소 값을 가지는 포인터 변수를 들여다 보면 해당 주소에 있는 변수의 값을 참조할 수 있기 때문에 c#도 이와 마찬가지로 해당 변수의 값을 참조하는 식으로 실제 객체에 접근할 수 있게 된다. 따라서 변수 간에 객체가 공유되며, 한 변수에서 객체의 상태를 변경하면 다른 변수에서도 동일한 변경 사항을 볼 수 있다.

 

힙에 위치한 클래스는 가비지 컬렉터에 의해 동적 할당에 대한 메모리 관리를 받게 된다.

 C++에서는 사용자가 직접 메모리 할당과 해제를 담당함으로써 메모리 관리의 모든 부분을 직접 해야 했지만 C#의 클래스는 가비지 컬렉터가 자동적으로 메모리를 관리하고 사용하지 않는 메모리를 감지하여 해제하므로 메모리 누수를 방지한다. 또한 가비지 컬렉터는 메모리 누수와 관련된 문제를 방지하고 메모리 접근 오류를 줄여주기 때문에 안정성 또한 높여준다.

 

마지막으로 클래스에서는 가상 함수와 상속을 사용하여 객체 지향 프로그램의 특성인 다형성을 구현할 수 있다.

이를 통해 여러 클래스가 동일한 인터페이스를 공유하면서 각 클래스가 독립적인 구현을 할 수 있다.

 

 

'컴퓨터 언어' 카테고리의 다른 글

[C#] 델리게이트와 이벤트  (0) 2023.11.10
[C#] 인터페이스  (0) 2023.11.07
[C++] 다형성, 추상성  (0) 2023.11.04
[C++] OOP - 캡슐화, 상속  (0) 2023.11.01
[C++] 반복문과 연습  (0) 2023.10.31