매일 매일 미라클 코딩

오버라이딩 VS 오버로딩, 그리고 super. / this. 본문

BackEnd/JAVA

오버라이딩 VS 오버로딩, 그리고 super. / this.

뚜벅-뚜벅 2020. 12. 7. 19:54

오버라이딩, 오버로딩 이름이 비슷해서 헷갈릴 때가 많을 텐데요.

메소드를 다양한 형태로 활용한다는 점도 공통점이지만 알고 보면 많이 다릅니다. 

 

이 둘을 구분하면, 또 하나의 헷갈리는 키워드 this와 super 도 구분할 수 있답니다. 


1. 오버라이딩 (Overriding)

먼저 오버라이딩= 부모클래스를 상속받은 환경에서 사용합니다. 
물려받은 기능을 하위클래스의 성격에 맞게 추가/변경하여 사용하고 싶을 때

메소드명과 매개변수를 똑같이 작성하여 덮어쓰는 것이죠


- 메소드 이름과 반환형, 매개변수가 같아야합니다.

 

여기 Machine 이라는 이름의 클래스가 있습니다. 

class Machine {
	public void on() {
		System.out.println("전원을 켭니다");		
	}
	public void off() {
		System.out.println("전원을 끕니다");
	}
	public void work() {
	System.out.println("기계가 작동합니다");
} 

 

모든 기계는 전원을 켜고 끄고, 작동하는 단계를 거치겠죠. 

이 클래스를 상속받은 오디오 클래스를 작성하는 중, work 메소드에 오디오만의 기능을 추가 하고 싶습니다.

 

public class Audio extends Machine{

public void work() {
	super.work();
    System.out.print("음악이 흘러나옵니다.");
}
}

 

그럼 위와 같이, 상위클래스의 work 메소드와 매개변수, 반환값, 메소드명이 똑같은 메소드를 작성해줍니다. 

그리고 super 키워드를 통해 상위클래스, 즉 Machine 클래스의 work 메소드를 호출한 뒤,

Audio 객체만의 명령을 추가했습니다.

 

위 코드를 실행하면, 상위클래스의 work 실행결과였던

"기계가 작동합니다" 와 

"음악이 흘러나옵니다."

가 같이 출력됩니다. 

 

 

이처럼 오버라이딩은, 상속받은 메소드에 기능을 추가하거나 변경하고 싶을 때 사용합니다.

이때, 상속의 특성상 부모클래스의 메소드 코드와 중복될 확률이 높은데요

super. 키워드를 통해 부모클래스 메소드를 그대로 가져옴으로써

코드의 중복을 방지 할 수 있습니다. (좀 더 효율적인 상속, 변경이 가능해집니다)

 

요약: 오버라이딩 = 부모 메소드 디벨롭하기 / super 와 짝꿍

 


2. 오버로딩 (Overload)

 

오버로드는 상속과는 관련이 없습니다. 

대신 '메소드 이름' 이 아주 중요합니다.

 

오버로딩은 비슷한 역할을 하는 메소드 여러개가, 각각 매개변수를 다르게 써야할 때 사용합니다.

다시 말해, 메소드 이름은 똑같이 하되, 매개변수만 다르게해주는게 가능하다는 것이죠

이것이 오버로딩. 적재하다라는 뜻을 가진 기능입니다. 

 

세가지 메뉴를 주문하고 계산할 수 있는 카페 프로그램이 있다고 가정해봅니다.

pay라는 메소드가 계산을 담당하고 있는데, 현금과 카드의 결제방식이 다릅니다. 

 

 

public class Cafe {

	int price = 0;

	public void pay(String menu , int cash) { //현금결제

	 if(menu.equals("아메리카노")){
		 price = 2500;
	 }else if(menu.equals("라떼")){
		 price = 3500;
	 }
	 else{ //"치즈케이크"
		 price = 5400;
	 }
	 System.out.println("거스름돈은" + (cash-price)+"입니다");
	}
    
	public void pay(String menu , Card card) { //카드객체를 매개변수로 받는 함수 오버로드
		this.pay(menu, 0);
		card.money = card.money - price;
	}	
}

 

현금결제용 pay 메소드는 int 정수를 받는 반면,

카드용 pay 메소드는 이름은 같지만 Card 객체를 인자로 받습니다.

이렇게 다른 인자를 받지만 이름도 같고 기능도 같은 메소드를 '오버로딩' 했다고 할 수 있습니다.

 

-오버로딩의 조건: 메소드 이름이 같고 매개변수가 다릅니다. 단, 반환형은 같아야합니다. 이름과 매개변수 같은데 반환형이 다르게 오버로딩 할 수 는 없습니다. 어떤 메소드를 호출할지 몰라 에러가 발생하기 때문입니다. 

오버로딩한 메소드들은 아마 비슷한 기능을 할 것입니다. 즉 코드가 중복될 확률이 높습니다. 또한 문제 발생시 한번에 다 오버로딩한 코드들을 다 바꾸려면 매우 복잡할 것입니다.

이런 경우 this 키워드를 활용할 수 있습니다.

 
해당클래스, 즉 자기 자신을 지칭하는 this.를 이용해서

기본이 되는 메소드를 호출한뒤 추가 코드를 입력하는 방식으로 코

드 중복을 제거하고 유지보수를 용이하게 할 수 있습니다. 

 

헷갈리는 오버라이딩과 오버로드의 차이점을 알아보았습니다.

두 기능의 차이를 알고나면

또 하나의 헷갈리는 키워드 super 와 this 의 쓰임새 까지 정리가 되니

꼭 알아두면 좋을 것 같네요