
메소드의 이름이 모두 같아야 한다.
메소드에 따라 매개 변수의 개수 또는 타입이 달라야 한다. → 인자들의 타입이나 개수가 다르면 메소드 이름이 같더라도 어떤 메소드를 호출할 지 컴파일러가 알 수 있기 때문.
매개 변수는 같고, 리턴 타입이 다를 때는 성립하지 않는다.
오버로딩된 메소드들은 매개 변수로만 구분될 수 있다.
// Java program to demonstrate working of method
// overloading in Java.
public class Sum {
// Overloaded sum(). This sum takes two int parameters
public int sum(int x, int y)
{
return (x + y);
}
// Overloaded sum(). This sum takes three int parameters
public int sum(int x, int y, int z)
{
return (x + y + z);
}
// Overloaded sum(). This sum takes two double parameters
public double sum(double x, double y)
{
return (x + y);
}
// Driver code
public static void main(String args[])
{
Sum s = new Sum();
System.out.println(s.sum(10, 20));
System.out.println(s.sum(10, 20, 30));
System.out.println(s.sum(10.5, 20.5));
}
}
//Output
//30
//60
//31.0
일반 명사적 의미?
고유 명사적 의미?

오버라이딩의 사용 조건 및 방법
class SuperClass {
public void check() {
System.out.println("부모 메소드");
}
public void sum(int x, int y) {
int sum = 0;
for (int i = x; i <= y; i++) {
sum += i;
}
System.out.println("합계 : " + sum);
}
}
class SubClass extends SuperClass {
public void check() { // 메소드 오버라이딩
System.out.println("자식 메소드");
}
public void sum(int x, int y) { // 메소드 오버라이딩
int sum = 0, odd = 0, even = 0;
for (int i = x; i <= y; i++) {
sum += i;
if (i % 2 == 0) {
even += i;
} else {
odd += i;
}
}
System.out.print("합계 : " + sum);
System.out.println("(짝수 합 : " + even + " / 홀수 합 : " + odd + ")");
// super.sum(x, y); // 부모 메소드 호출
}
}
public class OverridingEx01 {
public static void main(String[] args) {
SubClass sub = new SubClass();
sub.check();
sub.sum(0, 10);
}
}
class Parent {
void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}
class Child extends Parent {
void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
}
public class Inheritance05 {
public static void main(String[] args) {
Parent pa = new Parent();
pa.display();
Child ch = new Child();
ch.display();
Parent pc = new Child();
pc.display(); // Child cp = new Parent();
}
}
위 예제에서 main 메소드 내 세 번째와 같은 인스턴스의 참조가 허용되는 이유는 다형성 때문.
간단히 정리하자면, 오버로딩은 새로운 메소드를 정의하는 것이고, 오버라이딩은 상속받은 기존의 메소드를 재정의하는 것이다.
class Parent {
void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}
class Child extends Parent {
// 오버라이딩된 display() 메소드
void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
void display(String str) { System.out.println(str); } // 오버로딩된 display() 메소드
}
public class Inheritance06 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
ch.display("오버로딩된 display() 메소드입니다.");
}
}
참고한 링크
http://www.tcpschool.com/java/java_polymorphism_concept
https://www.geeksforgeeks.org/overloading-in-java/
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=heartflow89&logNo=220979244668
http://ufx.kr/blog/407
https://velog.io/@godkimchichi/Java-13-클래스다이어그램
https://mozi.tistory.com/488 : 자바 클래스 변수와 클래스 메소드(static)