피씨컴의 기울어진 공관

● 구조체

구조체는 여러 자료의 항목을 모아놓은 형태이다.

 

● 레코드

레코드는 서로 연관된 자료항목이 모여 있는형태로, 파일이나 데이터 모음을 말하며 영어 발음그
대로 레코드라 부른다.

 

● 필드

필드는 항목이라 부르기도 하고 또는 영어 발음 그대로 필드 또는 아이템(Item)이라고도 한다. 이
는 데이터를 표현하는 기본 항목으로 레코드를 구성히는 기본 단위이다. 여러 개의 서로 의미 있는
필드가 모여 하나의 례코드를 구성한다.

 

● 구조체 정의 : 레코드 단위의 변수를 선언하려면 먼저 레코드가 어떤 구조를 갖는지 정의해야 한다.

    이를 '구조체 정의'라 한다. 구조체를 구성하는 필드와 각 필드의 자료형을 결정하는 것이다.

 

구조체형 변수선언 1
struct [태그 01름]

{
구조체멈버선언;
}[변수 이름 1], [변수 이름 2];


구조체형변수선언 2
struct [태그 이름]

{
구조체멈버선언;

}
struct [태그 01름][변수 이름 1], [변수 이름 2];

 

※ 태그 이름은 구조체형의 식별을 담당한다. 즉 여러 개의 구조체형 선언이 프로그램에 포함된
    경우 태그 이름으로 구조제형을 구분한다. 따라서 태그 이름은 유일해야 하고 구조체형 변수 선
    언 1과 같이 사용할 경우에는 생략할 수 있다. 그러나 구조체형 변수 선언 2와 같이 사용할 경우
    에는생략할수없다.

 

● 맴버 참조연산자

구조체 변수가 멤버를 지칭할 때 ”멤버를 참조한다라고 표현한다. 구조체 변수는 여러 개의 멤버를 가
질 수 있고 각 멤버를 참조할 때 멤버 참조 연산자를 사용한다. 이때 구조체 맴버 참조 연산자는
점 . 이다.

 

 

● 구조체 맴버 : 구조체를 구성하는 필드를 ’구조체 맴버’라 부른다. 구조체의 멤버는 정수형, 실수형,

    배정도형 , 문자형 등 일반 자료형이 될 수 있고 또한 구조체형 변수도 하나의 멤버로 포함될 수 있다.

 

 

★ 예제 5-1

일반 문자열 배열에 자료를 집어넣기 위해선 strcpy_s를 쓰면 된다.

이 예제의 용도는 다음의 구조체 변환을 위한 포석이다. 위 소스가 아래의 다음 예제에서 구조체로 변하게 된다.

 

 

 

★ 예제 5-2

위 5-1의 소스를 구조체로 바꾼 형태이다. 보통 이렇게 하면 Friend의 기억공간이 할당되고 그안에 name과 NPhonenum이 자리하게 되는 형태가 되는 것이다 이것들은 맴버라 부르며 각각의 맴버는 맴버참조 연산자로 접근 할수가 있다.

 

 

★ 예제 5-3

이도 마찬가지로 구조체로 변환의 한 예제로 쓰일 것이다.

 

★ 예제 5-4

위 5-3이 구조체로 변한 모습이다. 여기서 키포인트는 Fried1 = Fried; 이 부분이다.

이부분은 에러가 아니다. 일단 바로 그위에 strcopy로 자료를 채워넣은뒤 그 자료를 같은 이름의 구조체 끼리는 데이터형태가 동일하기 때문에 따로 문자열을 카피하기 위한 프로세셍을 할 필요 없이 그냥 데이터를 넘겨주기만 하면 되기 때문

 

 

 

 

 

※ 구조체의 멤버로 구조체를 포함한 경우 참조 연산지를 사용해서 포함된 구조체의 멤버를 참조

    할수있다.


    - 구조체 엠버가 구조체형 변수를 포함할 때
         [구조체 변수].[맴버인 구조체형 변수].[맴버]

 

 

 

 

★ 예제 5-5

구조체의 맴버로 구조체를 포함한 경우 참조연산자를 이용하여 포함된 구조체의 맴버를 참조하는 예제이다. 맴버참조 연산자를 연속적으로 사용하는 것으로 구조체속의 구조체를 참조할수 있게 되는 것이다.

 

 

 

 

● typedef를 이용한 구조체 정의

일반 자료형 예약어(int. float. doubl. char)는 하나의 단어로 간단하다. 그러나 구조체형은 사
용자가 필요한 내용의 멤버들이 포함되어 있어 길다. 따라서 변수 선언에서 복잡해 보인다. 이
를 위한 해결 방법은 typedef이다. typedef는 이미 정의된 내용을 다시 정의하는 역할을 한다.

 

typedef [이미 정의된 내용] [새로 정의해서 사용할 내용];

 

 

 

 

★ 예제 5-6

위 예제는 typedef를 이용하여 미리 sam으로 정의한 구조체를 새로운 이름 SAM으로 재정의를 하는 case를 보여주는 예제이다. 이렇게 typedef를 통해 새로 재정의된 것들은 재정의 이전의 것과 똑같이 사용할 수 있다.

 

 

 

 

● 구조체 태그를 이용한 재정의

구조체형 선언과 typedef를 함께 사용하면 프로그램 코딩 시 편리할 뿐만 아니라 코드의 가독
성 면에서도 매우 좋다. 일반적으로 이러한 이유 때문에 구조체형 선언에서 구조체 태그 이름을
생략하고 재정의를 다음과 같이 함께 사용한다.


typedef struct

{
구조체멈버선언;
}재정의 이름;

 

★ 예제 5-7

구조체 태그를 이용한 재정의를 사용한 예제이다

 

 

 

● 구조체선언위치

구조체는 선언 내용이다. 따라서 소스 파일과 함께 같은 파일에 있어도 되지만 프로젝트가 커지
면 대부분 헤더 파일에 별도로 관리하는 것도 가능하다.

 

 

 

★ 예제 5-8

 

 

※ ITem맴버 변수의 크기


int Monlh : 4바이트
int Day : 4바이트 (현재까지 4바이트+4바이트이므로 총 8바이트)
char itemName[50] : 50바이트(현재까지 앞에서 8바이트+50바이트01므로 현재 58바이트이다. 그런데

                            58은 4의 배수가 아니며, 이어서 오는 멈버(Quantity)가 문자헝(1 바이트 딘위)

    이 아니므로 처리단위에 대해 4의 배수 단위로 처리해야 한다 따라서 58보다 큰

    가까운 4의 배수인 60바이트가 할당된다 *)

int Quantity : 4바이트 (현재까지 앞의 60바이트 +4바이트01므로 층 64바이트)
int UnitCost : 4바이트 (현재까지 앞의 64바이트 +4바이트이므로 총 68바이트)
int Price : 4바이트 (현재까지 앞의 68바이트 +4바이트0 1므로 총 72바이트)

 

 

★ 예제 5-9 / 5-10

head.h

main.cpp

구조체를 head에 따로 정의했다.

 

 

 

 

 

★ 예제 5-11

구조체 배열을 활용방법에 대한 예제이다. 구조체를 배열로 만든 형태이고 그 쓰임세는 배열의 쓰임세와 크게 다르지 않다. 단 선언과 동시 초기화 할때에는 구조체 맴버의 순서에 따라 , 를 따라 차례로 입력된다.

 

 

● 구조체 포인터

구조체 포인터도 사용할 수 있다. 일반 포인터 변수와 마찬가지로 구조체형 포인터 변수도 서로
자료형이 일치해야 한다. 구조체형 포인터 변수 선언과 사용은 일반 자료형 포인터 변수와 마찬가
지이다. 주의할점은멤버 참조이다. 엠버 참조시 간접 연산자를사용해서 다음과같이 표시한다

(*구조체형 포인터 변수)멤버

 

 

 

★ 예제 5-12

구조체 포인터를 사용하는 예제이다. 역시 구조체 포인터도 일반 포인터와 그 쓰는방법은 크게 다르지 않다.

 

 

★ 예제 5-13

※ 구조제형 포인터 변수에서 멤버 참조를 위해 별도의 포인터 변수의 멤버 참조 연산자가 제공된

    다.

   

    구조체형 포인터 변수 -> 맴버

 

기존의 구조체형 변수의 멤버 참조 연산지를 구조체형 포인터 변수에서 사용하려면 매번 간접
연산자와 중괄호를 표시해야 하므로 번거롭기 때문에 구조제형 포인터 변수의 참조 연산자인
-> 를 많이 사용한다.

 

'프로그래밍 > 공부' 카테고리의 다른 글

8장 객체와 클래스  (0) 2013.03.03
7장 중간정리  (0) 2013.03.03
6장 함수  (0) 2013.02.26
25일 수업  (0) 2013.02.26
5일차? 6일차? (2/19)  (0) 2013.02.21
Posted by 피씨컴