안녕하세요~

이번 시간에는 오버로딩과 오버라이딩의 정확한 개념과 차이점에 대해 알아보려고 하는데요.

예시코드를 통해 자세하게 살펴볼까요?

오버로딩과 오버라이딩이 모두 존재하는 코드

class Parent {
	int a = 10;
	
	int plus() {
		return a + 10;
	}
	
	int plus(int num) {
		return a + num;
	}

	void print() {
		System.out.println("부모 메소드 호출!");
	}
}

class Child extends Parent {
	int b = 20;
	
	void print() {
		System.out.println("자식 메소드 호출!");
	}
}

public class Main {

	public static void main(String[] args) {
		Parent p = new Parent();
		Child c = new Child();
		
		p.plus();
		p.plus(5);
		
		c.plus();
		c.plus(10);
		
		p.print();
		c.print();
	}

}

 Child 클래스에서 plus메소드를 오버로딩하고 Parent 클래스를 상속받아 print메소드를 오버라이딩하여 사용하는 코드

오늘의 핵심 키워드

1.  오버로딩은 같은 클래스 내에서 같은 메소드명을 가진 여러 개의 메소드가 가진 매개변수의 개수나 타입이 다르게 작성하는 것을 의미한다.

2. 오버라이딩은 상속 관계에서 부모클래스에 있는 메소드를 자식클래스에서 선언부는 똑같이 작성하고 구현부만 다르게 작성하는 것을 의미한다.

3. 상속(extends) 관계에서 자식클래스는 부모클래스에 있는 필드, 메소드들을 마음대로 사용할 수 있다.


콘솔창에 출력하기 위해 print메소드를 사용하고 그 안에서 plus메소드들을 호출하게 되면 다음과 같이 출력됩니다.


Parent 클래스에 있는 plus 메소드와 Child 클래스가 물려받은 plus 메소드는 상속 관계기 때문에 모두 Parent 클래스에 있는 a 변수를 사용합니다.

[1] a에 저장된 10에 10이 더해진 20 출력

[2] 매개변수로 5가 들어갔을 때에는 오버로딩된 plus 메소드가 실행되어 매개변수 5에 a의 값 10이 더해져 15가 출력

[3] Child에서 사용한 plus 메소드도 a의 값을 사용하기 때문에 10에 10을 더한 20 출력

[4] 매개변수로 들어온 10에 a의 값 10을 더해 20 출력

[5] Parent 클래스에 있는 print 메소드 실행

[6] Child 클래스에서 오버라이딩된 print 메소드 실행


 

먼저 출력창과 다른 Child plus 부분만 보면

[1] a에 저장된 10이 아닌 Child 클래스에 있는 b 변수에 저장된 20에 10을 더한 30 출력

[2] 매개변수로 들어간 10에 b에 저장된 20을 더해 30 출력

최종 완성본

class Parent {
	int a = 10;
	
	int plus() {
		return a + 10;
	}
	
	int plus(int num) {
		return a + num;
	}

	void print() {
		System.out.println("부모 메소드 호출!");
	}
}

class Child extends Parent {
	int b = 20;
	
	int plus() {
		return b + 10;
	}
	
	int plus(int num) {
		return b + num;
	}	
	
	void print() {
		System.out.println("자식 메소드 호출!");
	}
}

public class Main {

	public static void main(String[] args) {
		Parent p = new Parent();
		Child c = new Child();
		
		System.out.println("Parent plus() : "+p.plus());
		System.out.println("Parent plus(num) : "+p.plus(5));
		System.out.println("Chlid plus() : "+c.plus());
		System.out.println("Child plus(num) : "+c.plus(10));
		
		p.print();
		c.print();
	}

}


꼭 봐야되는 마무리 꿀팁!

  • 같은 클래스에서 비슷한 기능을 가진 메소드를 정의할 때는 오버로딩을 사용하기!
  • 상속 관계에서 자식 클래스에서 부모 클래스에 있는 메소드를 업그레이드하고 싶을 때는 오버라이딩 사용하기!

▲영상으로 한번 더 복습하세요 :)