C++

C++ 프로그래밍 11주차

kimbh 2023. 11. 16. 15:49

실습 1 객체지향언어의 3가지 특성(캡슐화, 다형성, 상속화)

polymorphism(다형성)에 대한 예시

다향성의 종류

코어션 - > 자동형 변환이라고 생각하면 됨.

같은 이름의 함수를 여러개 프로그램으로 사용할 수 있음, 오른쪽에 예시를 보면 add라는 함수에 int, float, double로 여러개 중첩을  한 것을 볼 수 있음.

실습 2 Function Overloading (함수 중첩)

C언어에서 함수 중첩이 불가능해 따로 함수명을 add_i, add_f로 함수 정의를 해야 하지만 C++에서는 함수 중첩이 가능해 add라는 함수에 전달 인자 값에 int, float, double을 넣어 중첩해서 사용이 가능하다.

 

함수 중첩에 대한 예시

#include <iostream>
using std::cout;
using std::endl;
int add(int i, int j)
{
	return (i + j);
}
double add(double i, double j)
{
	return (i + j);
}
int main()
{
	cout << add(10, 20) << endl;
	cout << add(10.5, 20.3) << endl;
	return 0;
}

#include <iostream>
using std::cout;
using std::endl;
int add(int i, int j)
{
	return (i + j);
}
double add(int i, int j)
{
	return ((double)i + (double)j);
}
double add(double i, double j)
{
	return (i + j);
}
int main()
{
	cout << add(10, 20) << endl;
	cout << add(10.5, 20.3) << endl;
	return 0;
}

매개변수가 똑같기 때문에 함수 오버로딩 하는것이 안된다.

#include <iostream>
using std::cout;
using std::endl;
int Max(int i, int j)
{
	return i > j ? i : j;
}
double Max(double i, double j)
{
	return i > j ? i : j;
}
char Max(char i, char j)
{
	return i > j ? i : j;
}
int main()
{
	std::cout << Max(1, 2) << std::endl;
	std::cout << Max(7.5, 3.6) << std::endl;
	std::cout << Max('A', 'B');
	return 0;
}

Template를 이용한 위에 코드보다 요약해서 만든 고급방법

#include <iostream>
using std::cout;
using std::endl;
template <class T>
T Max(T i, T j)
{
	return i > j ? i : j;
}
int main()
{
	std::cout << Max(1, 2) << std::endl;
	std::cout << Max(7.5, 3.6) << std::endl;
	std::cout << Max('A', 'B');
	return 0;
}

함수 중첩을 하는 2가지 경우

#include <iostream>
int add(int i, int j)
{
	return (i + j);
}
int add(int i, int j, int k)
{
	return (i + j + k);
}
int add(int i, int j, int k, int l)
{
	return (i + j + k + l);
}

int main()
{
	std::cout << add(1, 2) << std::endl;
	std::cout << add(1, 2, 3) << std::endl;
	std::cout << add(1, 2, 3, 4) << std::endl;
	return 0;
}

매개 변수 개수가 다른경우.

#include <iostream>
int add(int i, int j)
{
	return (i + j);
}
float add(float i, float j)
{
	return (i + j);
}
double add(double i, double j)
{
	return (i + j);
}
int main()
{
	std::cout << add(1, 2) << std::endl;
	std::cout << add(1.3f, 2.6f) << std::endl;
	std::cout << add(6.5, 3.8) << std::endl;
	return 0;
}

매개 변수의 형이 다른 경우

실습 3 생성자 중첩 (중요 시험에 나옴)

생성자 중첩에 대한 설명이다.

생성자 중첩에 대한 예

#include <iostream>
class Dog {
private:
	int age;
public:
	Dog() { age = 1; } // 매개변수가 없는 생성자, 자동 inline
	Dog(int a) { age = a; } // 매개변수가 하나인 생성자
	~Dog();
	int getAge();
	void setAge(int a);
};
Dog::~Dog()
{
	std::cout << "소멸";
}
int Dog::getAge()
{
	return age;
}
void Dog::setAge(int a)
{
	age = a;
}
int main()
{
	Dog happy(5), meri;
	std::cout << happy.getAge() << "," << meri.getAge();
	return 0;
}

 

위에 사진을 보면 매개변수가 있는 생성자로 값을 부르게 되면 8줄로 가서 매개변수 값을 받고 리턴하는 형식이고 매개변수가 없는 생성자에서는 매개변수 값을 안 받고 값을 1로 초기화 함. 생성자에 대한 2가지 예시가 위에 사진임.

생성자 함수는 중첩시키는 것은 객체에 초기값을 다양하게 주는 선택 기회를 제공하는 것이다.

 

실습 4 디폴트 인자(매개변수 Default Parameter)

디폴트 인자에 대한 예시

위에 사진 처럼 함수를 정의 할때 매개 변수 값을 받는 개수가 2개여서 main함수에서 넘겨 받아야 하는 매개변수 개수가 2개여야지만 함수가 호출이 되지만 디폴트 인자를 통해서 i와 j 값을 디폴트해서 매개변수 값을 받지 않아도 add 함수에서 설정해놓은 디폴트 값으로 호출이 된다.

# 디폴트 인자를 정의하기 시작하면 디폴트 인자 값을 계속해서 넣어줘야 한다.

# i와 j값중에 j의 값을 안넣고 싶으면 i와 j의 위치를 바꿔야 한다.

#include <iostream>
int add(int i = 1, int j = 1);//선언하는 곳에 디폴트 값을 정하면됨.
int main()
{
	std::cout << add() << ","; // 실매개변수 없음, 3
	std::cout << add(10) << ","; // 실매개변수 한 개, 12
	std::cout << add(10, 20); // 실매개변수 두개, 30
	return 0;
}
int add(int i, int j) // 형식매개변수 정의 부분에는 디폴트 값을 안정해야됨.
{//정의 하게되면 오류가 생김. 
	return(i + j);
}

디폴트 인자 예시

#include <iostream>
class Dog {
private:
	int age;
public:
	Dog(int a = 1) { age = a; }
	// 디폴트 매개변수를 갖는 생성자
	~Dog();
	int getAge();
	void setAge(int a);
};
Dog::~Dog()
{
	std::cout << "소멸\n";
}
int Dog::getAge()
{
	return age;
}
void Dog::setAge(int a)
{
	age = a;
}
int main()
{
	Dog meri, happy(5);
	std::cout << happy.getAge() << "," <<
		meri.getAge() << std::endl;
	return 0;
}

위에 소스에서 함수 중첩이나, 디폴트 인자를 한 가지 방법으로만 사용해야하고 함수중첩과 디폴트 인자를 같이 쓰면 오류가 생김.

 

디폴트 인자 응용

#include <iostream>
int Gop(int i, int j, int k = 1, int l = 1)
{
	return(i * j * k * l);
}
int main()
{
	std::cout << Gop(1, 2) << std::endl; // 1*2*1*1
	std::cout << Gop(1, 2, 3) << std::endl; // 1*2*3*1
	std::cout << Gop(1, 2, 3, 4) << std::endl;// 1*2*3*4
	return 0;
}

디폴트 인자 응용( 함수 외부로 빼서하는 소스코드)

#include <iostream>
class Dog {
private:
	int age;
public:
	Dog(int a=1);
	// 디폴트 매개변수를 갖는 생성자
	~Dog();
	int getAge();
	void setAge(int a);
};
Dog::~Dog()
{
	std::cout << "소멸\n";
}
int Dog::getAge()
{
	return age;
}
void Dog::setAge(int a)
{
	age = a;
}
Dog::Dog(int a=1) { age = a; }
int main()
{
	Dog meri, happy(5);
	std::cout << happy.getAge() << "," <<
		meri.getAge() << std::endl;
	return 0;
}

디폴트 인자값을 정의 부분에서는 넣지 않고 선언부에만 넣어야 한다 위에 코드는 오류가 나는 코드이고,

아래 소스코드가 고친 소스코드임.

#include <iostream>
class Dog {
private:
	int age;
public:
	Dog(int a=1);
	// 디폴트 매개변수를 갖는 생성자
	~Dog();
	int getAge();
	void setAge(int a);
};
Dog::~Dog()
{
	std::cout << "소멸\n";
}
int Dog::getAge()
{
	return age;
}
void Dog::setAge(int a)
{
	age = a;
}
Dog::Dog(int a) { age = a; }
int main()
{
	Dog meri, happy(5);
	std::cout << happy.getAge() << "," <<
		meri.getAge() << std::endl;
	return 0;
}

'C++' 카테고리의 다른 글

C++ 프로그래밍 13주차  (0) 2023.11.30
C++프로그래밍 12주차  (0) 2023.11.23
C++ 10주차  (1) 2023.11.09
C++ 8주차  (0) 2023.11.02
C++7주차  (0) 2023.10.19