제2장 C 언어의 확장 C++(1)
구조체 정의 구조체를 구성하는 하나 하나의 항목을 구조체 멤버(구성요소, member) 구조체 멤버의 자료형은 일반 변수, 포인터 변수, 구조체 변수 및 구조체 포인터도 허용 구조체 정의 구문에서는 각 구성요소의 초기값을 대입할 수 없다. 한 구조체 내부에서 선언되는 구조체 멤버의 이름은 모두 유일해야 한다. 이러한 구조체의 정의는 구조체 struct book을 새로운 자료형으로 정의하는 구문
구조체 변수 선언 구조체 정의 구문이 이미 기술되었으면, 그 이후에는 구조체에 대한 변수 선언이 가능 구조체 변수 선언 방법은 자료형에 해당하는 struct book 다음에 구조체 변수 이름 mybook을 기술 위의 구문을 살펴보면 구조체 struct book의 정의 위치가 메인 함수의 상위 부분이기 때문에, 정의 구문이 나온 이후에는 구조체 자료형 struct book은 파일 어디에서나 이용이 가능
구조체의 저장공간 구조체 book의 변수인 mybook은 멤버의 여러 자료형이 하나로 묶인 변수로서 다음과 같은 구조로 메모리에 할당 위 변수의 크기는 각 멤버의 크기의 합(50+50+50+4+4=158)으로 158 바이트 정도 연산자 sizeof를 이용하여 변수의 크기 또는 구조체의 크기를 알 수 있음 위와 같이 sizeof 연산자를 이용하면 예상한 구조체의 크기보다 큰 값이 나올 수 있으며 시스템마다 차이가 있을 수 있음 printf("struct book의 사이즈는 sizeof (struct book) = %d\n\n", sizeof (struct book) );
구조체 정의와 변수 선언 구조체 변수를 선언하는 다른 방법은 다음과 같이 구조체 정의와 변수 선언을 함께하는 방법 위 구문에서 변수 yourbook과 mybook은 모두 같은 구조체 struct book 자료형 위 구조체 정의 구문에서 구조체 태그 이름 book을 생략해도 구조체 변수 선언이 가능
공용체 정의 공용체 union data를 정의하는 구문 공용체는 서로 다른 자료형을 동일한 저장 공간에 이용하는 자료형 구조체 정의에서 키워드 struct를 union으로 사용한 것과 비슷 공용체의 멤버는 모든 멤버가 동일한 저장 공간을 사용하므로 동시에 여러 멤버의 값을 저장하여 이용할 수 없으며, 마지막에 저장한 하나의 멤버의 자료 값만을 저장 union data { char ch; int cnt; double real; };
공용체 메모리 내부 메모리 동일한 저장장소를 함께 이용 공용체 union data 자료형의 변수 data1은 멤버의 유형이 char, int, double이므로 멤버 중 가장 큰 크기인 double 형의 8바이트를 공용체의 저장공간으로 확보하여 세 개의 멤버가 함께 이용 동일한 저장장소를 함께 이용 멤버가 char인 경우는 8바이트 중에서 첫 1바이트만 이용하고, int인 경우는 전체 공간의 첫 4바이트만 이용하며, double인 경우는 8바이트 공간을 모두 사용 union data { char ch; int cnt; double real; } data1 ;
공용체 예제소스 #include <stdio.h> void main() { union data { char c; short int s; long l; }u; u.l = 0x12345678; printf(" %x \n" , u.l); printf(" %x \n" , u.s); printf(" %x \n" , u.c); }
변수의 범위 지정 연산자 C 언어에서는 자동변수(지역변수)와 외부변수(전역변수)가 같은 이름으로 선언되어 사용되었을 때에는 자동변수의 값이 참조 C++ 언어에서는 이와 같은 경우 변수 앞에 :: 연산자를 해당변수 앞에 기술하면 외부변수를 참조하는 것이 가능
예제 2.4 범위 지정 연산자 사용 예 // Ex2_4.cpp #include <iostream.h> int a = 88; main() { int a = 30; int a = 10; cout << "1-1 a = " << a << "\n"; // a = 10 참조 cout << "1-2 ::a = " << ::a << "\n"; // a = 88 참조 int a = 20; cout << "2-1 a = " << a << "\n"; // a = 20 참조 cout << "2-2 ::a = " << ::a << "\n"; // a = 88 참조 } cout << "3-1 a = " << a << "\n"; // a = 30 참조 cout << "3-2 ::a = " << ::a << "\n"; // a = 88 참조 1-1 a = 10 1-2 ::a = 88 2-1 a = 20 2-2 ::a = 88 3-1 a = 30 3-2 ::a = 88 :: 연산자는 블럭의 위치 에 관계없이 외부변수를 참조한다.
예제 2.7 태그명이 생략된 공용체 사용 예(1) // Ex2_7.cpp #include <iostream.h> enum sex { MALE, FEMALE }; struct man { char name[20]; sex s; int age; union { // 태그명이 생략된 공용체 선언 long salary; float fee; }; main() { man teacher, student = { "Lee", MALE, 15}; teacher = student; // 구조체 복사
예제 2.7 태그명이 생략된 공용체 사용 예 (2) teacher.age = 35; teacher.salary = 125; cout << "teacher " << teacher.name << ' '; cout << teacher.age << ' ' << teacher.salary; if (teacher.s == MALE) cout << " male\n"; else cout << " female\n"; student.fee = 93.45; cout << "student " << student.name << ' '; cout << student.age << ' ' << student.fee; if (student.s == MALE) } teacher Lee 35 125 male student Lee 15 93.449997 male
함수의 중복정의 함수의 중복 정의 (function overloading) 같은 이름을 갖는 각 함수는 인수의 형과 갯수, 함수의 반환형에 의해 구분 함수 뿐만 아니라 연산자의 중복 정의도 가능한데 이에 관한 자세한 소개는 5장에서 소개
예제 2.9 함수의 중복 정의 // Ex2_9.cpp #include <iostream.h> void date(char *date); // 문자열형의 날짜출력 함수 void date(int year,int month,int date); // 정수형의 날짜출력 함수 main() { date("1994.10.5"); date(1994,10,5); } // 문자열형 인수의 date() 함수 void date(char *date) cout << "Date: " << date << '\n'; // 정수형 인수의 date() 함수 void date(int y,int m,int d) { cout << "Date: " << y << '.'; cout << m << '.' << d << '\n'; } Date: 1994.10.5 날짜를 출력하는 함수 date()가 같은 이름으로 중복 정의 되었 고 함수의 구분은 인수의 형과 갯수로 구분된다.
인수의 디폴트 값 선언 C++ 언어에서는 함수 선언 시 인수의 디폴트(default) 값을 지정 디폴트 값이 지정된 인수는 함수 호출 시 인수를 생략 인수가 생략된 경우에는 자동적으로 디폴트 값으로 선언된 값을 인수로 전달 인수의 디폴트 값의 선언 시 디폴트 값이 선언된 인수 뒤에 오는 모든 인수에 대해서는 디폴트 값을 지정해야 함 void func(char c=‘A’, int n=10, float f=12.3, char *s=“cat”); 모든 인수 생략 가능 void func(char c, int n, float f=12.3, char *s=“cat”); f,s 인수 생략 가능 void func(char c=‘A’, int n=10, float f=12.3, char *s); 인수 s 앞에 디폴트 값이 지정되어 에러 void func(char c=‘A’, int n=10, float f, char *s=“cat”); 인수 f 앞에 디폴트 값이 지정되어 에러
예제 2.10 인수의 디폴트 값 선언 예 // Ex2_10.cpp #include <iostream.h> void out_num(int start, int end = 10); // 인수 end의 디폴트 값 지정 main() { cout << "normal : "; out_num(1,5); // 정상 호출 cout << "default : "; out_num(1); // 인수 생략 호출 } void out_num(int s, int e) for (int i = s; i <= e; i++) cout << i << ' '; cout << '\n'; normal : 1 2 3 4 5 default : 1 2 3 4 5 6 7 8 9 10 함수 out_num(1,5)와 같이 두 인수 값을 모두 기술하여 호출하는 경우에는 디폴 트 값에 관계없이 정상적으로 인수가 호 출된다. out_num(1)과 같이 두번째 인수 가 생략된 경우에는 두번째 인수의 디폴 트 값 10이 전달된다.
연습문제 2.2 문제 수정 /* 이 프로그램은 최대 공약수를 계산한다. */ #include <stdio.h> main() { int a, b, d, min; printf("두 수를 입력하시오 : "); scanf("%d %d", &a, &b); min = a > b ? b : a; for (d = min; d > 1; d--) if (((a%d == 0) && ((b%d) == 0))) break; if (d == 1) printf("최대 공약수가 없습니다\n"); else printf("최대 공약수는 %d\n", d); }
연습문제 2.5 작성 연습문제 2.5를 작성하여 실행