6.1 구조체의 기본개념(Basics of Structures)
구조체는 하나의 이름으로 불릴수 있는 서로 다른 형의 변수들의 모임이다 구조체는 특히 큰 프로그램에서 여러변수들의 모임을 하나의 독립된 양으로 취급할수 있게 해 주므로 복잡한 자료를 다루는것을 편하게 해준다
구조체의 전형적인 예는 회사의 직원 인사 정보인데 직원들의 이름 주소 주민등록번호 급여등의 속성을 묶어서 하나의 구조체로 표시한 것을 말한다 구조체의 내부에 또 구조체가 있을 수도 있다. 예컨대 이름은 여러개로 구분될수 있으며 주소와 급여도 마찬가지이다. 또 다른 예로 그래픽 분야에서 좌표상의 점이나 사각형에서 양 끝 두점 등이 구조체가 될수있다
간단한 구조의 예로 정수로 이루어진 x좌표와 y좌표의 점의 위치를 나타낸다고 생각해 보자
두개의 구성원소는 다음과 같이 선언된 구조체에 들어가게 된다.
struct point {
int x;
int y;
};
struct 명령어는 구조체의 시작을 나타낸다 구조체의 이름은 struct라는 명령어 뒤에 온다(여기서는 point)구조체의 이름을 struct tag 라고도 하는데 후에 복잡한 선언 대신에 간단히 쓰일수 있다. 구조체에 속하는 변수들을 멤버(member)라고 한다 구조체의 멤버나 이름이 아닌 보통의 변수들은 항상 의미상 구별이 가능하기 때문에 멤버와 보통변수가 같은 이름이 되어도 좋다 동일한 이름의 멤버를 다른 구조체에서도 사용할수 있다
struct 선언은 형을 정의하는 것이다 멤버의 끝에 나타내는 우측 중괄호 뒤에 콤마로 분리하여 변수를 써 주면 여러개의 변수를 함께 정의할 수있다
struct { ... } x, y, z;
이것은 구문적으로 x, y, z를 어떤 일정한 형의 변수로 선언하고 각각에 기억장소를 배정한다는 점에서 다음과 유사하다
int x, y, z;
변수열이 따르지 않는 구조체의 선언의 경우에는 기억장소가 배당되지 않고 단순히 구조체의 형만을 기술한다 그러나 만일 구조체에 이름(tag)이 붙어있다면 그 이름은 나중에 실제 구조체의 선언에 사용될 수있다. 예를 들면 위의 point 선언의 경우는
struct point pt;
변수 pt를 point형의 구조체로 선언하는 것을 뜻한다 구조체의 경우 다음과 같이 각 요소에 대한 초깃값을 열거해서 정의함으로써 초기화 할수 있다.
struct point maxpt = { 320,200 };
구조체형의 자동변수는 그 구조체의 선언과 같은 형의 값을 리턴하는 함수를 부르거나 지정에 의해 초기화 될수 있다.
구조체의 멤버는 다음과 같은 형태로 사용된다
구조체이름.멤버
구조체 멤버의 연산자 "."는 구조체의 이름과 멤버이름을 연결시킨다 예를 들어 점 pt의 좌표값을 인쇄하기 위해 다음과 같이 쓸 수있다.
printf("%d,%d",pt.x,pt.y);
또는 점 pt의 원점에서부터의 거리를 구하기 위해 다음과 같이 사용할 수있다.
double dist,sqrt(double);
dist = sqrt((double)pt.x*pt.y+(double)pt.y*pt.y);
구조체의 구조체도 있을 수있다. 하나의 사각형은 대각선으로 마주 본 두점을 지정해 줌으로써 나타낼수있다.
struct rect {
struct point pt1;
struct point pt2;
};
rect라는 구조체는 두개의 point 구조체를 포함한다 만약 screen 이 다음과 같이 선언되어있다면
struct rect screen;
screen의 pt1이라는 멤버의 x좌표는 다음과 같이 나타낼수 있다.
screen.pt1.x