일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 해시테이블
- 브라우저
- 코딩테스트
- 배열
- C
- 연결 리스트
- 프론트엔드
- 포인터
- 타입스크립트
- 알고리즘
- GraphQL
- vue3
- 컨테이너
- 이진탐색
- Machine Learning
- APOLLO
- 자바스크립트
- 웹팩
- pytorch
- 큐
- 릿코드
- 스택
- RT scheduling
- cors
- alexnet
- RxJS
- 연결리스트
- 프로그래머스
- 자료구조
- 프로세스
- Today
- Total
프린세스 다이어리
[C] 구조체가 무엇인가요? 구조체의 개념, 활용하는 방법 본문
1. 구조체란
여러 개의 변수를 묶어서 하나의 객체를 표현하고자 할 때 구조체를 사용할 수 있다. 배열과 달리, 서로 다른 특성을 같이 묶어서 객체의 성격을 표현하는 것이다. 캐릭터, 몬스터, 좌표 등 다양한 객체를 모두 정의할 수 있다.
구조체는 다음과 같이 선언할 수 있다.
struct 구조체명 {
자료형1 변수명1;
자료형2 변수명2;
}
2. 구조체의 정의 방법
한 명의 학생에 대한 정보를 담고 있는 구조체를 만들어 본다면 다음과 같다.
#include <stdio.h>
struct Student
{
char studentId[10];
char name[10];
int grade;
char major[100];
};
위와 같이 프로그램에서 요구하는 특성에 맞게 객체의 특성을 정의할 수 있다.
int main(void) {
struct Student s;
strcpy(s.studentId, "201302559");
strcpy(s.name, "이은진");
s.grade = 4;
strcpy(s.major, "지리교육전공");
}
main함수 안에서 구조체를 만들어주는 방법이다. 구조체 자체가 하나의 자료형이 되고 변수에 접근할 때는 온점을 사용한다.
#include <stdio.h>
#include<string.h>
struct Student
{
char studentId[10];
char name[10];
int grade;
char major[100];
};
int main(void) {
struct Student s;
strcpy(s.studentId, "201302559");
strcpy(s.name, "이은진");
s.grade = 4;
strcpy(s.major, "지리교육전공");
printf("학번: %s\n", s.studentId);
printf("이름: %s\n", s.name);
printf("학번: %d\n", s.grade);
printf("전공: %s\n", s.major);
}
학번: 201302559
이름: 이은진
학번: 4
전공: 지리교육전공
이렇게 완성해보았다.
2-1. 정의와 동시에 선언을 하는 방법
struct Student
{
char studentId[10];
char name[10];
int grade;
char major[100];
} s;
하나의 구조체 변수만 사용하는 경우, 정의와 선언을 동시에 하여 전역 변수로 사용할 수 있다. 많이 사용되는 형태는 아니다.
2-2. 구조체의 변수를 한 줄에 초기화하기
int main(void) {
struct Student s = {"201302559", "이은진", 4, "지리교육전공"};
printf("학번: %s\n", s.studentId);
printf("이름: %s\n", s.name);
printf("학번: %d\n", s.grade);
printf("전공: %s\n", s.major);
}
선언과 동시에 초기화하기 위해, 변수를 차례대로 넣으면 된다.
3. typedef 키워드로 구조체 자료형 만들기
typedef 키워드를 이용하여 임의의 자료형을 만들 수 있다.
#include <stdio.h>
#include <string.h>
typedef struct Student
{
char studentId[10];
char name[10];
int grade;
char major[100];
} StudentT;
int main(void) {
StudentT s = {"201302559", "이은진", 4, "지리교육전공"};
printf("학번: %s\n", s.studentId);
printf("이름: %s\n", s.name);
printf("학번: %d\n", s.grade);
printf("전공: %s\n", s.major);
}
드디어 타입스크립트같은.. 아는 내용이 나왔다. struct 앞에 typedef 키워드를 붙여서, 앞으로 Student라는 구조체의 자료형을 StudentT라고 부르겠다 라고 정의해주는 것이다.
#include <stdio.h>
#include <string.h>
typedef struct
{
char studentId[10];
char name[10];
int grade;
char major[100];
} StudentT;
int main(void) {
StudentT s = {"201302559", "이은진", 4, "지리교육전공"};
printf("학번: %s\n", s.studentId);
printf("이름: %s\n", s.name);
printf("학번: %d\n", s.grade);
printf("전공: %s\n", s.major);
}
최근에는 익명 구조체의 개념이 생겨, 구조체의 이름인 Student를 생략해도 컴파일러가 자동으로 알아듣는다.
4. 구조체 포인터 변수에 접근하는 방법
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char studentId[10];
char name[10];
int grade;
char major[100];
} StudentT;
int main(void) {
StudentT *s = malloc(sizeof(StudentT));
strcpy(s->studentId, "201302559");
strcpy(s->name, "이은진");
s->grade = 4;
strcpy(s->major, "지리교육전공");
printf("학번: %s\n", s->studentId);
printf("이름: %s\n", s->name);
printf("학번: %d\n", s->grade);
printf("전공: %s\n", s->major);
}
구조체가 포인터 변수로 사용되는 경우, 즉 동적 할당을 이용해서 포인터 변수에 접근해야 하는 경우, 내부 변수에 접근할 때 온점이 아닌 화살표(->)를 사용한다. *s 같은 경우에는 메모리 포인터이기 때문에, 메모리 주소에 접근을 해서 학번을 바꾸겠다 하는 직관적인 표기를 한다고 생각하면 된다.
'C, C++' 카테고리의 다른 글
[C] 전처리기를 사용하여 프로그램을 작성하는 방법 (0) | 2021.10.12 |
---|---|
[C] 파일 입출력이 왜 필요한가요? C언어로 파일 입출력 해보기 (0) | 2021.10.01 |
[C] 함수 포인터 개념과 사용 방법 정리. (0) | 2021.09.30 |
[C] 동적 메모리 할당이 무엇인가요? 개념, 함수, 활용방법 정리 (0) | 2021.09.30 |
[C] 다차원 배열과 포인터 배열 (0) | 2021.09.29 |