본문 바로가기
C++/기초

C++ 기초 : 구조체

글: 시플마 2024. 3. 3.

C와 C++에서는 구조체(Struct)라는 키워드를 제공합니다.

구조체는 사용자 정의 자료형을 만드는 것입니다.

 

문법을 알아보죠.

 

위 코드에서 _tagMyST 부분이 구조체(Struct)입니다.

 

 


 

 

 

구조체는 사용자 정의 자료형을 만드는 것이라고 하였는데,

자료형은 뭘까요? 바로 데이터 타입이죠? 

즉 구조체는 사용자가 임의로

선언하는 데이터 타입이며 크기가 있을 겁니다. 

 

확인해 보죠.

 

구조체를 만든 부분 끝에 'MYST'가 구조체의 이름입니다.

사용할 때는 MYST 키워드를 자료형으로 생각하고 사용하면 됩니다.

 

main 함수에서 MYST형 변수 ms를 선언해줬습니다.

 

그리고 sizeof 함수를 사용해서 변수 ms의 크기를 얻었습니다.

sizeof 함수는 소괄호 안에 변수명을 넣으면

해당 변수의 크기를 반환 (Byte 기준으로) 해 주는 함수입니다.

sizeof 함수를 통해 반환받은 값을 변수 sizeCheck에 넣습니다.

이후 디버깅을 통해 sizeCheck의 값을 확인해 보면

8(Byte)가 들어가 있는 것을 확인할 수 있습니다.

 

먼저 정의했던 구조체 MYST는

int형 하나와 float형 하나로 구성되었습니다.

각각 4Byte의 자료형이므로 총 8Byte입니다.

그래서 우리가 새로 정의한 MYST이라는 자료형은

8Byte 자료형으로 인식되는 것이죠.

 

 

참고로 

typedef int INT:

 

이런 식으로 원래 있던 자료형을 이용하여

재정의해 줄 수 있습니다. 

 

 

위에서 작성한 재정의로 인해

int main()
{
  int a = 0;
  INT b = 0;
}

 

int형 변수를 선언할 때

대문자로 INT를 써도 인식할 수 있게 되겠죠.

 

 

 


 

 

 

구조체도 배열처럼 중괄호를 통해서 초기화합니다.

 

구조체를 만들 때 먼저 int형 하나,

다음에 float형 하나로 구성해줬습니다. 

 

그래서 초기화한 순서대로 값이 들어갈 것을 확인할 수 있습니다.

 

 


 

 

 

MYST형 변수 ms 안에 있는 int형 a와 float형 f에 접근하려면 

ms 옆에 점을 붙이고 접근하고자 하는 변수명을 쓰면 됩니다.

 

 

ms 안에 있는 int형 a에는 100을,

ms 안에 있는 float형 f에는 123.123을 대입했습니다.

 

f에는 분명 123.123을 대입했는데

123.123001이 대입된 것을 확인할 수 있습니다.

컴퓨터에서 실수는 소수점 자리마다 더하며

원하는 숫자에 가까운 값을 찾기 때문에

약간의 오차가 발생합니다.

 

이를 인지하고 디버깅을 통해 ms를 

확인해 보니 값이 잘 대입되었네요.

 

 


 

 

 

7번째 줄에서 정의된 구조체를 봅시다.

BIG 구조체 안에 MYST 구조체가 들어가 있죠?

 

이처럼 새로 구조체를 정의할 때,

기존에 정의된 구조체를 넣어서 정의할 수 있습니다.

 

 


 

 

그런데 자세히 보면

구조체 정의하는 부분 가장 앞에 

typedef라는 키워드가 붙습니다.

이는 Type Define을 의미하며 자료형을 재정의할 때 

별명을 붙여줄 수 있게 하는 키워드입니다.

그 별명은 구조체 끝부분에 써 줍니다.

 

그럼 왜 번거롭게

구조체 이름도 따로 정해줬는데

끝부분에 또 별명을 붙이는 걸까요?

 

그 이유를 알려면

C 언어에서 작동하는 것을 봐야 합니다.

 

이를 위해서

 

우측 상단에 있는

'솔루션 탐색기'에서

현재 작성 중인 파일을 우클릭하고 (저는 'main.cpp'라는 이름의 파일입니다.)

'속성'을 누릅니다.

 

'C/C++'을 누르고

'고급'을 클릭, 컴파일 옵션에서

"C 코드로 컴파일(/TC)"를 클릭합니다.

 

이후 '적용'과 '확인'을 차례대로 눌러 창을 닫습니다.

 

 

 

이제 코드로 돌아와서

 

위 코드를 

 

 

아래 코드처럼 바꾸겠습니다.

 

 

 

그리고 main 함수에서

 

_tagMyST라는 구조체를 통해 

변수 ms를 선언하려고 하면 오류가 발생합니다.

 

 

왜 인식하지 못하는 것일까요?

 

C 언어 문법에서는 

구조체 이름만 사용해서 사용할 수 없었습니다.

 

 

정의한 구조체를 사용하려면

아래와 같이

 

Struct 키워드를 붙여 구조체임을 명시해 주어야 했죠.

 

 

근데 이 Struct 키워드를 매번 붙이는 것이

번거롭습니다. 그래서 아래와 같이

 

애초에 구조체를 정의할 때,

바로 사용할 수 있도록

typedef를 사용하여 별명을 붙여두는 것이죠.

 

typedef를 사용하여 붙여둔 별명인

'MYST'를 자료형으로 변수를 선언하자

struct 키워드를 사용하지 않아도 잘 작동하네요.

 

 

근데 이 방법도 효율이 좋아 보이진 않습니다.

그래서 C++ 언어 문법에서는 

struct 키워드를 붙이지 않아도

구조체를 바로 사용할 수 있게 개선되었습니다.

 

 

정말 개선되었는지 확인해 봅시다.

위에서 바꾼 컴파일 옵션을 다시 기본값으로 되돌려 놓고,

 

위 코드처럼 작성한 후 실행해 보면

오류가 발생하지 않는 것을 볼 수 있습니다.

C++ 문법에서는 정의한 구조체 이름으로 

바로 사용할 수 있도록 개선되었네요.

 

 


 

 

 

그럼에도 typedef 키워드로 별명을 붙여

구조체를 사용하는 경우가 있습니다.

 

나의 환경이 C++ 환경이라 typedef 키워드를

사용하지 않고 구조체를 정의하고 사용하면

C 언어 환경에서 오류가 발생하기 때문입니다.

 

내가 작성한 코드가 어떤 환경에서 사용될지 모르기 때문에

C 또는 C++ 환경에서 모두 사용할 수 있도록 typedef 키워드를 붙여

구조체를 정의하고 사용하기도 합니다.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB


 

 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 분할 구현  (0) 2024.03.06
C++ 기초 : 지역 변수 / 전역 변수  (0) 2024.03.05
C++ 기초 : 배열  (0) 2024.03.02
C++ 기초 : 재귀 함수 (2)  (0) 2024.03.01
C++ 기초 : 재귀 함수 (1)  (0) 2024.02.27