#define
코드의 단순 대체( 복붙 )
#define MAX_SIZE 100
#define PI 3.14159
전처리 단계에서 대체된다.
#define PI 3.141592 //전처리 단계에서 대체해줌
#include <iostream>
int main()
{
double a = PI * 2; // 3.141592 * 2 로 대체
double b = PI * 4; // 3.141592 * 4 로 대체
return 0;
}
#include <iostream>
int max(int a, int b)
{
return (a > b) ? a : b;//3항 연산자
}
double max(double a, double b)
{
return (a > b) ? a : b;//3항 연산자
}
int main()
{
int x = 100;
int y = 200;
std::cout << max(x, y);
double z = 1.234;
double w = 3.456;
std::cout << max(z, w);//double 반환 max함수 호출
return 0;
}
이를 전부 구현하지 않고 매크로를 사용하여 Generic하게 만들고 싶다. 즉, 한번만 정의하면 모든 것에 다 사용하고 싶다.
#include <iostream>
#define Max(a,b) ((a>b)? a:b)
int main()
{
int x = 100;
int y = 200;
std::cout << Max(x, y);
double z = 1.234;
double w = 3.456;
std::cout << Max(z, w);//double 반환 max함수 호출
return 0;
}
💡전처리기를 통해서 본문의 Max(a,b) 형식의 코드가 ((a>b)? a:b)로 대체가 된다.
즉, 함수없이 본문에 코드로 대체가 되어 오류가 발생 하지 않게된다.
#define Sqr(a) a*a
result = Sqr(5);
result = 5*5;
result = 100/Sqr(5);
result = 100/5*5; // 내가 의도한 계산값이 나오지 않음
“설계도” 개념
함수 템플릿과 클래스 템플릿 구현을 지원
어떤 데이터 타입이든, 컴파일러가 적절한 함수/클래스를 설계도를 기반으로 생성함
제네릭 프로그래밍 / 메타 프로그래밍
즉, 데이터 타입에 따라서 함수를 각각 구현하는 것이 아니라 템플릿으로 코드를 구현해 놓으면 컴파일러가 알아서 생성함
int max(int a, int b)
{
return (a > b)?a:b;
}
//위의 코드를 아래와 같이 template로 구현
template <typename T>
T max(T a, T b)
{
return (a>b)?a:b;
}
컴파일러가 볼 설계도!
#include <iostream>
template <typename T>//이후에 나오는 T라는 문자는 typename이다.
T max(T a, T b)
{
return (a > b) ? a : b;
}
int main()
{
int a = 10;
int b = 20;
std::cout << max<int>(a, b) << std::endl;//<>안에 type의 이름을 적어줘야함,그래야 컴파일러가 생성해줌
double c = 1.234;
double d = 3.456;
std::cout << max<double>(c, d) << std::endl;
}
컴파일러가 <>안의 type을 보고 T에 넣어서 함수를 생성해준다. 이 때 템플릿 함수만 존재 할 경우 아무 함수도 생성되지 않는다. 즉, 정의한 템플릿 함수를 사용해야 사용이 된다.
max<int>(a,b);
max(a,b);//생략이 가능하다. 쓰는게 좋다.
Point 객체에 대해서 적용을 해보자!
Point p1;
Point p2;
Max<Point>(p1, p2);//오버로딩을 해줘야 가능함
Point Max(Point a, Point b)//
{
return (a > b) ? a : b;// > 연산 불가능 -> 오버로딩 필요
}
#include <iostream>
class Point {
public:
bool operator>(const Point& rhs) {
return true;
}
};
template <typename T>
T Max(T a, T b)
{
return (a > b) ? a : b;
}
int main()
{
int a = 4;
int b = 5;
std::cout << Max<int>(a, b) << std::endl;
double c = 5.8;
double d = 5.7;
std::cout << Max<double>(c, d) << std::endl;
Point p1;
Point p2;
Max<Point>(p1, p2);//오버로딩을 해줘야 가능함
return 0;
}