'구조체'에 해당되는 글 1건

  1. 2007/04/21 구조체의 필요성과 사용 방법
구조체(Structure)는 C언어에서 필수적으로 사용되는 요소이다.
기본적으로 구조체란, 자료형(Type)이 다른 여러 변수들을 하나의 형태로 묶는 것을 말한다. 가령, int형의 변수와 char형의 변수 둘을 묶어 사용자 정의형 변수 newtype을 만드는 것이다. 이렇게 하면, newtype형의 변수를 선언하면 int형의 변수와 char형의 변수 두 개가 만들어지고, newtype형 변수를 이용하여 int형 변수와 char형 변수에 Access할 수 있다.
구조체는 여러 가지를 위해서 필수적이다. 구조체를 쓰면 자료를 효율적으로 관리할 수 있다. 이런 것을 자료의 캡슐화, 모듈화라고 한다. 여러 가지의 자료가 서로 연관성을 갖고 있을 때 이를 하나의 자료로 통합하여 관리하는 것은 프로그램의 유지/보수 측면 뿐만 아니라 코딩 자체에도 큰 효율 향상을 가져온다. 예를 들어, 학생에 관한 자료가 있다고 하자. 이를 int형의 Num배열, char형의 Name배열, int형의 Subject배열 등으로 나누어 관리한다면, 자료 간 통합이 되지 않고, 자칫 잘못하면 한 학생에 대한 자료가 서로 다른 인덱스의 위치에 저장되는 불상사가 발생될 수 있어 바람직하지 않은 방법이라고 할 수 있다. 이러한 경우에 Num, Name, Subject를 하나의 Student라는 자료형으로 묶어 관리할 수 있다면 코드 자체도 훨씬 간결해 질 뿐만 아니라 정렬이나 이동, 복사 작업도 훨씬 간편해진다. 특히, STL에서 기본적으로 제공하는 sort 함수를 쓰기 위해서는 구조체화가 필수적이다. Num 배열을 기준으로 정렬을 할 때, 각 배열을 따로 따로 관리하면 Num배열만 정렬되고 나머지는 정렬되지 않아 자료가 흐트러질 수 있다. 이 때는 꼭 각 배열을 Student라는 구조체로 묶어 한꺼번에 정렬을 해야한다.
구조체를 사용하는 방법은 다음과 같다.

struct AA{
     int aa;
     char bb;
     double cc;
     __int64 dd;
};


위 소스는 구조체를 선언하는 부분이다. 소스를 해석하자면, AA라는 구조체에 int형의 aa, char형의 bb, double형의 cc, __int64형의 dd를 담은 것이다. 이제 AA라는 새로운 데이터 타입이 생긴 것이며, 다음과 같이 변수를 선언할수 있다.

struct AA test;

위 소스는 AA형의 test라는 변수를 선언하는 것이다. 이 때 test 변수는 그 안에 aa, bb, cc, dd를 모두 갖고 있으며, 이에 접근하기 위해서는 test.aa, test.bb, test.cc, test.dd와 같이 온점을 찍고 뒤에 구조체 내부의 변수명을 적어주면 된다.
그러면 아까의 예제를 살려 Student라는 구조체를 만들어보도록 하자.

struct Student{
     int Num;
     char Name[10];
     int Subject;
}data[100];


위 소스는 Student 구조체를 만듦과 동시에 Student 형의 data라는 배열 100개를 선언해 준 것이다. 이렇게 해 주면 data[0].Num과 같이 접근을 할 수 있다.
또한 다음 예제를 보도록 하자.

int temp_i;
char temp_c[10];
temp_i=Num[0];
Num[0]=Num[1];
Num[1]=temp_i;

strcpy(temp_c, Name[0]);
strcpy(Name[0], Name[1]);
strcpy(Name[1], temp_c);

temp_i=Subject[0];
Subject[0]=Subject[1];
Subject[1]=temp_i;


위 예제는 Num, Name, Subject의 0번지와 1번지를 Swap하는 소스이다. Num, Name, Subject를 따로따로 선언할 때에는 위와 같이 모든 배열에 대해 Swap을 실행해야 하는 번거로움이 있다. 이 때, 구조체를 사용하면 훨씬 편리하다.

struct temp;
temp=data[0];
data[0]=data[1];
data[1]=temp;


위 예제는 Student 형으로 선언된 data배열의 0번지와 1번지를 교환하는 소스이다. 모든 배열에 대해 따로따로 Swap을 실행해 줄 필요 없이 자동으로 모든 것이 처리되기 때문에 코딩의 효율을 크게 높일 수 있다.
이 밖에도 함수의 리턴에 구조체를 사용하는 경우가 많다. 함수 리턴 시 여러 개의 값을 한꺼번에 넘겨주고 싶을 때 구조체를 사용하면 효과적이다.

평소에 무시하고 잘 쓰이지 않는 것임에는 틀림 없지만, 라이브러리의 내부로 가면 갈 수록 많이 나타나는 것이 구조체이다. 그만큼 중요하고 편리한 것이므로 애용하도록 하자.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry