피씨컴의 기울어진 공관

● 함수의 호출 우선순위

 

함수 오버로딩 호출에 대한 우선순위 1 정확한 타입이 정확히 일치 , 2상위의 진급형태(char shot stort int int)

 

메크로 < 일반 지역함수 (1순위 : inline 함수 2순위 일반함수)  < 일반 전역함수 (1순위 : inline함수 2순위 :일반함수) < 특수화템플릿 < 템플릿 함수

 

- 매크로함수는 전처리기로처리가 되고, 인라인 함수는 컴파일러에 의해 처리가 되기 때문에 메크로 함수가 우선된다.

- 지역함수는 해당 지역부터 먼저 함수를 검색하여 이후 밖으로 나가 전역함수를 검색하게 된다.

 

 

기본적인 시그너처 매칭 알고리즘(인수 일치 알고리즘)

※  시그너처 : 함수가 갖는 파라미터들의 리스트를 가리킴.

 

1. 가능하면 정확히 일치되는 것을 찾는다.

2. 표준 형 증진을 시도한다.

3. 표준 형 변환을 시도한다.

4. 사용자 정의 형 변환을 시도한다.

5. 생략부호에 대한 매칭이 있다면 그것을 이용한다.

 

오버로딩딘 함수 선택 알고리즘

1. 비템플릿 함수에 대해 기본 형 변환을 허용하여 정확히 일치되는 것을 선택

2. 함수 템플릿을 이용하여 정확한 일치를 검색

3. 비템플릿 함수에 대해 일반적인 인수 일치 알고리즘을 따름... (여기서 인수일치 알고리즘이란..위의 것)

 

 


● 템플릿 이란?

 

C++ 프로그래머를 위한 강력한 새로운 도구가 "매개변수화 된 형" 또는 템플릿이다

템플릿은 너무나도 유용하여 표준 템플릿 라이브러리(STL, Standard Template Library)가 c++언어에 도입되었다.

계속해서 클래스 및 그의 파생 클래스가 확장되어야하는 상황, 하나에서의 변화가 관련된 모든 클래스로 번지는 상황 등의 문제를 해결한다. 그리고 ANSI 표준을 도입하여 C++에 통합되었다.  c++에서와 마찬가지로 형(type)에 대해 안정되어 있고 매우 융통성이 높다.

 

 

by wiki

템플릿(template)은 C++ 프로그래밍 언어의 한 기능으로, 함수와 클래스가 제네릭 형과 동작할 수 있게 도와 준다. 함수나 클래스가 개별적으로 다시 작성하지 않고도 각기 다른 수많은 자료형에서 동작할 수 있게 한다. 이는 튜링 완전 언어로 볼 수 있다.

템플릿은 C++에서 프로그래머들에게 유용한데, 특히 다중 상속연산자 오버로딩과 결합할 때 그러하다. C++ 표준 라이브러리는 연결된 템플릿의 프레임워크 안에서 수많은 유용한 함수들을 제공한다.

C++ 템플릿은 CLU가 제공하는 매개변수 형태의 모듈과 에이다가 제공하는 제네릭에 영향을 받았다.

 

- 쉽게

무엇을 만들기위해 찍어내는 틀

 


● 템플릿 함수 ?

1. 템플릿을 기반으로 한 함수

2. 함수임 ㅇㅇ

3. 템플릿 함수란 함수 템플릿 즉, 함수 틀로 만들어진 함수(템플릿을 통해 만들어진 함수)로 실제 눈으로는 보이지 않지만 컴퓨터는 컴파일시 저렇게 인식하고 있다?(있는 그것?)

 

 

template <typename T>        //사용자가 만든 함수템플릿을

int sizeof(T a)

{

return sizeof(a);

}

 

예를들어 int 형을 받아왔다 치면 컴파일러는

 

//이렇게 인식하는 이 대상이 템플릿 함수

int sizeof(int a)

{

return sizeof(a);

}

 

 


● 함수 템플릿 ?

함수 템플릿은 함수의 일반화 서술이다. 즉, 함수 템플릿은 int형이나 double형과 같은 구체적인 데이터형을 포괄할 수 있는 일반형(generic type)을 사용하여 함수를 정의한다.

 

1. 함수를 만드는데 사용되는 템플릿 / 함수를 기반으로 구현된 템플릿

2. 함수가 아니라는 뜻

3. 함수 템플릿은 함수를 만들어 낸다 이런 템플릿에 의해 만들어지는 함수의 특징은 기능은 결정되어 있지만 자료형은 결정되어 있지 않다는 것이다.

    즉 같은 기능을 하는 함수도 다양한 자료형을 인자로 호출이 가능하다.

 

- 쉽게

함수를 찍어내는 틀

 

 

template <typename T>

int _sizeof(T a)

{

return sizeof(a);

}

 

//사용

int c=30;

_sizeof<int>(c);//사용 자료형을 명시해줘도 되지만

_sizeof(c);// 안해도 상관없다.

 

 

 

 


클래스 템플릿 ?

클래스 템플릿은 포괄적인 클래스 선언을 생성하는 좀더 나은 방법을 제공한다

템플릿은 매개변수화되는 (parameterized) 데이터형을 제공한다. 즉, 클래스나 함수 설계도에 데이터형 이름을 전달인자로 넘겨주는 기능을 제공한다.

 

클래스 템플릿(class template): 클래스를 찍어내는 틀(template)

 

 

함수 템플릿 처럼, 클래스도 여러개의 데이터형으로 바뀔 수 있는 것을 말한다. 이러한 클래스 템플릿은 컨테이너류에 가장 많이 쓰이며, 대표적인 것으로는 std::vector 가 있겠다.

 

- Class Template 은 템플릿인 클래스. 즉, 클래스 그 자체가 템플릿인 경우를 말합니다.

 

 

template <typename T> class 클래스 이름

{

void 함수이름();

}

 

template <typename T> void 클래스이름<T>::함수이름()

{

//함수 구현부분

}

 

 

 

※ 클래스 템플릿 사용시 하나의 헤더파일안에 함수의 구현과 선언부분을 모두 써줘야한다. 템플릿화 되지 않은 함수도 헤더파일 안에 써줘야한

    다. 그렇지 않으면 링크시 구현부분을 찾지못해 Error가 발생한다.

 

※ 클래스 템플릿은 template <typename T> 을 쓰고 class 클래스이름을 쓴다.

※ 클래스 템플릿 내부의 함수는 클래스 밖 아래에서 구현을 한다.

※ template <typename T>과 클래스이름 <T>를 쓰고 함수 이름을 쓴다.

 

 ※ 오버로딩을 어느정도 대체할순 있지만 완벽하게 대체할순 없다. 클래스 템플릿의 한계가 있기 때문이라는데 ???

 

 

- 또다른 예

template<typename T>

class Data

{

T data;

public:

Data(T d) {data = d;}

void SetData(T d){ data =d; }

T GetData() { return data; }

};

 


 

※ 메인에서 선언할 때는

Data d(10)과 같이 사용하면 문제가 된다.

 

객체 생성순서

메모리 할당 -> 생성자 호출...

 

그러면 Data d(10); 이 문장에서 d이라는 이름으로 메모리 공간을 할당해야 할 것이다. 하지만 우리는 클래스 템플릿을 사용하고 있기 때문에 T가 어떤 데이터 형을 사용해야 할 건지 결정이 나야 메모리 할당이 이루어진다. T가 결정나는 시점은 생성자가 호출되어야만 알 수 있으므로 이전과 같은 문법을 사용한다면 메모리 할당을 전혀 하지 못하게 되는 것이다. 그래서 템플릿 클래스에서 Data 객체를 만들기 위해서는 생성자를 통해서 전달되는 인자의 정보를 참조하는 시기가 늦기 때문에 구체적으로 어떤 타입으로 템플릿을 구체화시킬지 명시적으로 선언해줘야 한다.

 

이렇게

Data<int> d(10);

 

 

 

 


템플릿 클래스 ?

 

Class Template 을 지칭하기도 하며 더불어 템플릿으로 생성된 클래스(인스턴스화된 객체)를 지칭하기도 합니다.

또, 템플릿 식별자로서의 이름을 갖는 클래스를 기리킬 때도 사용합니다.

 

뜻 하는 바가 미묘하게 차이가 나긴 하지만, 무시해도 무방한 것으로 봅니다.

그냥 템플릿으로 작성된 클래스를 지칭하는 것으로 간주하면 되겠습니다.

 


템플릿의 특수화?

특수화란 범위를 좁히는 것을 말한다. 즉 어떠한 경우에서만 특별히 다른 행동을 하는것. 이것이 바로 특수화 이다.

 

 

template <typename T> // 함수 템플릿 정의

int _sizeof(T a)

{

return sizeof(a);

}

template<>                 // 특수화 만약

int _sizeof(char * a)   //char * 타입을 받는다면....

{

return strlen(a);

}

 

int main(void)

{

int in=20;

double f = 1.1;

char * cs = "animo cccc";

 

cout << _sizeof(in)<<endl;

cout << _sizeof(f)<<endl;

cout << _sizeof(cs)<<endl;

}

 


 

Overloading
- 함수의 이름은 같으나 반환 타입이나 인자의 갯수, 인자의 타입이 다른경우 함수를 재정의 하는것

 

int sum(int a, int b) 
{
    return a + b;
}
  
int sum(int a, int b, int c) //overloading
{
    return a + b + c;
}

 

 

 

Overriding
- 상속의 관계에서 부모와 자식의 함수(메서드)가 같은 기능을 수행하지만 함수의 내용이 다른 경우 자식의 클래스에서 함수를 재정의 하는것.
- 함수(메서드)의 이름, return type, 매개변수가 같아야 함
- 접근 제한자의 범위가 부모와 같거나 더 넓어야 함
ex) 부모 - protected, 자식 - public >> O
      부모 - public, 자식 - protected >> X
- Exception 관련 규칙

//Child가 Parent를 상속 받았다고 가정.
void Parent :: whoAmI()
{
    printf("부모입니다.\n");
}
  
void Child :: whoAmI() // overriding
{
    printf("자식입니다.\n");
}
 


 Overloading 과 Overriding 차이

상속관계이냐 아니냐의 차이이며

오버로딩은 같은 이름의 함수가 다른 파라매터값을 받았을 경우를 위한 재정의 이고 

오버라이딩은 리턴 타입과 이름, 파라매터가 모두 동일한 함수가 상속관계에서 서로다른 기능을 하기 위한 재정의 이차이이다.

 

 

 


 

 

 

 

 

● 가상함수(Virtual Function)

- 실행시 사용된 객체에 의해 실행코드가 결정되는 함수

- 지정자 virtual로 선언됨 지정자 virtual은 선언문에 존재함

 

class Animal

{

public:

virtual void breathe();

};

 

class Fish : public Animal

{

public:

virtual void breathe();

};

 

 

 

 

 

● 순수가상함수(Pure Virtual Function)

- 선언만 있고 정의가 없는 가상함수

- 파생 클래스에서 재정의할 것으로 예상되는 함수에 대해 미리 호출 계획을 세워 두기 위해 정의.

 

-가상함수를 순수가상함수로 만드는 방법

선언시 0을 지정하면 됨.

여기서 =0은 Pure Specifier임

 

class Animal

{

public:

virtual void breathe() = 0;

};

 

class Fish : public Animal

{

public:

Fish();

Virtual void breathe();

}

-> Animal::breathe는 순수 가상함수임. Animal::breathe는 함수명만 제공하고, 내용은 Fish::breathe에서 제공하게 됨.

 

- 순수 가상함수는 사용하기 전에 반드시 재정의해야함.

- 만일 기반 클래스가 순수 가상함수를 포함하고 있는데 파생 클래스에서 그것을 재정의하지 않는다면 그 파생 클래스도 추상 클래스가 됨

   -> 기반 클래스 뿐만 아니라, 그 파생 클래스의 객체를 생성하는 것도 불가능함.

 

class Animal

{

public:

virtual void breathe() = 0;

};

 

class Fish : public Animal

{

public:

Fish();

//재정의 안해줌

}

Animal * a = new Animal;    // error  

Animal * f = new Fish;        //error

 

 

http://www.cyworld.com/vcreator/9530269

 

http://blog.daum.net/kingmbc/13597411

 

http://breadlab.net/69

//함수 호출규약

 

 

 

 

 


함수의 호출 우선 순위 조사
일반함수
특수화템플릿
템플릿


템플릿 이란?
템플릿 함수 ?
함수 템플릿 ?
클래스 템플릿 ?
템플릿 클래스 ?
템플릿의 특수화?

//<
오버라이딩
오버로딩의 차이점

 

가상함수
순수가상함수

//< 게임들을 모두 Game기반으로 상속받아서 처리할것
//< 공용함수등을 Game으로 만들어볼것

 

 

'프로그래밍 > 공부' 카테고리의 다른 글

API 2장  (0) 2013.04.16
AIP 1장  (0) 2013.04.16
3/8  (0) 2013.03.11
3/7  (0) 2013.03.11
3/5  (0) 2013.03.07
Posted by 피씨컴