[C++문법] C++ 구조체 / 구조체 포인터 /공용체와열거형/typedef 공부하기 -2
본문 바로가기

C#

[C++문법] C++ 구조체 / 구조체 포인터 /공용체와열거형/typedef 공부하기 -2

728x90
반응형

오늘은 저번에 이어서 C++ C++ 구조체 / 구조체 포인터 /공용체와열거형/typedef 에 대해 공부하겠습니다.

 

구조체를 매개변수로 하는 '주소에 의한 전달 방식'의 함수

1. 값에 의한 전달방식

2. 주소에 의한 전달방식

3. 참조에 의한 전달방식

 

이 중 가장 기본이 되는 방식은 값에 의한 전달 방식이다.

->값에 의한 전달방식의 함수에서 형식 매개변수는 실 매개변수의 값을 복사해서 저장할 메모리를 따로 할당 받으므로 호출당한 함수측에서 구조체 변숫값을 변경해도 함수를 호출한 측으로 돌아왔을 떄 아무런 변화가 없다.

->키보드에서 입력받은 값을 구조체 변수에 저장하는 함수 작성은 못함

 

 

키보드에서 입력받은 값을 구조체 변수에 저장하는 함수는 주소에 의한 전달 방식으로 작성해야함

 

구조체 포인터를 매개변수로 사용하는 함수 작성하기

#include<iostream>
using namespace std;

struct namecard {
char name[20];
char job[30];
char tel[20];
char email[40];
};

void structPrn(namecard temp);
void structinput(namecard* qtemp);

void main() {
namecard x, y, z;

structinput(&x);
structinput(&y);
structinput(&z);

cout << "이름\t직업\t\t연락처\t이메일";
cout << "\n=======================================";
structPrn(x);
structPrn(y);
structPrn(z);
cout << "\n=======================================";
}

void structPrn(namecard temp) {

cout<<"\n"<<temp.name<<"\t"<<temp.job<<"\t"<<temp.tel<<"\t"<<temp.email;

}

void structinput(namecard* qtemp) {
cout << "이름을 입력하세요=>";
cin >> qtemp->name;
cout << "직업을 입력하세요=>";
cin >> qtemp->job;
cout << "연락처를 입력하세요=>";
cin >> qtemp->tel;
cout << "이메일을 입력하세요=>";
cin >> qtemp->email;
}

 

 

참조에 의한 전달방식의 함수는

이미 할당되어진 기억공간을 다른 이름으로 접근 할 수 있도록 별칭만을 지정해주는 것

 

구조체 참조 매개변수로 사용하는 함수 작성하기

#include<iostream>
using namespace std;

struct namecard {
char name[20];
char job[30];
char tel[20];
char email[40];
};

void structPrn(namecard a);
void structinput(namecard &qtemp);

void main() {
namecard x, y, z;

structinput(x);
structinput(y);
structinput(z);

cout << "이름\t직업\t\t연락처\t이메일";
cout << "\n=======================================";
structPrn(x);
structPrn(y);
structPrn(z);
cout << "\n=======================================";
}
void structPrn(namecard a) {
cout << "\n" << a.name << "\t" << a.job << "\t" << a.tel << "\t" << a.email;

}
void structinput(namecard* qtemp) {
cout << "이름을 입력하세요=>";
cin >> qtemp->name;
cout << "직업을 입력하세요=>";
cin >> qtemp->job;
cout << "연락처를 입력하세요=>";
cin >> qtemp->tel;
cout << "이메일을 입력하세요=>";
cin >> qtemp->email;
}

 

구조체 배열 

동일한 자료형으로 선언된기억공간이 같은 목적으로 사용될 경우가 있다.

이럴 떄 사용하는 것이 배열이다.

 

기본자료형으로 선언한 배열과의 차이점은 구조체 배열은 멤버변수 단위로 접근해야 한다는 것이다. 첨자가 1인 구조체배열에 저장되어 있는 값 중 이름을 출력하려면 x[1].name과 같이 구조체 배열 다음에 . 연산자를 기술한 후 멤버변수를 적어둔다.

 

구조체 배열 사용하기

#include<iostream>
using namespace std;

struct namecard {
char name[20];
char job[30];
char tel[20];
char email[40];
};

void main() {
namecard x[3] = { {"김주현","MCSE전문강사","418-9876","free@naver.com"},
{"박혜경","웹마스터","551-6987","park@naver.com"},
{"김동식","기획팀대리","7777-777","kim@naver.com"} };
cout << "이름\t직업\t\t연락처\t이메일\n";
cout << "==========================================>\n";
for (int i = 0; i < 3; i++) {
cout << x[i].name << "\t" << x[i].job << "\t" << x[i].tel << "\t" << x[i].email << endl;
}
cout << "==========================================>\n";
}

 

공용체

공용체는 구조체처럼 다양한 데이터형으로 구성된 항목 여러개가 모여 집단 항목을 이루는 복합 자료형

공용체는 모든 멤버변수가 동일한 기억공간에 중복되어 할당된다

공용체를 선언할려면 예약어 union을 사용해야한다. 

 

예)

union u_date{

char ch;    //문자형 데이터 멤버

int num;   //정수형 데이터 멤버

}

구조체와 마찬가지로 새로운 자료형을 정희한 것

실질적인 메모리를 할당하지않는다

 

공용체는 구조체와 달리 멤버 중에서 가장 큰 자료형의 크기로 메모리가 할당된다.

그리고 멤버들이 동일한 시작 주소를 갖도록 메모리가 할당된다.

 

공용체 분석하기

#include<iostream>
using namespace std;
union u_date {
char ch;
int num;
};
void main() {
u_date test;
//공용체의 크기 출력
cout << "sizeof(u_data)\t:" << sizeof(u_date) << "byte\n";
//공용체 변수의 주소
cout << "%test\t:" << (int)&test << "\n";
//공용체 멤버의 주소
cout << "&test.ch\t:" << (int)&test.ch << "\n";
cout << "&test.num\t:" << (int)&test.num << "\n";
}

 

공용체에 값을 저장한 후 저장된 값을 출력하기

#include<iostream>
using namespace std;
union u_date {
char ch;
int num;
};
void main() {
u_date test;
test.num = 0x12345678;
cout << "&testch\t:"<<hex<< (int)test.ch << "\n";
cout << "&testnum\t:"<<hex << test.num << "\n";
}

 

열거형

열거형을 선언하려면 예약어 enum을 사용한다.

열거형은 숫자나 색깔과 같이 일정한 패턴이 있는 상수들을 집합으로 갖도록 선언한ㄷ.

 

예)

enum COLOR{RED,GREEN,BLUE,WHITE,BLACK};

 

{}안에 기술된 구성원을 '열거 상수'라고 한다.

처음에 기술된 열거상수의 값은 0이고 값이 차례대로 1씩 증가한다.

메모리는 할당되지 않는다.

 

열거형 사용하기

#include<iostream>
using namespace std;

enum COLOR { RED, GREEN, BLUE, WHITE, BLACK };

void main() {
enum COLOR test;
test = BLUE;
cout << "test =" << test << "\n\n";

cout << "RED =" << RED << endl;
cout << "GREEN = " << GREEN << endl;
cout << "BLUE = " << BLUE << endl;
cout << "WHITE = " << WHITE << endl;
cout << "BLACK = " << BLACK << endl;
}

 

열거 상수에 수치 정하기

#include<iostream>
using namespace std;

enum COLOR { RED=1, GREEN, BLUE=35, WHITE, BLACK=2 };

void main() {
enum COLOR test;

cout << "RED =" << RED << endl;
cout << "GREEN = " << GREEN << endl;
cout << "BLUE = " << BLUE << endl;
cout << "WHITE = " << WHITE << endl;
cout << "BLACK = " << BLACK << endl;
//열거형 변수 test에 {}안의 멤버 중의 하나인 BLUE를 지정
test = BLUE;
cout << "test =" << test << "\n\n";


switch (test)
{
case RED:
cout << "빨간색선택\n";
break;
case GREEN:
cout << "초록색선택\n";
break;
case BLUE:
cout << "파란색선택\n";
break;
case WHITE:
cout << "흰색선택\n";
break;
case BLACK:
cout << "검은색선택\n";
break;
default:
break;
}
}

 

typedef

typedef는 이미사용하고 있는 자료형의 이름을 새롭게 지정할 때 사용하는 예약어이다.

예를 들어 int형 WORD형이라는 이름으로 long형을 DWORD형이라는 이름으로 새롭게 정의할 수 있다.

하지만 typedef는 자료형에 대해서만 적용할 수 있는 명령어다

 

typedef을 사용하면 구조체 변수를 선언할 때 struct란 예약어를 사용하지 않을 수 있다.

 

#include<iostream>
using namespace std;

struct sungjuck {
char no[8]; char name[16];
int kor, eng,mat, tot;
double avg;
char level;
int grade;
};
typedef struct sungjuck SJ;

void main() {
SJ s = { "2001019","이진규",85,90,95 };
cout << "학번\t이름\t국어\t영어\t수학\n";
cout << "====================================================\n";
cout << s.no << "\t" << s.name << "\t" << s.kor << "\t" << s.eng << "\t" << s.mat << "\n";
}

 

또한 typedef은 구조체 변수를 선언하는 것과 동시에 typedef 선언도 할 수 있다.

 

1 . struct sungjunk{

char no[8];

char name[16];

int kor,eng,mat,tot;

double avg;

char level;

int grade;

}

typedef struct sungjunk SJ;

 

2.

typedef struct sungjuck{

char no[8];

char name[16];

int kor,eng,mat,tot;

double avg;

char level;

int grade;

} SJ;

 

3.

typedef struct{

char no[8];

char name[16];

int kor,eng,mat,tot;

double avg;

char level;

int grade;

} SJ;

 

1의 문장을 2의 문장으로 기술해도 같은 의미가 된다. 그리고 구조체 선언과 동시에 typedef 선언을 할 경우 3처럼 struct 다음에 태그명을 생략하고 선언할 수 있다. 그렇지만 태그명을 생략해서 선언할 경우 3은 2에 비해 차이가 있다. 3은 구조체를 정의 할 때 struct 다음에 태그명을 명시하지 않았으므로 오로지 SJ로만 구조체 변수를 선언할 수 있다.

 

 

이상으로 포스팅 마무리하겠습니다.

반응형