오버로딩은 이름이 같아도 매개변수 개수, 타입, 순서를 다르게 해서 같은 이름으로도 여러 개의 함수를 정의할 수 있는 것을 말한다. 이는 프로그램의 유연성을 높이고 결과적으로 코드를 깔끔하게 하는 효과가 있으며 같은 클래스 내에서 사용한다.
ex1)
class Calculator{
void multiply(int a, int b){
System.out.println("결과는 : "+(a * b) + "입니다.");
}
void multiply(int a, int b,int c){
System.out.println("결과는 : "+(a * b * c) + "입니다.");
}
void multiply(double a, double b){
System.out.println("결과는 : "+(a * b) + "입니다.");
}
}
public class MyClass {
public static void main(String args[]) {
int a = 1;
int b = 2;
int d = 4;
Calculator c = new Calculator();
c.multiply(a, b);
c.multiply(a, b, d);
double aa = 1.2;
double bb = 1.4;
c.multiply(aa, bb);
}
}
ex2)
class Person{
void pay(String a, int b){
System.out.println(a + "가 "+ b + "원만큼 계산합니다. ");
}
void pay(int a, String b){
System.out.println(b + "가 "+ a + "원만큼 계산합니다. ");
}
}
public class MyClass {
public static void main(String args[]) {
Person c = new Person();
c.pay("영주", 1000000000);
c.pay(1000000000, "영주");
}
}
ex3)
C++에서도 쓰이기도 함 (이처럼 되는 언어가 있고 안되는 언어가 있음)
#include<bits/stdc++.h>
using namespace std;
string a = "aaa";
string b = string("aaa");
string c = string(3, 'a');
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cout << a << '\n';
cout << b << '\n';
cout << c << '\n';
}
/*
aaa
aaa
aaa
*/
상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의 하는 것을 의미. 상속 관계에서 사용되며 static, final로 선언한 매서드는 오버라이딩이 불가.
ex1)
class Animal{
void eat(){
System.out.println("먹습니다.");
}
}
class Person extends Animal{
@Override
void eat(){
System.out.println("사람처럼 먹습니다. ");
}
}
public class MyClass {
public static void main(String args[]) {
Person a = new Person();
a.eat();
}
}
ex2)
interface를 기반으로 구체적인 함수 정의는 하지 않고 이를 기반으로 여러개의 하위 클래스를 만들어 오버라이딩
interface Animal{
public void eat();
}
class Person implements Animal{
@Override
public void eat(){
System.out.println("사람처럼 먹습니다. ");
}
}
public class MyClass {
public static void main(String args[]) {
Person a = new Person();
a.eat();
}
}