본문 바로가기

C

([C언어] 18강) 구조체

 

이번 강좌에서는 구조체에 관해 배울것입니다

 

구조체란 쉽게 말하면 몇가지의 변수를 하나로 묶어 새로운 타입을 만들어 내는것이라고

 

설명할 수 있겠네요!

 

구조체를 만드는법은 다음과 같습니다

struct 구조체이름
{
//구조체의 내부 변수들 목록
};

이렇게 해주면 됩니다!

 

다만 구조체는 함수 내에 만드는게 아닌 함수 밖에

 

만들어주셔야하고,

 

우리 절차지향 프로그래밍 얘기때 했었던 말처럼

int main()
{
//여기서는 구조체 a 사용 불가능
}

struct a
{
};
struct a
{
};

int main()
{
//여기서는 구조체 a 사용가능
}

이거 꼭 기억해주세요!

 

구조체는 모든 함수에서 공통적으로 알아야 할것이라고 생각하고

 

그러므로 함수의 바깥쪽에 선언해야하는겁니다.

 

그럼 구조체 Student를 만들어보겠습니다.

 

Student는 학생이라는 뜻으로

 

Student라는 것의 내용으로는 학번, 이름, 나이, 학년, 반, 번호 정도가 있겠네요!

 

그럼 Student 구조체를 만들어보죠!

 

#include <stdio.h>

struct Student
{
    int id; //학번
    char * name; //이름
    int level; //학년
    int classNumber; //반
    int number; //번호
    int age; //나이
};

int main()
{
}

이렇게 할 수 있겠네요!

 

자 그럼 Student형 변수를 만들어보겠습니다

 

#include <stdio.h>

struct Student
{
    int id; //학번
    char * name; //이름
    int level; //학년
    int classNumber; //반
    int number; //번호
    int age; //나이
};

int main()
{
    struct Student a;
}

이렇게 하면 Student형 변수 a가 만들어집니다만,

 

안에 있는 학번, 이름, 학년 등등에는 초기값인 쓰레기값이 들어있겠죠!

 

할당을 해준적이 없으니까요!

 

이제 할당을 한번 해볼게요

 

0학번 1학년 1반 1번 20살 잭클 의 구조체 Student형 변수 a를 만들어볼게요!

 

#include <stdio.h>

struct Student
{
    int id; //학번
    char * name; //이름
    int level; //학년
    int classNumber; //반
    int number; //번호
    int age; //나이
};

int main()
{
    struct Student a;
    a.id = 0;
    a.name = "잭클";
    a.level = 1;
    a.classNumber = 1;
    a.number = 1;
    a.age = 20;
}

오류없이 잘 실행 되네요! 구조체 내부의 값을 쓰고싶을땐 구조체 이름 뒤에 .을 붙히면 돼요!

 

근데 저는 구조체를 쓸때마다 저렇게 struct라는 글을 붙혀주는게 너무 귀찮아요..

 

그래서 조금 더 편하게 바꿔볼게요!

 

typedef라는 기능을 쓰면 더 쉽게 할수있어요!

 

#include <stdio.h>

typedef struct student
{
    int id; //학번
    char * name; //이름
    int level; //학년
    int classNumber; //반
    int number; //번호
    int age; //나이
}Student;

int main()
{
    Student a;
    a.id = 0;
    a.name = "잭클";
    a.level = 1;
    a.classNumber = 1;
    a.number = 1;
    a.age = 20;
}

이렇게 쓸 수 있는데요! 해석해보자면

 

나는 구조체 student를 만들었고 내용은 아래에 있어!

 

그리고 나는 이 student구조체를 통틀어서 Student타입이라고 부를거야!

 

라고 정해주는겁니다

 

구지 struct라는 글을 안써줘도 되게 되니 더 편하겠죠??

 

자 그럼 이번에는 조금 다른 방법으로 함수를 이용해보겠습니다!

 

콜 바이 레퍼런스에 대해서 배웠죠???

#include <stdio.h>

typedef struct student
{
    int id; //학번
    char * name; //이름
    int level; //학년
    int classNumber; //반
    int number; //번호
    int age; //나이
}Student;

void StudentSetting(Student * s)
{
    s->id = 0;
    s->name = "잭클";
    s->level = 1;
    s->classNumber = 1;
    s->number = 1;
    s->age = 20;
}

int main()
{
    Student a;
    StudentSetting(&a);
}

이렇게 할 수 있습니다!

 

어라? 구조체 내부의 값을 이용할땐 .으로 접근하는거 아니였나요?

 

포인터일때는 다릅니다

 

우리가 int * 형인 변수 a를 쓸때 그 내부의 값을 쓰기위해선

 

*a = 3; 이런식으로 했던거 기억 나시나요?

 

그것처럼 Student * 형인 변수 s의 값 age에 접근하기 위해선

 

(*s).age = 20; 이렇게 해줘도 되지만

 

이것을 간단하게 s->age = 20; 이렇게 사용할수 있도록 돼있습니다!

 

이제 구조체 마음껏 사용할수 있겠죠?

 

구조체는 방금처럼 여러가지 내용을 한개의 카테고리로 묶을수 있을때

 

자주 사용 됩니다! 외워주세요~

 

오늘은 여기까지 하고 예시 하나만 보여드리면서 18강 마치도록 하겠습니다! 수고하셨습니다!

 

#include <stdio.h>

typedef struct student
{
	int id; //학번
	char* name; //이름
	int level; //학년
	int classNumber; //반
	int number; //번호
	int age; //나이
}Student;

void StudentSetting(Student* s)
{
	(*s).id = 0;
	s->name = "잭클";
	s->level = 1;
	(*s).classNumber = 1;
	s->number = 1;
	s->age = 20;
}

int main()
{
	Student a;
	StudentSetting(&a);
	printf("----학생정보----\n");
	printf("학번 : %d\n", a.id);
	printf("학년 : %d\n", a.level);
	printf("반 : %d\n", a.classNumber);
	printf("번호 : %d\n", a.number);
	printf("이름 : %s\n", a.name);
	printf("나이 : %d\n", a.age);
	printf("----------------");
}