3장더나은c로서의c++ (2)contents.kocw.or.kr/document/cpp03_cpp as a better c-2.pdf ·...

27
C++ 프로그래밍 입문 3장 나은 C로서의 C++ (2) 인라인 함수 참조(reference)의 이해 함수에 대한 참조 참조와 함수 참조의 반환 linkage 지정 선언과 정의 객체지향 프로그래밍

Upload: others

Post on 15-Jan-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

C++ 그래 문

3 나 C C++ (2)

라 수

참조(reference)

수에 참조

참조 수

참조 환

linkage 정

과 정

객체 그래

Page 2: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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 각각 호( ) 에 는

는?

Page 3: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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; }

Page 4: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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) 치

청 컴파 러 : 라 수 포

Page 5: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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 !

Page 6: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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;}

Page 7: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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 수 동 게 사 가능

Page 8: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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;}

Page 9: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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;}

Page 10: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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;}

Page 11: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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 리 제

③ 시 수 전달

④ 시 수 후 시 수 리 제

Page 12: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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 수 체를 환

그러나 역 수는 사라 게

므 효 .

à참조를 환 는 효 는?

à 에 쓰는가?

Page 13: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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; 동

Page 14: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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;}

Page 15: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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;

}

실 수 나

역 수 참조 환

른 사 님

Page 16: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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

Page 17: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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가

동 정

Page 18: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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;

}

Page 19: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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는 동일한 네임스페이스임

경 를 제 고 동시에 정 !

Page 20: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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;

정 가 닌

Page 21: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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 언어에서 안

Page 22: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

3 나 C C++ (2) 21

7. 과 정

다 파 그래 에 ODR 는

g_var1, g_var2, sum

2 정

Page 23: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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

Page 24: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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; };

Page 25: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

3 나 C C++ (2) 24

8. 객체 그래

1 : “LEGO Digital Designer”

개 블 들 조립 여

큰 조물 형

개 블 만들

는다 … !

Page 26: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

3 나 C C++ (2) 25

8. 객체 그래

2 : 컴퓨터 조립

n 보드, CPU, 리, 그래 카드, 사 드카드, 드 스크 …

n 존 새 체 가능 à 터페 스만 같다

객체 그래

n 터 추상화(data abstraction) à 추상 터형

Ø 터 드

ØC++에 추상 터형 : 클래스à 생 수 : 객체

ü 고 : 클래스 – 블 찍 내는 틀, 객체 – 각 블

ü 컴퓨터 : 클래스 – 찍 내는 틀, 객체 – 각

n 상 (inheritance)

Ø컴퓨터 : 존 과 사 새 만들 경

ü 존 능 그 고 추가 또는 경 만 수정

ü 존 동 고 새 동

Page 27: 3장더나은C로서의C++ (2)contents.kocw.or.kr/document/CPP03_CPP as a Better C-2.pdf · 2012-06-18 · 3장더나은C로서의C++ (2) 2 1. 인라인함수 매크로 n 전처리단계에서해당문장으로대치à전처리기담당

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