Java/JAVA

[JAVA] 자바의 오버로딩(Overloading), 오버라이딩(Overriding)

담크 2021. 9. 22. 23:58

오늘은 자바의 오버로딩과 오버라이딩에 대해 공부해보도록 하겠습니다.

이 두개는 이름이 비슷해서 많이 헷갈리지만 하는 역할은 매우 다릅니다.

 

오버로딩(Overloading)

오버로딩은 같은 이름의 메소드를 중복해서 정의하는 것입니다.

오버로딩을 사용해 메소드에 사용되는 이름을 절약할 수 있고, 오버로딩을 써서 메소드를 만들어 놓으면 메소드를 호출할 때 전달해야 할 파라미터의 타입이나 개수에 신경을 쓰지 않고 호출해서 사용할 수 있습니다.

코드로 예시를 들어보겠습니다.

Test2.java

package test;

public class Test2 {
	
	public int sum(int i) {
		return i+i;
	}
	
	public int sum(int i, int j) {
		return i+j;
	}
	
	public double sum(double i, double j, double k) {
		return i+j+k;
	}

}

Test.java

package test;

public class Test {

	public static void main(String[] args) {
		
		Test2 t2 = new Test2();
		
		System.out.println(t2.sum(1));
		System.out.println(t2.sum(2, 4));
		System.out.println(t2.sum(1.2, 4.6, 5.7));
		
	}
}

코드 실행결과

위의 처음 코드를 보면 sum이라는 메소드를 3개 정의했습니다.

이렇게 이름은 같지만 파라미터의 개수나 타입이 다른 메소드를 만들어준다면 Test.java에서 Test2.java의 메소드를 호출할 때 타입이나 파라미터의 개수를 신경 쓰지 않고 호출할 수 있습니다.

오버로딩에는 충족조건이 있는데

1. 메소드의 이름이 같아야한다.

2. 파라미터의 개수나 타입이 달라야 한다.

입니다.

 

 

 

오버라이딩(Overriding)

오버라이딩은 상속된 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의 해주는 것입니다.

자식 클래스에서는 부모클래스의 private 메소드를 제외한 모든 메소드를 상속받게 되는데 이렇게 상속받은 메소드는 자식클래스에서 그대로 사용하기도 하고 재정의해서 사용하기도 합니다.

코드로 예시를 들어보겠습니다.

AAA.java

package test;

public class AAA {
	
	private int aaa;

	public AAA() {
		System.out.println("AAA 생성");
	}

	public AAA(int aaa) {
		this.aaa = aaa;
		System.out.println("AAA 생성 -> aaa : " + aaa);
	}

	public int getAaa() {
		return aaa;
	}

	public void setAaa(int aaa) {
		this.aaa = aaa;
	}
	
	public void prn() {
		System.out.println("AAA의 prn() 메소드");
	}

}

BBB.java

package test;

public class BBB extends AAA {
	
	private int bbb;
	
	public BBB() {
		System.out.println("BBB 생성");
	}

	public BBB(int aaa) {
		super(aaa);	//super : 부모생성자(파라미터) 호출
		bbb = 10;
		System.out.println("BBB 생성 -> aaa : " + aaa);
	}
	
	public BBB(int aaa, int bbb){
		super(aaa);
		this.bbb = bbb;
		System.out.println("BBB 생성 -> aaa : " + aaa + ", bbb : " + bbb);
	}

	public int getBbb() {
		return bbb;
	}

	public void setBbb(int bbb) {
		this.bbb = bbb;
	}
	
	public int getSum() {
		int sum = super.getAaa() + this.getBbb();
		return sum;
	}
	
    // **재정의
	@Override
	public void prn() {
		System.out.println("BBB.prn()");
	}
}

위 코드는 BBB클래스에서 AAA클래스를 상속받고 있습니다.

AAA클래스와 마찬가지로 BBB클래스에도 prn( )메소드가 같은 형태로 존재하는데 이를 오버라이딩이라고 합니다.

즉 부모 클래스인 AAA의 prn( )메소드를 그대로 사용해도 되지만 필요에 따라서 자식클래스에서 prn( )메소드를 재정의 해서 사용하는 것입니다.

마찬가지로 오버라이딩에 충족조건이 있는데

1. 부모 클래스의 메소드와 자식 클래스의 메소드가 이름이 같아야 한다.

2. 파라미터의 타입, 개수, 순서가 모두 같아야 한다.

3. return 타입도 같아야한다.

4. 접근제한자는 부모 클래스의 메소드보다 더 넓은 범위를 가지거나 같아야 한다.

입니다.

'Java > JAVA' 카테고리의 다른 글

[JAVA] 자바의 다형성(polymorphism)  (0) 2021.09.24
[JAVA] 자바의 상속(inheritance)  (0) 2021.09.23
[JAVA] 자바의 substring, split, StringTokenizer  (0) 2021.09.20
[JAVA] 자바의 String과 StringBuffer  (0) 2021.09.19
[JAVA] String pool  (0) 2021.09.18