[C++] 06 구조체(Struct), 클래스(Class), 공용체(Union)

김진우·2025년 5월 13일

C++

목록 보기
6/16
post-thumbnail

정의

여러 자료형의 변수 또는 함수를 묶어서 사용하기 위해 사용하기 위해 사용자가 직접 타입을 정의할 수 있는 구조이다.
C++에서 두 개는 근본적인 차이가 없다. microsoft 공식 문서에서도 동일하다고 설명이 되어 있다.

그럼에도 구분을 하는 이유는 기본 선언 시 정보은닉 범위가 다르기 때문이다. 즉, 기본 선언되는 접근제한자(public, private)의 차이가 있다.

또한, C++ 이외의 프로그래밍 언어에서는 구조체와 클래스를 다르게 보는 경우가 있다. 예를들어 Unreal C에서는 구조체에 상속이 불가능하기 때문에 서로를 명확히 구분한다.

소프트웨어 개발 패러다임이 절차지향 -> 정보공학 -> 객체지향으로 발전함에 따라 각각 절차지향은 함수, 정보공학은 구조체, 객체지향은 함수와 구조체를 합친 클래스의 개념이 생기게 되었다.
구조체와 클래스는 초기에 명확히 구분되는 개념이었지만, 지금은 서로의 장점이 상호보완적으로 발전해서 비슷한 기능을 가지게 된 것이다.

Struct

struct키워드를 이용해 선언한다.

	struct St {
    	int a;
        float b;
        void Print() {
        }
    }
    
    St st;

서로 다른 자료형의 배열을 선언할 수 있으며 함수도 선언할 수 있다.
접근지정자를 선언하지 않으면 기본적으로 멤버변수들이 public이기 때문에 st.a = 10;와 같이 어디서든 접근이 가능하다.

Class

class키워드를 이용해 선언한다.

	class Cl {
    public:
        int a;
        float b;
        void Print() {
        }
    }
    
    Cl cl;

Struct와 크게 다르지 않다. 다만, 이번에는 접근제한자를 선언해줬다. 물론 Struct에서도 선언이 가능하고 Class에서 접근제한자를 명시하지 않아도 된다.

만약, 접근제한자를 명시하지 않거나 private으로 할 경우 외부에서 접근이 불가능한데, 이것은 객체를 생성한 인스턴스에서 직접 접근(cl.a = 10;)와 같은 형태로 접근이 불가능하고 Class 선언시 함수를 추가해서 멤버변수에 접근을 해야 한다는 뜻이다.

Union

Struct처럼 요소들을 순서대로 묶지만, 하나의 메모리로 사용하기 위해 생긴 자료구조이다.
Struct는 메모리상에서 연속적인 공간에 할당이 되는데, 그 공간에 이름을 하나 더 붙여 사용하는 개념이다.

	struct St {
		union{
          struct{
          	float a, b;
          	float c, d;
          }
          
          float s[4];
          float t[2][2];
      	}
    }
    
    St st;

다음과 같이 선언되어 있을 때 union 안의 struct, 배열 s, 2차원 배열 t는 모두 float 크기(4Byte) * 변수의 개수(4) = 16Byte의 크기를 가지고 있기 때문에 메모리상의 16Byte 공간을 같이 사용하게 된다.
즉, st.a = st.s[0] = st.t[0][0]이 같은 공간이 된다. 실제로 주소를 출력해보면 세가지 모두 같은 것을 볼 수 있다. 마찬가지로 다음 주소, 그 다음 주소도 같은 공간임을 확인할 수 있다.

만약 서로 다른 자료형이 선언된다면, 그 중 가장 큰 자료형의 크기만큼만 메모리가 할당된다.

0개의 댓글