Taking baby-developer steps

16. 구조체 - 구조체의 정의와 선언 / 구조체의 변수의 선언과 접근/ 연산자 온점(.) / 구조체 만들기 및 활용 / 더 짧게 구조체 선언하기 / 구조체를 포인터 변수로 사용하기 본문

CS 지식/C언어_basic

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;

빈번하게 사용되는 형태는 아니지만,

  1. 오직 하나의 변수만 사용할 때
  2. 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
학과 : 화학공학과

 

요약

  1. 구조체는 C언어의 고급문법과 떼려야 뗄수 없는 부분이다. 완전히 이해하고 넘어가야한다.
  2. 구조체는 현실 세계의 객체(학생, 캐릭터, 몬스터, 자동차 등등)를 소스 코드 상에서 매우 쉽게 표현 할 수 있도록 한다.
  3. 여러개의 변수 자체가 하나로 모여서, 일종의 '특성'을 구성하는 '구조체'를 만들 수 있다.
Comments