LetITGo
c언어 - 구조체 Structure, 구조체 배열에 대해서 알아봅시다. 본문
오늘은 구조체(Structure)에 대해서 알아보겠습니다.
구조체는 여러 변수를 하나로 묶어서 하나의 정보로 통합하는 형태를 의미합니다.
예시처럼 한 학생의 정보에 이름, 학번, 성적이 포함되어 있다고 할 때 3가지를 한꺼번에 묶은 것이 구조체가 될 수 있습니다.
구조체는 내부에 같은 형태, 예를 들면 정수, 실수, 문자열 등 같은 형태의 정보도 담을 수 있지만, 예시처럼 다른 형태의 정보들도 담을 수 있습니다.
구조체는 예시처럼 선언합니다. struct 라고 적고 student는 구조체의 태그(tag)라고 불리며 name, number, grade는 구조체의 멤버(member)입니다.
구조체를 선언한다고 하여서 변수를 선언하는 것이 아닙니다. 구조체는 그냥 정보의 틀만 구성한 것이며 변수는 따로 지정해줘야 합니다.
먼저 student라는 구조체를 선언해줬으며 이 구조체에는 이름을 나타내는 문자열, 학번이라는 정수, 성적이라는 실수가 포함되어 있습니다.
메인 함수에서는 S1이라는 구조체 변수를 선언해주었습니다. S1이라는 변수 내부에도 이름, 학번, 성적 정보가 포함된 것입니다.
구조체 변수는 중괄호로 초기화시켜줍니다. S1의 이름은 Kim이며 학번은 17이고 학점은 4.0입니다.
구조체 변수의 멤버들을 참조하기 위해서는 ' . ' 을 이용하여야 합니다.
S1.name이라고 하면 S1의 이름을 참조하게 됩니다.
struct student{
char name[10];
int number;
float grade;
}
Int main (){
struct student S1 = {Kim, 17, 4.0};
}
strcpy(S1.name, “KIM”);
S1.number = 17;
S1.grade = 4.0;
만약 같은 구조체가 반복될 때 S1, S2, S3와 같이 학생 수만큼 변수를 선언하는 것은 매우 비효율적입니다. 그래서 배열의 원리를 적용하여 구조체 배열이라는 것을 이용하면 됩니다.
예시를 보면 학생 정보를 담은 구조체를 메인 함수 전에 만들었습니다. 그런 후 메인 함수에서는 30명의 구조체 정보를 가지고 있는 list라는 배열을 만들었고 list의 1번에 Kim, 17, 4.0이라는 정보를 가지게 참조하였습니다.
struct student{
char name[10];
int number;
float grade;
}
int main(){
struct student list[30];
strcpy(list[1].name, “Kim”);
list[1].number = 17;
list[1].grade = 4.0;
…
}
구조체를 선언하고 메인 함수에서 구조체 변수를 또 선언 하는 것을 줄여서 typedef라는 것을 이용하여 구조체 선언과 구조체 변수의 생성을 한 번에 할 수 있습니다.
먼저 typedef 이후에는 내용이 같고 중괄호를 닫고 간단히 불러줄 이름을 지정합니다. 저는 그대로 student라고 지정하였습니다. 메인 함수에서 변수를 선언할 때 struct라고 다 적지 않아도 되고 student s1만 적으면 구조체 변수가 생성된 것입니다.
struct student{
char name[10];
int number;
float grade;
}
struct student s1;
-----------------------------------------------------
typedef struct student{
char name[10];
int number;
float grade;
} student;
student s1;
그럼 구조체는 대입과 비교를 할 수 있는지에 대해서 알아보겠습니다.
구조체를 대입할 때는 그냥 =만 이용하면 대입할 수 있습니다.
그럼 비교는 가능할까요?
typedef struct student{
char name[10];
int number;
float grade;
} student;
int main(){
student s1, s2;
strcpy(s1.name, “KIM”);
s1.number = 17;
s1.grade = 4.0;
s2 = s1;
}
비교는 불가능합니다. s1과 s2에는 많은 멤버들이 있는데 무엇을 비교하는지 알 수 없기 때문입니다. 만약 정확한 멤버들을 비교해준다면 오류가 발생하지 않을 것입니다.
typedef struct student{
char name[10];
int number;
float grade;
} student;
int main(){
student s1, s2;
strcpy(s1.name, “KIM”);
s1.number = 17;
s1.grade = 4.0;
if(s1 > s2){
printf(“s1의 성적이 더 뛰어납니다.”);
}
}
지난번에 배운 포인터도 중요해요!
2020/08/28 - [전공지식/자료구조 와 알고리즘] - C언어 포인터 Pointer에 대해 알아봅시다
'전공지식 > 자료구조와 알고리즘' 카테고리의 다른 글
C언어 자료구조 List(1) - 리스트(List)란 무엇인가? (0) | 2020.08.31 |
---|---|
C언어 구조체와 포인터의 적용, 동적 메모리 할당을 하는 이유는? (0) | 2020.08.30 |
C언어 포인터 Pointer에 대해 알아봅시다 (0) | 2020.08.28 |
자료구조 - C언어 순환, Recursion에 대해 알아보자 (예제, 문제포함) (0) | 2020.08.27 |
자료구조 - C언어 조건문에 대해 알아봅시다 (if, else if, 중첩 if, switch ) (0) | 2020.08.26 |