2023. 8. 12. 15:08ㆍlanguage : p_study/c language
구조체
구조체란?
C언어에서의 자료형(데이터타입)은 기본 자료형과 파생 자료형으로 분류된다.
➡ 기본 자료형 종류 : char, int, double
➡ 파생 자료형 종류 : 배열, 구조체, 공용체, 포인터
➡ 사용자정의 자료형 종류 : typedef, enum
구조체란 하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형이다.
사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입이며 기본 타입만으로는 나타낼 수 없는 복잡한 데이터를 표현할 수 있다.
구조체는 똑같은 변수를 여러번 사용해야 하는 경우에 효과적으로 사용할 수 있습니다.
한마디로 , 구조체(structure)는 파생 자료형 중에서도 가장 일반적인 자료형으로 여러 개의 변수들을 묶어서 새로운 자료형을 만들 수 있는 방법을 말한다.
배열이 같은 자료형 여러개를 하나로 묶는 것이라면, 구조체는 서로 다른 자료형들을 하나로 묶는 것이다.
구조체 생김새 - 정의
struct student { // 구조체 선언 키워드와 구조체 이름(=구조체 태그)
int number; // 구조체 멤버(structure member): 구조체에 포함되는 변수
char name[10]; // 구조체 멤버
double grade; // 구조체 멤버
}; // 마지막에 세미콜론이 있어야 한다.
구조체를 정의하는 것은 단순히 틀을 정의하는 것과 같다.
아직은 데이터를 저장할 수 있는 상태가 아니다.
틀을 이용해서 실제로 무엇인가를 만들기 위해서는 구조체 변수를 선언하여야 한다.
[출처] (C언어) '구조체' 개념 정리|작성자 써밋
구조체 생김새 - 선언
struct 구조체이름{
자료형 변수명;
자료형 변수명;
...
}구조체 별칭;
struct Score{
char name[10]; //학생이름
int kor; //국어 점수
int mat; //수학 점수
int eng; //영어 점수
}S;
- 구조체를 선언할때의 struct라는 명령어를 사용해서 선언한다.
- 구조체 이름을 선언하여 사용하여도 되고 별칭을 지정해서 사용하여도 된다.
- 구조체의 내부에서는 구조체의 멤버를 선언합니다. 멤버 선언은 일반 변수 선언과 기본적으로 비슷하지만 초기화되지는 않습니다. 구조체 별칭은 말 그대로 구조체의 별칭을 정의하는 것입니다. 정의한 구조체 별칭에 변수명을 선언함으로써 실제 메모리가 할당됩니다.
구조체 생김새 - 초기화
#include <stdio.h>
struct Score {
char name[20]; //학생 이름
int kor; //국어 점수
int mat; //수학 점수
int eng; //영어 점수
}S;
int main()
{
//초기화 방법 (1) 선언시 바로 초기화
struct Score s1 = { "이모래",80,50,60 };
//초기화 방법 (2) 선언후 .을 활용하여 초기화
struct Score s2;
strcpy(s2.name, "이모래");
s2.kor = 80;
s2.mat = 50;
s2.eng = 60;
return 0;
}
- 구조체는 보통 전역으로 정의한다.
- 특정 함수 안에 구조체를 정의하면 해당 함수 안에서만 구조체를 사용할 수 있기 때문이다.
- 정의한 구조체를 사용하려면 구조체 변수를 선언해야 한다.
- 이때는 구조체 이름 앞에 반드시 struct 키워드를 붙여줘야한다.
초기화 방법에는 위와 같이 2가지 방법이 있다.
- 초기화하면서 {} 대괄호 안에 변수들을 차례로 입력해주는 방법
- 먼저 선언해놓은 뒤 .을 활용하여 값을 넣어주는 방법
➡ typedef
typedef는 새로운 자료형(type)을 정의(define)하는 것이다. 사용자가 새로운 자료형을 추가할 수 있도록 한다.
typedef로 struct 키워드 없이 구조체 선언하기
#include <stdio.h>
typedef struct Score { //typedef사용하기
char name[20]; // 학생 이름
int kor; //국어 점수
int mat; //수학 점수
int eng; //영어 점수
}S;
int main()
{
S s1 = { "이모래",60,90,50 };
return 0;
}
typedef는 자료형의 별칭을 만드는 기능이다.
따라서 구조체의 별칭도 만들 수 있다.
본래는 구조체를 구조체를 정의하고 이것을 변수로 선언하려면 반드시 앞에 'struct'라는 키워드를 붙여서 구조체라는 것을 알려주어야 하지만 이런 것이 횟수가 많다면 매번 struct를 앞에 써주어야 하므로 번거롭고 비효율적일 수 있다.
그래서 앞에 'typedef'라는 키워드를 사용하여 사용자 지정 타입으로 만들어준다면 'struct'키워드를 일일이 써주지 않아도 구조체를 사용하실 수 있다.
구조체 멤버 참조
s1.grade = 3.8; //student 구조체 변수 s1의 멤버 변수인 grade에 4.3을 대입
strcpy(s1.name, "Lee"); //멤버가 문자열이라면 strcpy를 사용해서 문자열 저장
구조체의 멤버는 멤버 연산자 (.) 를 이용하여 접근할 수 있다.
scanf같은 걸 쓸 때 &s1.number 한다면 &(s1.number)과 같다.
➡ 멤버 연산자가 더 우선 순위가 높다.
구조체의 연산( 대입가능, but 비교는 불가)
구조체를 멤버로 가지는 구조체가 가능하다.
구조체를 다른 구조체에 p2 = p1;과 같이 대입하는 것은 가능하다.
그러나 구조체 변수를 서로 비교하는 것은 허용되지 않는다.
구조체 변수를 비교하려면 멤버마다 별도의 비교수식이 필요하다.
예: (p1.x == p2.x) && (p1.y == p2.y)
구조체끼리 더할 수도 없다.
+ 구조체 배열 내용 추가하기
+ 구조체 포인터 추가하기
+ 구조체 함수 추가하기
+ 열거형 내용 추가하기
참고자료 : (C언어) '구조체' 개념 정리 : 네이버 블로그 (naver.com)
[C언어/C++] 구조체 사용법 & 예제 총정리 (tistory.com)
'language : p_study > c language' 카테고리의 다른 글
7월 3주차_C Study 2. 문자열 (0) | 2023.07.22 |
---|---|
7월 3주차_C Study 1. 포인터 (0) | 2023.07.22 |
7월 3 , 4주차_C Study 계획서 (0) | 2023.07.20 |
7월 2주차_C Study 2. 함수 (0) | 2023.07.15 |
7월 2주차_C Study 1. 배열 (0) | 2023.07.15 |