저번 함수 포인터에 이어서 구조체에 대해 알아보겠습니다.
구조체는 체감상 다른 언의 객체 같은 느낌입니다.
구조체
구조체는 여러개의 멤버들을 모아 하나의 새로운 자료형을 만드는 것입니다.
정의
형태 | ex) |
기본 구조체 정의) struct 구조체명 { 멤버; }; |
struct coin { double BTC; double ETH; double XRP; }; |
별칭 구조체 정의) typedef struct 구조체명 { 멤버; }; |
typedef struct coin { double BTC; double ETH; double XRP; }co; |
익명 구조체 정의) typedef struct { 멤버; }별칭; |
typedef struct { double BTC; double ETH; double XRP; }co; |
구조체를 정의 하는 방법에는 여러가지가 있습니다.
그런 만큼 선언하는 방법도 여러가지가 있습니다.
이렇게 보면 자바의 객체랑 비슷해보이는데, 함수는 구조체 안에 못들어가는 것이 차이점 같습니다.
선언
형태 | ex) |
기본 구조체 선언) struct 구조체명 구조체변수명; |
struct coin c; |
별칭 구조체 선언) struct 구조체명 구조체변수명; or 별칭 구조체변수명; |
struct coin c; or co c; |
익명 구조체 선언) 별칭 구조체변수명; |
co c; |
접근
형태 | ex) |
멤버 접근) 구조체변수명.멤버 |
c.ETH |
선언 방법, 정의 방법은 그 상황에 따라 나누어져 있는 느낌이고,
접근하는 형태는 같습니다.
확실히 이렇게 보면 자바의 객체와 비슷한데 차이점이라면 구조체에는 함수(메소드)가 들어가지 못한다는 것입니다.
활용하기
그러면 코인들이 모여있는 구조체를 만들어 활용해보겠습니다.
#include <stdio.h>
typedef struct coin {
double BTC;
double ETH;
double XRP;
}co;
int main()
{
struct coin c1;
co c2;
c1.BTC = 3000.5;
c1.ETH = 1500.6;
c2.XRP = 750;
printf("BTC: %.2f\n", c1.BTC);
printf("ETH: %.2f\n", c1.ETH);
printf("XRP: %.2f\n", c2.XRP);
printf("각각 용량: %d %d\n", sizeof(c1), sizeof(c2));
return 0;
}
위 처럼 실행하게되면 코인 변수들을 그때마다 선언 할 필요 없이 구조체 선언으로 한번에 선언이 가능해져 관리하기 편리해집니다.
그럼 한번 실행해보겠습니다.
위와 같은 결과가 나오게 됩니다.
또한 구조체는 멤버들의 집합이기에, 각 멤버들의 크기의 합인 용량을 가지게 됩니다.
구조체 포인터
구조체를 이용한다면 조금 더 주소를 사용하기 편해집니다.
구조체의 주소를 함수에 넘겨주면 함수에서 그 구조체 안에 있는 값에 접근 가능하기 때문입니다.
#include <stdio.h>
typedef struct coin {
double BTC, ETH, XRP;
}co;
void coin(co* c)
{
(*c).ETH += 1000;
c->XRP += 500;
}
int main()
{
co c;
c.ETH = 2000;
c.XRP = 1000;
coin(&c);
printf("ETH: %.2f\n", c.ETH);
printf("XRP: %.2f\n", c.XRP);
return 0;
}
위 코드를 보게 되면 coin() 함수는 구조체 c의 주소를 매개변수로 받고, 함수 안에서 구조체 주소를 통해 각 멤버에 접근하는 모습을 볼 수 있습니다.
우선 실행해서 결과를 봐보겠습니다.
이와 같이 성공적으로 접근 한 것을 확인할 수 있습니다.
이렇게 함수에서 접근하는 방법을 정리해보겠습니다.
형태 | ex) |
(*구조체변수).멤버 | (*c).ETH |
구조체변수->멤버 | c->XRP |
*. == -> | 두개는 같다. |
괄호를 붙여주는 이유는 '.'연산자가 더 우선순위가 높기 때문입니다.
*보다 우선순위 높은 연산자 | 설명 |
. | 도트연산자 |
++, -- | 후위, 전위 증가, 감소 연산자. |
구조체에 대해 알아보았습니다. 거의 이 정도면 C언어의 기본적인 과정은 거의 다 배웠다고 생각이 듭니다.
댓글