오늘의 주제는 구조체 입니다. C언어에서는 서로 다른 데이터들를 하나의 묶음으로 정의 할 수 있는 것이 바로 구조체 입니다. 예를 들면 주소록을 만들 때 주소록에는 이름, 나이, 주소, 전화 번호 등 다양한 데이터형의 변수들로 정의 할 수 있는데 이 변수들을 하나의 이름으로 선언하는 것이 바로 구조체 입니다. c언어에서 쓰긴 하는데 나중에 C에서는 클래스로 다양한 데이터형의 변수들을 멤버 변수로 선언 할 뿐만 아니라 다양한 함수들을 하나의 이름(객체)으로 선언 할 수 있기 때문에 구조체보다는 클래스로 선언하여 많이 사용을 합니다. C이 공부하는 것이 아니기 때문에 여기에서는 구조체로 공부하시고 구조체의 개념만 잡아 놓으시면 됩니다.
구조체는 위 그림처럼 struct 키워드로 선언하게 됩니다. struct로 해서 구조체 태그명을 직접 프로그래머가 만들 수 있고 그 구조체 태그명으로 구조체 변수를 선언하게 도비니다. 구조체는 위 그림처럼 다양한 데이터를 괄호로 해서 묶습니다. 여러개 데이터 구조체 태그명으로 선언하고 구조체 변수를 만들어 구조체 안에 다양한 변수들을 접근하게 됩니다.
struct student k;
이렇게 선언하면 k라는 한개의 구초제 변수가 만들어 집니다. 그리고 접근은 아래와 같습니다.
k.name
k.kor
k.eng
k.mat
k라는 구조체 변수명으로 해서 구조체 안에 있는 4개의 데이터 변수를 사용할 수 있게 됩니다.
struct student k[3];
이렇게 선언하면 배열 변수로 3개의 배열 구조체변수는 각각 개별적으로 4개의 데이터 변수들으 접근하게 됩니다.
한마디로 구조체 변수 3개를 하나의 배열 변수로 선언한거로 생각하시면 됩니다.
구조체 선언만 하는 경우
struct student{
char name[10];
int kor;
int eng;
int mat;
};
struct student k[3];
** 구조체 선언과 동시에 변수 선언**
struct student{
char name[10];
int kor;
int eng;
int mat;
} k[3];
typedef을 이용한 구조체 변수 선언
typedef struct{
char name[10];
int kor;
int eng;
int mat;
} student;
student k[3];
구조체 선언은 같은데 실제 구조체 변수를 만드는 과정이 좀 다르죠. 첫번째와 두번째 이미 구조체 정의만 하는 경우와 변수까지 선언하는 경우로 나뉜 것 뿐이라 어렵지 않습니다. 세번째는 typedef 키워드를 이용한 구조체 선언 방식인데 이경우만 추가로 설명하겠습니다.
typedef struct{
데이트변수들...
} 구조체명;
구조체명 변수명;
구조는 위와 같습니다. 기존 구조체 선언에서 구조체명이 뒤로 빠져 있고 struct 앞에 typedef라는 키워드가 추가되었을 뿐 기본 구조는 같습니다.
이렇게 선언해 놓으면
struct 구조체명 변수명;
이런식으로 일일히 타이핑 해야 하는데 typedef로 지정하면 struct 글자를 생략 가능해집니다.
구조체명 변수명;
student k[3];
이런식으로 말이죠.
3가지 형태를 잘 구분하여 사용하시기 바랍니다.
그러면 실제로 구조체를 만들어서 실행해 봐야겠죠.
기초 성적프로그램을 한번 만들어 보겠습니다. 형식은 3명의 학생의 국어, 영어, 수학 점수를 입력 받고 총점과 평균을 구해보는 프로그램을 구현해 보도록 하겠습니다.
구조체 형식은 여러분들의 자유이고요. 전 이름, 국어, 영어, 수학을 변수로 선언 하겠습니다.
struct student{
char name[10];
int kor;
int eng;
int mat;
};
세명이니깐 구조체 변수 선언은 이렇게 해야 겠지요.
struct student k[3];
총점과 평균까지 변수로 선언해도 되지만 이건 계산하여 결과를 printf()문으로 출력하는 걸로 표현 하겠습니다.
[전체소스]
#include
#include
struct student{
char name[10];
int kor;
int eng;
int mat;
};
int main(int argc, char *argv[]) {
int i;
struct student k[3];
int total;
float avg;
for(i=0;i<3;i++){
printf("%d번 이름: ",i+1);
scanf("%s",k[i].name);
printf("\n");
printf("국어: ");
scanf("%d",&k[i].kor);
printf("\n");
printf("영어: ");
scanf("%d",&k[i].eng);
printf("\n");
printf("수학: ");
scanf("%d",&k[i].mat);
printf("\n");
system("cls");
}
for(i=0;i<3;i++){
total = k[i].kor+k[i].eng+k[i].mat;
avg = (float)total/3;
printf("이름: %10s 국어: %3d 영어: %3d 수학: %3d 총점: %3d 평균: %0.1f\n",k[i].name,k[i].kor,k[i].eng,k[i].mat,total,avg);
}
system("pause");
return 0;
}
위 소스는 깔끔하지는 않네요. 그냥 바로 생각나는대로 증흥적으로 하다 보니깐 너무 코딩이 길군요. 그냥 뭔가를 상상하고 느낌을 코딩으로 표현하다보니 이렇게 되었지만 대충 구조체의 느낌 전달에는 부족함이 없어 보이니깐 참고만 하세요. 좀 더 다듬어서 성적처리프로그램을 완성해 보세요. 한개씩 일일히 입력 받았는데 띄어 쓰기로 한번에 전체 다 받으셔도 됩니다. scanf()한개로 위 표현을 다 담아보세요.
[결과]
입력 :
처리 :
일반 변수로 선언 할 경우 3명의 학생이니 이름, 국어, 영어, 수학이라는 변수가 따로 선언이 되고 각 변수들은 배열[3]으로 일일히 다 선언해야 합니다. 여기까지는 상관 없는데 만약 10명의 학생으로 바뀌면 어떻게 될까요. 각 변수들을 일일 10개의 배열 변수로 수정해야겠죠. 참 불편한 코딩이 되겠죠. 구조체로 묶으면 변수 선언부분에서 구조체 변수하나만 3에서 10으로 변경하면 자동으로 10개의 크기로 늘어나기 때문에 수정하기 편합니다. 그리고 여러개의 변수들이 일일히 개별적으로 분리 되어 있으면 변수가 개수가 늘어날 수록 관리하기도 힘들고 다양한 변수들이 혼합되어 있으면 개별 변수들이 어느 변수인지 그 의미를 구분하기 힘듭니다. 구조체로 묶어 놓으면 student라는 이름 하나로 학생에 대한 변수들로 한곳에 묶어 놓으면 student라는 이름 하나로 이 구조체 변수들은 학생에 대한 정보를 담아 놓겠구나 하고 쉽게 구별이 되고 코딩하실 때 구조체변수에 점을 찍으면 구조체 변수내에 있는 다양한 변수들 목록이 나타나기 때문에 코딩하기가 편하게 됩니다.
이건 dev c++ 이라서 이렇게 표현 되지만 다른 툴로 하셔도 표시가 되기 때문에 특정 변수를 접근하거나 관리하는데 편리 합니다.