7월 4주차_C Study 1. 구조체

2023. 8. 12. 15:08language : p_study/c language

구조체

 

 

구조체란?

 

 

C언어에서의 자료형(데이터타입)은 기본 자료형과 파생 자료형으로 분류된다.

 

➡ 기본 자료형 종류 : char, int, double

파생 자료형 종류 : 배열, 구조체, 공용체, 포인터

사용자정의 자료형 종류 : typedef, enum

구조체란 하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형이다.
사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입이며 기본 타입만으로는 나타낼 수 없는 복잡한 데이터를 표현할 수 있다.
구조체는 똑같은 변수를 여러번 사용해야 하는 경우에 효과적으로 사용할 수 있습니다.

한마디로 , 구조체(structure)는 파생 자료형 중에서도 가장 일반적인 자료형으로 여러 개의 변수들을 묶어서 새로운 자료형을 만들 수 있는 방법을 말한다.

 

배열이 같은 자료형 여러개를 하나로 묶는 것이라면, 구조체는 서로 다른 자료형들을 하나로 묶는 것이다.

 

구조체 생김새 - 정의

struct student { // 구조체 선언 키워드와 구조체 이름(=구조체 태그)
int number; // 구조체 멤버(structure member): 구조체에 포함되는 변수
char name[10]; // 구조체 멤버
double grade; // 구조체 멤버
}; // 마지막에 세미콜론이 있어야 한다.

구조체정의하는 것은 단순히 틀을 정의하는 것과 같다.

아직은 데이터를 저장할 수 있는 상태가 아니다.

틀을 이용해서 실제로 무엇인가를 만들기 위해서는 구조체 변수를 선언하여야 한다.

 

 

구조체 생김새 - 선언

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언어) '구조체' 개념 정리

우리가 사는 세상은 한 개체가 다양한 속성을 가지고 있을 때가 많습니다. 가령 여러분이 학생이라면 학과,...

blog.naver.com

[C언어/C++] 구조체 사용법 & 예제 총정리 (tistory.com)

 

[C언어/C++] 구조체 사용법 & 예제 총정리

구조체란? 구조체란 하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형입니다. 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입이며 기본 타입만으로는 나

coding-factory.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