1. 오버로딩(Overloading)
오버로딩(overloading)은 같은 이름의 메소드를 중복하여 정의하는 것입니다.
오버로딩을 사용하여 메소드에 사용되는 이름을 절약할 수 있으며 오버로딩을 이용해 메소드를 만들어 놓으면 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 신경을 쓰지 않고 호출할 수 있게 됩니다.
오버로딩은 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법입니다.
이런 오버로딩에도 충족해야 하는 조건이 있습니다.
1. 메소드의 이름이 같아야 합니다.
2. 매개변수의 개수나 타입이 달라야 합니다.
MySum.java
package com.test01;
public class MySum {
public int sum(int i) {
return i+i;
}
public int sum(int i, int j) {
return i+j;
}
public int sum(int i, int j, int k) {
return i+j+k;
}
public double sum(double d, double f){
return d + f;
}
public int sum(double d1, double d2, double d3) {
return (int)(d1 + d2 + d3);
}
}
MTest.java
package com.test01;
public class MTest {
public static void main(String[] args) {
MySum my = new MySum();
System.out.println(my.sum(1));
System.out.println(my.sum(2,3));
System.out.println(my.sum(4,5,6));
System.out.println(my.sum(7.8, 9.1));
System.out.println(my.sum(10.1, 23.4, 56.7));
}
}
해당 코드에서는 sum이란 이름의 메소드가 5개가 정의되어 있습니다.
하지만 파라미터의 개수나 타입이 모두 다릅니다.
이렇게 같은 이름의 메소드를 만들 수 있는 것입니다.
MTest 클래스에서 MySum 클래스 내의 메소드를 호출할 때 타입이나 파라미터의 개수를 신경 쓰지 않고 호출할 수 있습니다.
2. 오버라이딩(Overriding)
오버라이딩(Overriding)은 상속된 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하는 것입니다.
자식 클래스는 부모 클래스의 private로 정의된 메소드이외에 모든 메소드를 상속받게 됩니다.
이렇게 상속받은 메소드를 그대로 사용하도 되고 자식 클래스에서 재정의 하여 사용할 수 있습니다. 오버라이딩의 충족조건이 있습니다.
1. 부모 클래스의 메소드와 자식 클래스의 메소드가 이름이 같아야 합니다.
2. 매개변수의 타입, 개수, 순서가 모두 같아야 합니다.
3. 반환 타입도 같아야 합니다.
4. 접근제한자는 부모 클래스의 메소드보다 더 넓은 범위이거나 같아야 합니다.
AAA.java
package com.aaa;
public class AAA {
private int abc;
public AAA() {
System.out.println("AAA 생성");
}
public AAA(int abc) {
//this : 나(객체)
this.abc = abc;
System.out.println("AAA 생성 -> abc : " + abc);
}
public int getAbc() {
return abc;
}
public void setAbc(int abc) {
this.abc = abc;
}
public void prn() {
System.out.println("AAA의 prn() 메소드");
}
}
BBB.java
package com.bbb;
import com.aaa.AAA;
public class BBB extends AAA {
private int bcd;
public BBB() {
// super();
System.out.println("BBB 생성");
}
public BBB(int abc) {
// 부모생성자(param) 호출
super(abc);
bcd = 10;
System.out.println("BBB 생성 -> abc : " + abc);
}
public BBB(int abc, int bcd) {
super(abc);
this.bcd = bcd;
System.out.printf("BBB 생성 -> abc : %d, bcd : %d\n", abc, bcd);
}
public int getBcd() {
return bcd;
}
public void setBcd(int bcd) {
this.bcd = bcd;
}
public int getSum() {
int sum = super.getAbc() + this.getBcd();
return sum;
}
@Override//재정의
public void prn() {
System.out.println("BBB.prn()");
}
}
aaa클래스의 경우 지난번 클래스에서 봤던 코드인데요.
bbb클래스는 이런 aaa클래스를 상속받고 있습니다.
( 상속에 대해서는 다음 포스팅에서 좀 더 자세하게 알아보겠습니다. )
자 그리고 aaa클래스에 prn()메소드가 있는데 bbb클래스에도 prn()메소드가 같은 형태로 존재합니다.
이를 오버라이딩이라고 합니다.
부모 클래스인 aaa클래스의 prn()메소드를 그대로 사용해도 되지만 필요에 따라 자식 클래스에서 prn()메소드를 재정의 하여 사용하는 것입니다.
'Java 관련 > Java' 카테고리의 다른 글
[Java] 다형성(polymorphism) (0) | 2021.11.04 |
---|---|
[Java] 상속(inheritance) (0) | 2021.11.03 |
[Java] 클래스(class) (0) | 2021.11.01 |
[Java] java.lang.String api 활용하기 (0) | 2021.10.31 |
[Java] Split() & StringTokenizer() (0) | 2021.10.30 |