Taking baby-developer steps
16. 구조체 - 구조체의 정의와 선언 / 구조체의 변수의 선언과 접근/ 연산자 온점(.) / 구조체 만들기 및 활용 / 더 짧게 구조체 선언하기 / 구조체를 포인터 변수로 사용하기 본문
16. 구조체 - 구조체의 정의와 선언 / 구조체의 변수의 선언과 접근/ 연산자 온점(.) / 구조체 만들기 및 활용 / 더 짧게 구조체 선언하기 / 구조체를 포인터 변수로 사용하기
Surin Lee 2021. 4. 1. 15:09구조체
구조체를 활용해 자료형을 만드는 방법을 공부하고, 구조체를 활용한 다양한 예제를 다룬다.
여러개의 변수를 묶어 하나의 객체를 표현하고자 할 때 구조체를 사용할 수 있다. 캐릭터, 몬스터, 학생, 좌표 등 다양한 객체를 모두 프로그래밍 언어를 이용해 표현할 수 있다.
구조체의 정의와 선언
struct 구조체명 {
자료형1 변수명1;
자료형2 변수명2;
...
};
위와 같은 방법으로 구조체를 정의 및 선언한다. 프로그램에서 요구하는 특성에 맞게 하나의 객체를 정의 할수 있다.
ex) 한 명의 학생에 대한 정보를 담고 있는 구조체
struct Student{
char studentId[10]; //학번, 최대 9자리까지인 문자열
char name[10]; //이름, 최대 9자리인 문자열
int grade; //학년, 정수
char major[51]; //전공, 최대 50자인 문자열
};
구조체의 변수의 선언과 접근
기본적으로, 구조체의 변수에 접근할 때는 온점(.)을 사용한다. 이 온점을 객체 안에 있는 또 다른 객체에 접근할 수 있는 연산자로서 이해하자.
ex)위에서 정의및 선언한 학생 구조체의 변수 s 선언
struct Student s; //구조체 변수 선언
strcpy(s.studentId, "20210001"); //구조체 변수에 접근
strcpy(s.namer, "홍길동");
s.grade = 1;
strcpy(s.major, "화학공학과");
구조체의 변수를 선언 할 때, struct 다음에 Student라는 앞서 정의한 구조체가 하나의 자료형 처럼 쓰인것을 볼 수 있다.
('구조체' 자체가 하나의 자료형이 되는 것이라고 이해하자.)
구조체를 만들어서 활용하기
ex) 학생 구조체를 만들기 / 구조체 변수 선언 / 구조체 내용 출력
#include <stdio.h>
#include <string.h>
struct Student{
char studentId[10];
char name[10];
int grade;
char major[51];
};
int main(void){
struct Student s;
strcpy(s.studentId, "20210001");
strcpy(s.name,"홍길동");
s.grade = 1;
strcpy(s.major, "화학공학과");
printf("%s\n", s.studentId);
printf("%s\n", s.name);
printf("%d\n", s.grade);
printf("%s\n", s.major);
system("pause");
return 0;
}
20210001
홍길동
1
화학공학과
(위의 코드에서, strcpy()로 문자열을 복사한것을 볼 수 있다. 이는, C언어에서는 기본적으로 'a=b'와 같은 간단한 방식으로는 문자열 복사를 할 수 없기 때문이다.)
+현재 메인함수에서 구조체 내용을 출력하는 부분을 함수로 만들면, 구조체 변수의 수가 많을 경우 생산성을 높일 수 있다.
구조체의 정의와 선언법
하나의 구조체 변수만 사용하는 경우, 정의와 동시에 변수를 선언을 할 수도 있다. 이 경우 변수는 전역 변수로 사용된다.
즉, main함수에서 "struct Student s;"이런 구조체 변수 선언 없이 s변수를, Student라는 구조체의 단 하나의 변수로서 최가화 및 사용할 수 있다.
struct Student{
char studentId[10];
char name[10];
int grade;
char major[51];
}s;
빈번하게 사용되는 형태는 아니지만,
- 오직 하나의 변수만 사용할 때
- s라는 변수를 전역변수로 사용하고 싶을 때
위의 경우에 해당하는 경우 사용할 수 있는 방법이다.
구조체의 초기화
구조체의 변수를 한 번에 초기화 하는 방법으로, 중괄호({,})에 차례대로 변수의 값을 넣어 초기화할 수 있다. 이 때, 구조체를 정의 할시에 들어갔던 순서대로 차례대로 들어가야한다.
#include <stdio.h>
#include <string.h>
struct Student{
char studentId[10];
char name[10];
int grade;
char major[51];
};
int main(void){
struct Student s = {"20210001","홍길동",1,"화학공학과"};
printf("학번 : %s\n", s.studentId);
printf("이름 : %s\n", s.name);
printf("학년 : %d\n", s.grade);
printf("학과 : %s\n", s.major);
system("pause");
return 0;
}
학번 : 20210001
이름 : 홍길동
학년 : 1
학과 : 화학공학과
덧붙여, 다음과 같이 전역변수로서 구조체 선언 뒤에 중괄호로 한번에 초기화하는 것도 가능하다.(사용 빈도는 매우 낮다.)
#include <stdio.h>
#include <string.h>
struct Student{
char studentId[10];
char name[10];
int grade;
char major[51];
}s = {"20210001","홍길동",1,"화학공학과"};
int main(void){
printf("학번 : %s\n", s.studentId);
printf("이름 : %s\n", s.name);
printf("학년 : %d\n", s.grade);
printf("학과 : %s\n", s.major);
system("pause");
return 0;
}
학번 : 20210001
이름 : 홍길동
학년 : 1
학과 : 화학공학과
더 짧게 구조체 정의하기
typedef 키워드를 이용하면 임의의 자료형을 만들 수 있으므로, 선언이 더 짧아진다.
#include <stdio.h>
typedef struct Student{
char studentId[10];
char name[10];
int grade;
char major[51];
}Student;
int main(void){
Student s = {"20210001","홍길동",1, "화학공학과"};
printf("학번 : %s\n", s.studentId);
printf("이름 : %s\n", s.name);
printf("학년 : %d\n", s.grade);
printf("학과 : %s\n", s.major);
system("pause");
return 0;
}
학번 : 20210001
이름 : 홍길동
학년 : 1
학과 : 화학공학과
typedef 키워드를 이용하면, main함수에서 구조체의 변수를 선언 할 때, (struct 없이) 구조체의 이름 뒤 변수 이름을 넣어 선언할 수 있다.
더 짧게 구조체 정의하기
최근에는 익명 구조체의 개념이 등장하여, 구조체 이름 부분을 비워 놓아도 된다.
#include <stdio.h>
typedef struct { //이 부분에 있던 구조체의 이름을 생략할 수 있다.
char studentId[10];
char name[10];
int grade;
char major[51];
}Student;
int main(void){
Student s = {"20210001","홍길동",1, "화학공학과"};
printf("학번 : %s\n", s.studentId);
printf("이름 : %s\n", s.name);
printf("학년 : %d\n", s.grade);
printf("학과 : %s\n", s.major);
system("pause");
return 0;
}
구조체 포인터 변수에 접근하기
구조체가 포인터 변수로 사용되는 경우, 내부 변수에 접근 할 때 화살표(->)를 사용한다.
("'주소'에 접근해서, 각 값을 바꾸겠다"는 의미로, 화살표를 사용하는 것)
#include <stdio.h>
#include <string.h>
typedef struct {
char studentId[10];
char name[10];
int grade;
char major[51];
}Student;
int main(void){
Student *s = malloc(sizeof(Student));
strcpy(s->studentId,"20210001");
strcpy(s->name,"홍길동");
s->grade = 1;
strcpy(s->major,"화학공학과");
printf("학번 : %s\n", s->studentId);
printf("이름 : %s\n", s->name);
printf("학년 : %d\n", s->grade);
printf("학과 : %s\n", s->major);
system("pause");
return 0;
}
학번 : 20210001
이름 : 홍길동
학년 : 1
학과 : 화학공학과
요약
- 구조체는 C언어의 고급문법과 떼려야 뗄수 없는 부분이다. 완전히 이해하고 넘어가야한다.
- 구조체는 현실 세계의 객체(학생, 캐릭터, 몬스터, 자동차 등등)를 소스 코드 상에서 매우 쉽게 표현 할 수 있도록 한다.
- 여러개의 변수 자체가 하나로 모여서, 일종의 '특성'을 구성하는 '구조체'를 만들 수 있다.