본문 바로가기
c언어

c언어 구조체의 활용 방법 알아보기

by 개발자 L 2023. 1. 26.
반응형

c언어 구조체의 활용 방법 알아보기

네 안녕하세요, 이번 포스팅에서는 구조체를 활용하는 방법들에 대하여 알아보도록 하겠습니다.

저번 포스팅에서는 구조체의 기본 선언 및 사용법을 익혔는데요,

실제로 어떤 식으로 활용을 하는 지도 알아야겠죠?

그래서 그 부분에 대하여 같이 알아보고자 합니다.

그럼 지금부터 같이 보시죠.

 

1. 구조체를 멤버로 가지는 구조체

우리가 이전 포스팅에서 다뤘던 구조체의 특징 중 하나가 어떤 자료형을 쓰더라도 구조체의 변수가 될 수 있다는 겁니다.

심지어 포인터조차도 구조체의 멤버가 될 수 있습니다.

그렇기 때문에 구조체 역시도 구조체 안에 포함을 시킬 수 있습니다.

예를 들자면 이런 식으로 말이죠.

어떤 학생의 정보를 우리가 구조체에 입력을 한다고 가정을 해봅시다.

해당 학생의 학번, 이름, 생년월일, 성적 등이 들어갈 수 있겠죠?
그런데 이 중에서 생년월일의 경우 년, 월, 일을 다 따로 써주는 것이 훨씬 편합니다.

그렇기 때문에 이를 3개로 분리를 해야 하는데, 이걸 하나의 구조체에 써도 되지만,

그렇게 될 경우에는 구조체 변수가 너무 길어져서 가독성이 떨어지므로,

아예 구조체를 하나 더 만들어서 학생 정보 구조체 안에 학생의 생년월일 구조체를 멤버로 넣어주는 것이 더 좋습니다.

이런 식으로 말이죠.

struct date
{
    int year;
    int month;
    int day;
};

struct student
{
    int number;
    char name[50];
    struct date dob; // date of birth
    double grade;
};

struct student s1;

이런 식으로 쓸 수 있고, 변수 선언 방법은 그냥 구조체를 참조하기 위해 변수를 선언하는 방법과 똑같습니다.

이렇게 쓰면 코드 줄이 줄어들기 때문에 훨씬 가독성이 좋아집니다.

그리고 이 구조체 안에 있는 구조체 멤버 변수를 쓰려면 이런 식으로 쓰면 됩니다.

s1.dob.year = 1999;
s1.dob.month = 4;
s1.dob.day = 25;

구조체 멤버 변수를 포함하고 있는 구조체의 변수를 먼저 적어주고,

구조체 멤버 연산자인 온점(.)을 써서 구조체 멤버 변수를 포함하고 있는 구조체 변수와 구조체 멤버 변수,

그리고 구조체 멤버 변수 안에 있는 변수명을 구분 지어 선언을 해주면 됩니다.

반응형

 

2. 구조체 변수의 대입과 비교

일반적인 자료형의 변수들로는 대입 및 비교 연산이 가능합니다.

그렇다면 구조체로도 연산이 가능할까요?

결론을 먼저 말씀드리자면,

구조체는 구조체를 다른 구조체에 대입을 하는 것은 가능하지만, 구조체 변수끼리 비교를 하는 것은 안됩니다.

구조체의 대입은 구조체 자체를 통으로 복사를 해서 대입을 합니다.

그래서 일반 자료형을 쓰는 것보다 훨씬 편리하고 시간도 절약이 됩니다.

하나의 예를 들어보도록 하겠습니다.

어떤 좌표를 연산을 한다고 가정을 해봅시다.

그렇다면 이런 식으로 할 수 있겠죠?

struct point
{
    int x;
    int y;
};

struct point p1 = {10, 20};
struct point p2 = {20, 30};

이렇게 쓸 수가 있는데,

이제 여기서 하나의 구조체를 다른 구조체로 대입하여 연산을 하는 것이 가능합니다.

예를 들어 'p1 = p2'라 하여 둘이 같다고 하면, 이 둘의 좌표값이 같아집니다.

이런 식으로 쓰는 방법은 두 가지입니다.

// 방법 1
p1 = p2;

// 방법 2
p2.x = p1.x;
p2.y = p1.y;

이런 식으로 직접 같다고 선언을 해도 되고,

구조체 연산자를 써서 나타내도 됩니다.

그럼 앞서 안된다던 비교는 어떤 식으로 할 수 있을까요?
비교는 단순히 구조체 변수끼리 비교하는 것만 허용이 되지 않고,

구조체 멤버마다 별도의 수식을 써서 비교를 할 수는 있습니다.

이렇게 말이죠.

// 잘못된 방법
if(p1 == p2)
{
    printf("p1과 p2가 같습니다.");
}

// 올바른 방법
if((p1.x == p2.x)&&(p1.y == p2.y))
{
    printf("p1과 p2가 같습니다.");
}

이렇게 각각의 멤버마다 비교를 하면 비교 연산 역시 가능해집니다.

 

지금까지 구조체를 활용하는 방법에 대하여 알아보았습니다.

다음 포스팅에서는 구조체의 배열에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글