객체 지향 언어의 3가지 중요한 특징:  캡슐화, 상속, 다형성

 

1. 캡슐화: 캡슐화는 객체의 데이터와 그 데이터를 처리하는 함수를 하나로 묶는 것을 말합니다. 

2. 상속: 상속은 기존의 클래스를 확장하여 새로운 클래스를 생성하는 것을 말합니다.

3. 다형성: 다형성은 같은 이름의 메서드가 다른 기능을 수행할 수 있도록 하는 것을 말합니다. 

<function overloading을 지원하는 프로그램이 언어>

1. C++

2. Java

3. Python

4. C#

overloading-> overridding

overloading(오버로딩): 이름이 같은 함수가 여러개 있다 (소스를 이해하기 쉬움)

 

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

 컴파일러가 매개변수의 입력 자료형에 따라서 자동적으로 해당 함수를 연결해준다.

 

#include <iostream>
int add(int i, int j)
{
	return (i + j);
}
double add(double i, double j)
{
	return (i + j);
}
double add(int i, int j)//매개변수가 같으면 오버로딩을 할 수 없다(오류)
{
	return ((double)i + (double)j);
}
int main()
{
	std::cout << add(10, 20) << std::endl;
	std::cout << add(10.5, 20.3) << std::endl;
	return 0;
}

 

C vs C++

//c
#include <iostream>
int add2(int i, int j)
{
return (i+j);
}
int add3(int i, int j, int k)
{
return (i+j+k);
}
int add4(int i, int j, int k, int l)
{
return (i+j+k+l);
}
int main()
{
std::cout<<add2(1,2)<<std::endl;
std::cout<<add3(1,2,3)<<std::endl;
std::cout<<add4(1,2,3,4)<<std::endl;
return 0;
} //오버로딩 안함
//C++
#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 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.3f, 2.6f) << std::endl;//매개변수의 형이 다른 경우
	std::cout << add(6.5, 3.8) << std::endl;//매개변수의 형이 다른 경우
	std::cout << add(1, 2, 3) << std::endl;//  매개변수의 개수가 다른경우
	std::cout << add(1, 2, 3, 4) << std::endl;//  매개변수의 개수가 다른경우
	return 0;
}

매개변수의 형이 다른 경우와 매개변수의 개수가 다른경우에만 함수 중첩이 가능하다

가장 많이 쓰는 오버로딩: 생성자 오버로딩

//생성자 함수 중첩 예
#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(2), meri;
	std::cout << happy.getAge() << "," << meri.getAge();
	return 0;
}

 

 

<디폴트 매개변수>

-별도의 매개변수를 전달하지 않아도 기본적인 값을 전달하도록 함수 원형을 선언할 때 디폴트 값을 지정할 수 있다

- 해당 매개변수가 주어지지 않으면 디폴트 인자 값이 할당된다

#include <iostream>
int add(int i=1, int j=2) // 형식매개변수
{
	return(i + j);
}
int main()
{
	std::cout << add() << ","; // 실매개변수 없음, 3
	std::cout << add(10) << ","; // 실매개변수 한 개, 12
	std::cout << add(10, 20); // 실매개변수 두개, 30
	return 0;
}

 

#include <iostream>
int add(int i = 1, int j = 2); // 형식매개변수

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

디폴트 매개변수를 갖는 함수를 만들 때, main()함수 전에 함수 선언을 하면 선언부에만 디폴트 인자를 지정해야 한다.  int add(int i=1, int j=2);// 선언부에 디폴트 인자 작성

 

 디폴트 매개변수의 사용은 함수 중첩의 축약형이다.

#include <iostream>
class Dog {
private:
	int age;
public:
	Dog(int a=1) { age = a; }
	//Dog() { age = 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;}
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() { age = 1; }
	// 디폴트 매개변수를 갖는 생성자
	~Dog();
	int getAge();
	void setAge(int a);
};
Dog::Dog(int a) { age = 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;
}

출처: 1학년 2학기 수업자료/ 한성현 교수님

'C++프로그래밍' 카테고리의 다른 글

C++프로그래밍 13주차 과제  (1) 2023.11.29
C++프로그래밍 12주차 과제  (1) 2023.11.22
c++프로그래밍 10주차 과제  (1) 2023.11.08
C++ 프로그래밍 9주차 과제  (1) 2023.11.01
C++ 프로그래밍 6주차 과제  (0) 2023.10.18

+ Recent posts