스트림 입출력 변수,상수,형변환 열거형, 구조체, 공용체 함수 참조자 (reference) 동적할당,해제 과제 제2장 C 언어의 확장 C++ 스트림 입출력 변수,상수,형변환 열거형, 구조체, 공용체 함수 참조자 (reference) 동적할당,해제 과제 순천향대학교 정보기술공학부 이 상 정 1
C 언어의 확장 C++ 언어 객체지향 프로그래밍을 제외한 기존 C 언어의 확장된 언어 소개 스트림 입출력 블록 내 변수 선언, 변수 범위 지정 연산자, 형변환 열거형,구조체,공용체 선언 시 키워드 생략 태그명 생략 공용체 함수의 중복정의 함수 선언 시 인수의 디폴트 값 선언 확장함수(inline function) 참조자(reference) 동적할당,해제 연산자 new, delete 순천향대학교 정보기술공학부 이 상 정 2
스트림 입출력 순천향대학교 정보기술공학부 이 상 정 3
입출력 연산자 C++ 언어에서는 스트림 입출력 연산자를 사용하여 표준 입출력 스트림(stream)이란 물리적인 입출력 장치를 입출력이 순서대로 이루어지는 가상의 통로로 정의 cin, cout, cerr로 정의된 예약어와 <<, >> 스트림 연산자와 함께 사용 표준입력 #include <iostream.h> cin >> 변수 [ >> 변수 …… ]; 표준출력 #include <iostream.h> cout << 식 [ << 식 ……]; 표준에러출력 #include <iostrem.h> cerr << 식 [ << 식 ……]; 순천향대학교 정보기술공학부 이 상 정 4
예제 2.1 스트림 입출력 예 1 // Ex2_1.cpp #include <iostream.h> main() { int x,y; float z; // 두 정수값 입력 cout << "두 정수 입력 : "; cin >> x; cin >> y; z = (float)x/y; // 결과 출력 cout << "z = "; cout << z; cout << '\n'; } 두 정수 입력 : 10 3 z = 3.333333 순천향대학교 정보기술공학부 이 상 정 5
예제 2.2 스트림 입출력 예 2 // Ex2_2.cpp #include <iostream.h> main() { int x,y; cout << "두 정수 입력 : "; cin >> x >> y; cout << "z = " << (float)x/y << '\n';} 두 정수 입력 : 10 3 z = 3.333333 순천향대학교 정보기술공학부 이 상 정 6
변수,상수,형변환 순천향대학교 정보기술공학부 이 상 정 7
블록 내 변수 선언 C 언어에서는 함수나 블록의 시작에서 미리 사용할 변수를 선언해야 했으나 C++ 언어에서는 변수가 사용되는 블록 내의 문장 앞에서 바로 선언하여 사용 가능 // Ex2_3.cpp #include <iostream.h> main() { int sum = 0; for (int i = 1; i <= 10; i++) // 블럭 내 변수 선언 sum += i; cout << "sum = " << sum << '\n'; } sum = 55 변수 i를 처음 사용하는 위치인 for 문 내에서 선언이 가능하다. 순천향대학교 정보기술공학부 이 상 정 8
변수의 범위 지정 연산자 C 언어에서는 자동변수(지역변수)와 외부변수(전역변수)가 같은 이름으로 선언되어 사용되었을 때에는 자동변수의 값이 참조 C++ 언어에서는 이와 같은 경우 변수 앞에 :: 연산자를 해당변수 앞에 기술하면 외부변수를 참조하는 것이 가능 순천향대학교 정보기술공학부 이 상 정 9
예제 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 :: 연산자는 블럭의 위치 에 관계없이 외부변수를 참조한다. 순천향대학교 정보기술공학부 이 상 정 10
명시적 형변환 C 형변환 C++ 형변환 (변환형)식 (float)x; 변환형(식) float(x) // Ex2_5.cpp #include <iostream.h> main() { float a,b; a = 12.345; b = int(a); // 명시적인 형변환 cout << "a = " << a << '\n'; cout << "b = " << b << '\n'; } a = 12.345 b = 12 순천향대학교 정보기술공학부 이 상 정 11
열거형,구조체,공용체 순천향대학교 정보기술공학부 이 상 정 12
키워드 생략 enum chrom { black, blue, red, yellow, white }; struct man { char name[20]; char sex; int age; } union utag { char c; short s; long l; }; C 변수선언 enum chrom color; struct man teacher; union utag val; C++ 변수선언 chrom color; man teacher; utag val; 순천향대학교 정보기술공학부 이 상 정 13
예제 2.6 열거형,구조체 키워드 생략 예 // Ex2_6.cpp #include <iostream.h> enum sex { MALE, FEMALE }; // 열거형 상수 선언, MALE = 0, FEMALE = 1 struct man { // 구조체 선언 char name[20]; sex s; // 열거형 변수 선언 int age; }; main() { man teacher, student = { "Lee", MALE, 15}; // 구조체 변수 선언 teacher = student; // 구조체 복사 teacher.age = 35; cout << teacher.name << '\n' << teacher.age << '\n'; if (teacher.s == MALE) cout << "male"; else cout << "female"; cout << '\n'; } Lee 35 male 순천향대학교 정보기술공학부 이 상 정 14
예제 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; // 구조체 복사 순천향대학교 정보기술공학부 이 상 정 15
예제 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 순천향대학교 정보기술공학부 이 상 정 16
함수 순천향대학교 정보기술공학부 이 상 정 17
함수의 중복정의 함수의 중복 정의 (function overloading) 같은 이름을 갖는 각 함수는 인수의 형과 갯수, 함수의 반환형에 의해 구분 함수 뿐만 아니라 연산자의 중복 정의도 가능한데 이에 관한 자세한 소개는 5장에서 소개 순천향대학교 정보기술공학부 이 상 정 18
예제 2.8 함수의 중복 정의 예 1 // Ex2_8.cpp 절대값 함수의 중복 정의 #include <iostream.h> int abs(int n); // 정수의 절대값 함수 double abs(double n); // double 형 실수의 절대값 함수 main() { cout << "-123 절대값 : " << abs(-123) << '\n'; cout << "-12.345 절대값 : " << abs(-12.345) << '\n'; } // 정수형 인수의 abs() 함수 int abs(int n) return n < 0 ? -n : n; // double 정수형 인수의 abs() 함수 double abs(double n) { return n < 0 ? -n : n; } -123 절대값 : 123 -12.345 절대값 : 12.345 절대값을 구하는 2개의 함수가 모두 같은 이름의 abs()로 사용 되었으나 각 함수는 서로 다른 인수의 형에 따라 구분된다. 순천향대학교 정보기술공학부 이 상 정 19
예제 2.9 함수의 중복 정의 예 2 // 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()가 같은 이름으로 중복 정의 되었 고 함수의 구분은 인수의 형과 갯수로 구분된다. 순천향대학교 정보기술공학부 이 상 정 20
인수의 디폴트 값 선언 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 앞에 디폴트 값이 지정되어 에러 순천향대학교 정보기술공학부 이 상 정 21
예제 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이 전달된다. 순천향대학교 정보기술공학부 이 상 정 22
확장함수 (inline function) 확장함수를 이용하여 정의된 함수를 호출하면 호출한 함수로 분기하여 함수를 실행한 후 복귀하는 것이 아니라 호출한 함수의 내용을 복사하여 실행 C 언어의 매크로 정의함수를 사용하는 것과 같은 기능 매크로 정의함수인 경우 인수의 전달 시 부작용(side effect)을 갖는 데 반하여 확장함수는 일반함수와 같이 부작용 없이 안전하게 사용 확장함수는 일반함수와 같이 함수로 분기하여 실행한 후 복귀하는 과정이 없이 직접 실행하므로 일반함수 보다 프로그램의 실행속도가 빠름 함수를 호출할 때 마다 함수의 내용이 복사되므로 프로그램의 코드 길이가 길어진다는 단점 일반적으로 확장함수는 코드의 길이가 짧은 경우에 주로 사용 확장함수의 정의는 함수 정의 앞에 inline이란 키워드를 붙임 순천향대학교 정보기술공학부 이 상 정 23
예제 2.11 확장함수 사용 예 // Ex2_11.cpp 매크로 정의함수와 확장함수 비교 예 #include <iostream.h> #define dsqr(x) ((x) * (x)); // 매크로 정의함수 inline int isqr(int x) // 확장함수 { return x * x; } main() int a,b; a = 2; b = dsqr(++a); cout << "macro : " << b << "\n"; b = isqr(++a); cout << "inline : " << b << "\n"; macro : 16 inline : 9 매크로인 경우 ((++a)*(++a))로 단 순 확장되어 4*4로 계산되어 예상 하지 않은 16의 결과 – 컴파일러 에 따라서는 3*4=12로 계산될 수 도 있다 - 를 얻었지만 확장함수인 경우에는 마치 일반 함수를 실행하 는 것과 똑같이 3*3으로 계산되어 9의 결과가 얻어짐을 알 수 있다. 순천향대학교 정보기술공학부 이 상 정 24
참조자 (reference) 순천향대학교 정보기술공학부 이 상 정 25
참조자 선언 참조자는 한 변수를 여러 개의 다른 이름을 사용하여 참조하는 것으로 이미 정의된 변수를 다른 이름의 참조자로 사용 자료형 &참조자 = 변수 ; int a = 1; int &b = a; float x, &y = x; y =12.5; cout << x; struct man { char name[20]; char sex; int age; }; man teacher; man &student = teacher; 순천향대학교 정보기술공학부 이 상 정 26
예제 2.12 참조자 사용 예 #include <iostream.h> main() { int a, b = 10; int &c = a, &d = b; // c,d는 변수 a,b의 참조자 a = 5; cout << "a: " << a << "\tb : " << b << '\n'; cout << "c: " << c << "\td : " << d << "\n\n"; ++a; --b; ++c; --d; cout << "c: " << c << "\td : " << d << '\n'; } a: 5 b : 10 c: 5 d : 10 a: 6 b : 9 c: 6 d : 9 a: 7 b : 8 c: 7 d : 8 순천향대학교 정보기술공학부 이 상 정 27
참조자 인수 전달 함수의 정의 시 가인수를 참조자로 정의하면 주소에 의한 인수전달(call by reference) 함수 내에서 가인수인 참조자의 변경은 함수 호출 시의 인수인 실인수를 변경 기존 C 언어의 포인터를 이용하여 인수를 전달과 동일하나 함수 내에서 * 연산자를 사용하여 포인터 변수임을 명시해야 하는 번거로움 제거 int a; func(a); …… void func(int &x) { } 순천향대학교 정보기술공학부 이 상 정 28
예제 2.13 함수의 인수로써 참조자 사용 예 // Ex2_13.cpp 두 수의 교환 #include <iostream.h> void swap(int &,int &); // 두 정수형 참조자 인수를 갖는 함수 main() { int a = 3, b = 10; swap(a,b); cout << "a = " << a << '\n'; cout << "b = " << b << '\n'; } void swap(int &x, int &y) int temp; temp = x; // x와 y의 교환 x = y; y = temp; a = 10 b = 3 함수 swap()의 인수가 참조자 로 선언되었으므로 인수의 전 달이 주소로 전달되어 함수 swap()에서 교환된 값이 main()에 그대로 전달되어 출 력된다. C 언어에서 포인터를 사용하여 swap(int *, int *)으 로 인수를 정의하면 동일한 효과를 낼 수 있지만 호출 시 인수 a, b의 변수명을 그대로 사용할 수 없고 포인터 (&a,&b)로 전달해야 하고, swap() 함수에서 *x, *y로 표현해야 한다. 순천향대학교 정보기술공학부 이 상 정 29
참조자의 반환 참조자는 함수의 반환형으로도 선언돠어 사용 주소가 반환 함수 호출 시 함수는 대입 연산자(=)의 좌우측 어느 자리에도 올 수 있음 // Ex2_14.cpp #include <iostream.h> int &func(void); // 정수형의 참조자를 반환하는 함수 int x = 88; main() { func() = 100; // 함수 func()의 반환 참조자(x)에 100 대입 cout << "x : " << x << "\n"; } int &func(void) { return x; } x : 100 함수 func()는 x의 참조자를 반환하므로 따라서 함수 func() = 100은 x = 100과 같 은 의미를 갖는다. 순천향대학교 정보기술공학부 이 상 정 30
동적할당, 해제 순천향대학교 정보기술공학부 이 상 정 31
동적할당,해제 프로그램의 시작에서는 필요한 메모리의 크기를 모르고 프로그램이 실행되는 동안에 그 크기가 결정되거나 메모리를 효율적으로 사용하기 위해서는 프로그램 실행 시에 메모리를 동적할당(dynamic allocation) C 언어 void *malloc(자료형 크기); void *calloc(자료형 개수,자료형 크기); C++ 언어 new 자료형; new 자료형[자료형 개수]; C 언어 void free(변수); C++ 언어 delete 변수; 순천향대학교 정보기술공학부 이 상 정 32
동적할당,해제예 long int 형 (4 바이트) 동적할당, 해제 C 언어 long *p = malloc(sizeof(long)); …… free(p); C++ 언어 long *p = new long; …… delete p; long int 형 10개 (40 바이트) 동적할당, 해제 C 언어 long *p = calloc(10,sizeof(long)); …… free(p); C++ 언어 long *p = new long[10]; …… delete p; 순천향대학교 정보기술공학부 이 상 정 33
예제 2.15 동적할당, 해제 예 1 // Ex2_15.cpp #include <iostream.h> struct date { int yy; int mm; int dd; }; main() { date *birth = new date; // 동적할당 birth->yy = 1960; birth->mm = 6; birth->dd = 3; cout << "birthday : " << birth->yy << '.' << birth->mm << '.' << birth->dd << ".\n"; delete birth; // 동적해제 } birthday : 1960.6.3. 포인터 변수 birth 선언 시 date 형 의 구조체 크기 만큼 메모리를 할 당하여 초기화하였다. new 연산자 는 C의 다음 문과 같은 기능을 갖 는다. struct date *birth = (struct date *)malloc(sizeof(date)); 해제 시에는 delete는 C의 다음 문과 같다. free(birth); 순천향대학교 정보기술공학부 이 상 정 34
예제 2.16 동적할당, 해제 예 2 // Ex2_16.cpp #include <iostream.h> main() { cout << "size 입력 : "; int size; cin >> size; int *vector = new int[size]; // 동적할당 for (int i = 0; i < size; i++) vector[i] = i * i; for (i = 0; i < size; i++) cout << vector[i] << ' '; cout << '\n'; delete vector; // 동적해제 } size 입력 : 5 0 1 4 9 16 이에 해당하는 C의 구문은 다음과 같다. int *vector = (int *)calloc(size,sizeof(int)); 순천향대학교 정보기술공학부 이 상 정 35
과제 다음 예제를 작성하여 실행 다음 연습문제를 작성하여 실행하고 프로그램 및 결과 설명 (홀수 문제는 교재에 답안있음) 2.3 2.4 2.7 2.9 2.10 2.11 2.13 2.16 다음 연습문제를 작성하여 실행하고 프로그램 및 결과 설명 (홀수 문제는 교재에 답안있음) 2.2 2.5 2.11 과제 작성 요령 순천향대학교 정보기술공학부 이 상 정 36
과제 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); } 순천향대학교 정보기술공학부 이 상 정 37