[java] 오버로딩과 오버라이딩
오버로딩과 오버라이딩
메소드 오버로딩(method overloading)
메소드 시그니처(method signature)
메소드 시그니처(method signature)란 메소드의 선언부에 명시되는 매개변수의 리스트를 가르킴
- 메소드 오버로딩의 핵심은 바로 메소드 시그니처에 있음
- 만약 두 메소드가 매개변수의 개수와 타입, 그 순서까지 모두 같다면, 이 두 메소드의 시그니처는 같다고 할 수 있음
메소드 오버로딩(method overloading)
- 메소드 오버로딩(overloading)이란 같은 이름의 메소드를 중복하여 정의하는 것을 의미
- 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나임
-
자바에서는 원래 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없음
-
하지만 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있음
-
즉, 메소드 오버로딩은 서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의한 것
-
메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있음
-
메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있음
//메소드 오버로딩의 대표적인 예 //println()메소드 1. println() 2. println(boolean x) 3. println(char x) 4. println(char[] x) 5. println(double x) 6. println(float x) 7. println(int x) 8. println(long x) 9. println(Object x) 10. println(String x)
메소드 오버로딩의 조건
- 메소드의 이름이 같아야 함
- 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 함
메소드 오버로딩의 예제
class Test {
static void display(int num1) { System.out.println(num1); }
① static void display(int num1, int num2) { System.out.println(num1 * num2); }
static void display(int num1, double num2) { System.out.println(num1 + num2); }
}
public class Method06 {
public static void main(String[] args) {
Test myfunc = new Test();
myfunc.display(10);
myfunc.display(10, 20);
myfunc.display(10, 3.14);
② myfunc.display(10, 'a');
}
}
//실행 결과
10
200
13.14
970
메소드 오버라이딩(method overriding)
메소드 오버라이딩(method overriding)
오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 정의하는 것
- 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속 받음
- 이렇게 상속받은 메소드는 그대로 사용해도 되고, 필용한 동작을 위해 재정의하여 사용할 수 있음
- 즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미
오버라이딩의 조건
- 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야 함
- 하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있음
- 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없음
- 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없음
오버라이딩 예제
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();
}
}
//실행 결과
부모 클래스의 display() 메소드입니다.
자식 클래스의 display() 메소드입니다.
자식 클래스의 display() 메소드입니다.
오버로딩과 오버라이딩
차이점
- 오버로딩(overloading)은 새로운 메소드를 정의하는 것
- 오버라이딩(overriding)은 상속받은 기존의 메소드르르 재정의하는 것
예제
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() 메소드입니다.");
}
}
//실행 결과
자식 클래스의 display() 메소드입니다.
오버로딩된 display() 메소드입니다.