3장더나은c로서의c++ (2)contents.kocw.or.kr/document/cpp03_cpp as a better c-2.pdf ·...
TRANSCRIPT
C++ 그래 문
3 나 C C++ (2)
라 수
참조(reference)
수에 참조
참조 수
참조 환
linkage 정
과 정
객체 그래
3 나 C C++ (2) 1
1. 라 수
: x, y 값 최 값 환 는 매크 수
// 매크로로 구현한 경
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
int main(void)
{
cout << MIN(4, 5) << endl;
cout << MIN((2 + 3), (1 + 2)) << endl;
return 0;
}
// 함수로 구현한 경
int MIN(int X, int Y)
{
return (X < Y ? X : Y);
}
int main(void)
{
cout << MIN(4, 5) << endl;
cout << MIN((2 + 3), (1 + 2)) << endl;
return 0;
}
main 수는 동 !
X, Y 각각 호( ) 에 는
는?
3 나 C C++ (2) 2
1. 라 수
매크
n 전처리 단계에 당 문 치 à 전처리 담당
n 점 : 실 시 수 빨라짐
n 단점
Ø내 많 경 실 파 크 가 커짐à 내 짧 경 사
Ø 드 가 (readability) 짐
수
n 컴파 시 당 수 주 만 , 실 시 당 주 동
n 단점 : 상 적 수 가 느 짐
수 매크 처럼 동 게 는
n 라 수 (inline function)
Ø 수처럼, 동 매크 처럼à 수 가 빨라짐
Ø 라 수 만드는 : 수 정 시 inline 키워드 추가
ü inline int MIN(int X, int Y) { return X < Y ? X : Y; }
3 나 C C++ (2) 3
1. 라 수
다 제 동 는 것 ? ß 라 수 점
n #define MULTI(X, Y) (X * Y)
n inline int MULTI(int X, int Y) { return (X * Y); }
n MULTI(1 + 2, 3 + 4)를 수 는 경 !
: Factorial 계산 는 Fact 수를 라 수 .
inline int Fact(int n) // 재귀 호출 함수
{
return ((n <= 1) ? 1 : n * Fact(n-1));
}
int main(void)
{
cout << "5! = " << Fact(5) << endl;
return 0;
}
inline 라 수
동 청 는 것
à실제 라 수
동 ( 치) 여 는
컴파 러에 결정
똑똑 컴파 러 : 120 치
똑똑 컴파 러 : 5 * Fact(4) 치
청 컴파 러 : 라 수 포
3 나 C C++ (2) 4
2. 참조
참조 수
n 존 수 또 다른 름. 홀 존 수 .
n 과 동시에 수에 다른 름 초 화 수
n : &
Ø int Var = 2;
Ø int &refVar = Var; // refVar Var는 동 수
: 다 그램 출 결과int main(void){
int var1 = 3;int var2 = 5;int &ref = var1;
ref = 7;cout << "var1 : " << var1
<< ", var2 : " << var2 << ", ref : " << ref << endl;
ref = var2;cout << "var1 : " << var1
<< ", var2 : " << var2 << ", ref : " << ref << endl;
return 0;}
ref var1
동 수
ref에 값 5 !
3 나 C C++ (2) 5
2. 참조
주 사 : 값 나 수식에 참조 가능
n int &ref = a + b; // X
n int &ref = 4; // X
: 출 결과는 무 가?
int main(void){
int var = 2;int &ref1 = var;int &ref2 = ref1;
ref1 = 5;
cout << "var : " << var << endl;cout << "ref1 : " << ref1 << endl;cout << "ref2 : " << ref2 << endl;
return 0;}
3 나 C C++ (2) 6
3. 수에 참조
: 수 포 터 만들
수에 참조
n int (&rSum)(int, int) = sum; // 존 수에 참조
n rSum(3, 4); // sum 수 동 게 사 가능
int sum(int x, int y) { return (x + y); }
int main(void)
{
int (*pSum)(int, int); // 함수 포인터
pSum = sum; // sum 함수를 가리킴
cout << pSum(3, 4) << endl;
return 0;
} sum 수 동 게 사 가능
3 나 C C++ (2) 7
3. 수에 참조
: 참조 수( 수 참조 포 ) 다 사
int sum(int x, int y) { return (x + y); }
int main(){
int a;int &b = a;int *p = &b; // 여기서 &는 주소연 자임. 결국 a의 주소가 입int &c = b; // a, b, c는 동일한 변수c = 5; // a = 5; 동일cout << "a : " << a << endl;cout << "b : " << b << endl;cout << "*p : " << *p << endl;cout << "c : " << c << endl;
int (&rSum)(int, int) = sum; // 함수에 한 참조cout << rSum(c, 5) << endl;
int ary[3] = { 0 };int (&rAry)[3] = ary; // 배열에 한 참조rAry[2] = c;cout << ary[0] << " " << ary[1] << " " << ary[2] << endl;
return 0;}
3 나 C C++ (2) 8
4. 참조 수
: 포 터를 swap 수
참조를 사 여 swap 수를 다 ?!
void swap(int *x, int *y) // 참조에 의한 전달{
int temp = *x;*x = *y;*y = temp;
}
int main(void){
int a = 3, b = 4;swap(&a, &b); // 주소 전달
cout << "a = " << a << endl;cout << "b = " << b << endl;
return 0;}
3 나 C C++ (2) 9
4. 참조 수
참조를 swap 수 à 정 참조에 전달
형식매개 수 참조 수를 사 는 경
n 점 : 상
n 점 단점 : 형식매개 수 경 시 실매개 수 경
Ø void sum(const int &x, const int &y); // x, y 값 경 시 에러 생
void swap(int &x, int &y) // 정한 참조에 의한 전달{
int temp = x;x = y;y = temp;
}
int main(void){
int a = 3, b = 4;swap(a, b); // 변수 자체 전달
cout << "a = " << a << endl;cout << "b = " << b << endl;
return 0;}
3 나 C C++ (2) 10
5. 참조 환
수값 환 원리
int sum(int x, int y){
int z = x + y;return z;
}
int main(void){
int a = 3, b = 4;int result = sum(a, b);cout << result << endl;
return 0;}
① z에 시 수 생
② 역 수 z 리 제
③ 시 수 전달
④ 시 수 후 시 수 리 제
3 나 C C++ (2) 11
5. 참조 환
참조 환 가능 가? 것 무 미 는가?
n 다 는 수값 환 ! 참조 환 님!
n 다 가 참조 환 !
int sum(int x, int y)
{
int z = x + y;
int &refZ = z; // refZ z는 동일한 변수
return refZ; // return z; 동일, z값 반환
}
int &sum(int x, int y) // 참조의 반환
{
int z = x + y;
return z; // z 변수 자체 반환
}
경 z 수 체를 환
그러나 역 수는 사라 게
므 효 .
à참조를 환 는 효 는?
à 에 쓰는가?
3 나 C C++ (2) 12
5. 참조 환
참조를 환 는 효
n 전역 수
참조 환
n 참조 전달 수 참조 환
int z;
int &sum(int x, int y) // 참조의 반환{
z = x + y;return z; // z 변수 자체 반환
}
int &min(int &x, int &y) // 매개변수 참조 전달 및 참조 반환{
return ((x < y) ? x : y);}
int main(void){
int a = 3, b = 4;min(a, b) = 5;cout << "a = " << a << endl;cout << "b = " << b << endl;
return 0;}
수 호출 문 에 수 는가?
à참조( 수그 체)를 환 문에
가능!
à결 a = 5; 동
3 나 C C++ (2) 13
5. 참조 환
참조 환 에 쓰는가?
n 7 연산
참조 환 사
int &GetArray(int *ary, int index) // 참조 반환{
return ary[index]; // index에 해당하는 변수 자체 반환}
int main(void){
int i;int ary[5];
for (i = 0; i < 5; i++)GetArray(ary, i) = i; // ary[i] = i; 동일
for (i = 0; i < 5; i++)cout << "ary[" << i << "] " << GetArray(ary, i) << endl;
return 0;}
3 나 C C++ (2) 14
5. 참조 환
다 그램 문제점 무 가?
int &GetVar(void)
{
int var = 5;
return var; // 역 변수 var 자체 반환
}
int main(void)
{
int &value = GetVar();
value = 3;
cout << value << endl;
return 0;
}
실 수 나
역 수 참조 환
른 사 님
3 나 C C++ (2) 15
6. linkage 정
C C++ 수 호출문에 컴파 결과à linkage
n C : 수 름만 저 ß 수 므
가능
n C++ : 수 름 + 매개 수 정보 저 ß 수
à mangled name
C++에 C 라 브러리 수를 호출 는 경
n C : int func(int a); à func라는 름 연결 가능
n C++ : func(3); à func+매개 수정보 linkage
n 수 호출과 수 사 mismatch 생 à 호출 가!
C++ 컴파 시 수 호출문 C 형식 컴파
n linkage 정 : extern “C” 사
n extern “C” int func(int a); à 수 (func)만 linkage
3 나 C C++ (2) 16
6. linkage 정
linkage 정
C++에 는 게 C 라 브러리 사 가능 ?
n : #include <stdio.h>
n stdio.h 파 내에는 미
extern “C”
Ø 에 라 C++ 형식
컴파 시에는 동 게
extern "C" int func(int a); extern "C" {
int func(int a);
int myfunc(void);
void mysort(int *ary, int count);
}
에 정
extern "C" {
#include "clib.h"
}
존 라 브러리에 정
#ifdef __cplusplus
extern "C" {
#endif
......
#ifdef __cplusplus
}
#endif
stdio.h
C++ 컴파 시
_cplusplus가
동 정
3 나 C C++ (2) 17
6. linkage 정
다 그램에 느 수에만 extern “C”를 정 는 경
수 extern “C”를 정 는 경 에 컴파 보라.
int sum(int x, int y)
{
return (x + y);
}
double sum(double x, double y)
{
return (x + y);
}
int main(void)
{
cout << sum(1, 2) << endl;
cout << sum(1.1, 2.2) << endl;
return 0;
}
3 나 C C++ (2) 18
7. 과 정
(declaration)
n 식 타 정보를 컴파 러에게 림
n 컴파 는 식 사 전에
n
int a;
extern int count = 1; // extern이라 값이 입 다 선언 & 정의가
int func(int x) { return (x * x); } // 함수의 체가 는 경 선언 & 정의
struct Point { int x; int y; };
struct XCount {
int x;
static int count; // static 버변수는 선언일 뿐 정의는 아님
};
int XCount::count = 1; // static 버변수는 시적으로 에 정의해야
// 초기화는 값은 없어 => 이 경 0으로 초기화
XCount anX;
enum { up, down };
namespace NS { int var; }
namespace NAnother = NS; // NAnother NS는 동일한 네임스페이스임
경 를 제 고 동시에 정 !
3 나 C C++ (2) 19
7. 과 정
“정 다” 립O, “ 정 다” 립X
만 정 가 닌 경
① 수 체를 술 수, , 수 토타
② extern 수. 단, 초 화 문 포 정 가
③ extern 수. 단, 수 체를 포 정 가
④ 클래스 또는 조체 내에 static 수
⑤ 클래스 또는 조체 ( 조체 전체를 미 는 것 님)
⑥ typedef
⑦ using
extern int count;
int func(int);
struct Point;
typedef int MyInt;
using NS::var;
정 가 닌
3 나 C C++ (2) 20
7. 과 정
컴파 는ß 파 단
n 파 내에 사 고 는 식 1 상 등
n 여러 등 경 식 타 동
링크가 는ß 젝트 단
n 당 식 에 정 가 스 파 들 가에 단 등
n ODR(One-Definition Rule)
extern int count;extern int count; // (O) 선언은 2번 이 나 수 있음
extern char count; // (X)
int x;
int x; // (X) 복해서 정의 어 있음, C 언어에서는
int x = 5;
int x = 3; // (X), C 언어에서 안
3 나 C C++ (2) 21
7. 과 정
다 파 그래 에 ODR 는
g_var1, g_var2, sum
2 정
3 나 C C++ (2) 22
7. 과 정
다 파 그래 에 ODR 달
#ifdef __MYMAIN#define EXTERN#else#define EXTERN extern#endif
EXTERN int count; // __MYMAIN 정의 여 에 따라 extern 추가 또는 제struct Point {
int x;int y;
};
#define __MYMAIN#include "header.h"
int main(void){
Point P1;count = 1;
}
#include "header.h"
void func(int a){
Point P2;count = 5;
}
header.h
main.cpp point.cpp
3 나 C C++ (2) 23
7. 과 정
ODR
n 그래 편 를 다 에 정 는 ODR 르
Ø 조체, 열거체, 라 수, 클래스, 템 릿
n 나 스 파 내에는 단 정 가
n 나 그램 내에는 2 상 정 가능
Ø단, 조가 동
Ø다 경 에는 다른 조체 식
a.cpp : struct Point { int x; int y; };b.cpp : struct Point { int x; };
3 나 C C++ (2) 24
8. 객체 그래
1 : “LEGO Digital Designer”
개 블 들 조립 여
큰 조물 형
개 블 만들
는다 … !
3 나 C C++ (2) 25
8. 객체 그래
2 : 컴퓨터 조립
n 보드, CPU, 리, 그래 카드, 사 드카드, 드 스크 …
n 존 새 체 가능 à 터페 스만 같다
객체 그래
n 터 추상화(data abstraction) à 추상 터형
Ø 터 드
ØC++에 추상 터형 : 클래스à 생 수 : 객체
ü 고 : 클래스 – 블 찍 내는 틀, 객체 – 각 블
ü 컴퓨터 : 클래스 – 찍 내는 틀, 객체 – 각
n 상 (inheritance)
Ø컴퓨터 : 존 과 사 새 만들 경
ü 존 능 그 고 추가 또는 경 만 수정
ü 존 동 고 새 동
3 나 C C++ (2) 26
8. 객체 그래
객체 그래 (계 )
n 다형 (polymorphism)
Ø 컴퓨터 : A 터 상 B, C를 만든 경 , f라는 능
가 고 다. 보드 에 는 A에 f를 수 실제 A, B,
C냐에 라 각 에 맞는 f가 수 고 싶다.
Ø 동적 술 적
C++ 화 그래 (generic programming)
n 객체 그래 과는 또 다른 특징
Ø 나 수나 클래스가 특정 타 에 고 다 타 에 적 수
는 것
n : 템 릿
n 클래스 객체 : 4~7
n 상 : 8
n 다형 : 9
n 템 릿 : 10