객체 지향 언어의 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 |