본문 바로가기
Coding/C

C언어 - 구조체

by ZaRi 2023. 5. 30.

 

 저번 함수 포인터에 이어서 구조체에 대해 알아보겠습니다.

 구조체는 체감상 다른 언의 객체 같은 느낌입니다.

 


 

구조체

 구조체는 여러개의 멤버들을 모아 하나의 새로운 자료형을 만드는 것입니다.

 

 

 

정의

형태 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;
}

 

 

위 처럼 실행하게되면 코인 변수들을 그때마다 선언 할 필요 없이 구조체 선언으로 한번에 선언이 가능해져 관리하기 편리해집니다.

 

 그럼 한번 실행해보겠습니다.

 

 

 

BTC:3000-이-출력됨.
ETH:1500.6-이-출력됨.
XRP:750-이-출력됨.
각각-용량:24-24가-출력됨.
결과1

 

위와 같은 결과가 나오게 됩니다.

또한 구조체는 멤버들의 집합이기에, 각 멤버들의 크기의 합인 용량을 가지게 됩니다.

 

 

 

구조체 포인터

구조체를 이용한다면 조금 더 주소를 사용하기 편해집니다.

구조체의 주소를 함수에 넘겨주면 함수에서 그 구조체 안에 있는 값에 접근 가능하기 때문입니다.

 

 

 

#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의 주소를 매개변수로 받고, 함수 안에서 구조체 주소를 통해 각 멤버에 접근하는 모습을 볼 수 있습니다.

 우선 실행해서 결과를 봐보겠습니다.

 

 

ETH:3000-이-출력됨.
XRP:1500-이-출력됨.
결과2

 

이와 같이 성공적으로 접근 한 것을 확인할 수 있습니다.

 

이렇게 함수에서 접근하는 방법을 정리해보겠습니다.

 

 

형태 ex)
(*구조체변수).멤버 (*c).ETH
구조체변수->멤버 c->XRP
*.   ==   -> 두개는 같다.

 

괄호를 붙여주는 이유는 '.'연산자가 더 우선순위가 높기 때문입니다.

 

 

*보다 우선순위 높은 연산자 설명
. 도트연산자
++, -- 후위, 전위 증가, 감소 연산자.

 

 


 구조체에 대해 알아보았습니다. 거의 이 정도면 C언어의 기본적인 과정은 거의 다 배웠다고 생각이 듭니다.

댓글