배열은 한가지 Type만을 요소로 갖는다. 그래서 좀 더 다양한 자료들을 사용하기 위해서는 구조체를 사용한다. 배열은 각 요소들의 타입이 같기 때문에 일련적인 수로서 각 요소에 점근 할 수 있었다. 예를들면 arr[7] 이런식이었다. 이런 접근은 포인터 연산인데 각 요소들의 타입이 한가지기 때문에 포인터 연산이 가능했었다. 이제 구조체에 대해서 알아봐야하는데, 이런 근본적인 형태의 차이로 인해서 구조체의 각 요소들에 접근하는 방식은 배열과 차이점이 생길 수 밖에 없게 된다. 그리고 배열에서는 요소라고 하지만, 구조체에서는 멤버변수라고 부른다. 아무튼 여러가지 측면에서 다른 양상을 보이는 두 자료구조는 비교대상이지만 따로 때어놓고 이해하는 것이 편리하다.
구조체의 선언
다음은 구조체를 선언한 코드다.
위 선언은 Test라는 태그를 생성한다. 이후로 Test로 구조체 변수를 생성할 수 있다.
struct Test first; //c언어
Test first; // c++
c보다 c++의 변수생성이 더욱 유연하다.
다음은 사용자 정의 타입으로 구조체를 선언한 경우다.
Test가 위 형태의 구조체를 대표하는 사용자 정의 타입으로 선언되었다.
동일한 구조체를 뜻하지만 typedef로 선언하는 것이 여러모로 유용하다.
사용자정의 타입도 일반적인 타입의 특성을 그대로 갖기 때문이다.
두가지 형태는 다 익혀놓고 사용은 typedef로 하길 권한다.
구조체의 멤버변수 접근
배열과 다르게 멤버변수의 크기가 제각각이기 때문에 구조체의 접근 방식은 멤버변수의 이름을 통해서 접근한다.
위 코드를 토대로 멤버변수에 접근을 해보자.
Test first;
first.num=10;
.을 사용해서 멤버변수에 접근할 수 있다. '.'은 멤버연산자인데, 이 멤버연산자의 작동은 offset, 즉 변위와 멤버변수의 타입을 통해서 멤버 변수에 접근한다. 각 구조체마다 고유의 '.'연산이 정해져있다.
offset값은 구조체의 멤버변수의 선언 순서와 관련이 있는데, 각 멤버변수는 순서대로 앞의 타입들의 크기의 합만큼의 offset을 가진다.
구조체 포인터에서 멤버변수의 접근
구조체도 타입이기 때문에, 포인터선언을 할 수 있다. 포인터를 통해 구조체의 멤버변수에 접근 하는 방법은 다음과 같다.
Test *first;
(*first).num=10; //포인터를 통한 멤버변수 접근
다음은 같은 표현이다.
first->num=10;
즉 (*first). 과 first-> 이 같다 (포인터멤버연산자)
간략하게 구조체를 알아봤는데 이 구조체는 c++에서 클래스의 근간이 된다.