Language/Java

[Java] 오버라이딩(Overriding)과 오버로딩(Overloading)의 차이점

jaee_ 2021. 8. 11. 23:56

오버로딩(Overloading)이란?

 메소드도 변수와 같이 같은 클래스내에서 구분이 필요하기 때문에 메소드 명이 각기 달라야한다. 하지만 자바에서는 메소드명이 같더라도 매개변수의 개수 또는 타입이 다르면 같은 이름을 사용해서 메소드를 정의할 수 있다. 

이처럼 한 클래스 내에 같은 이름의 메소드를 여러개 정의하는 것을 '오버로딩(Overloading)'이라고 한다.

 

오버로딩(Overloading)의 조건

  • 메소드 이름이 같아야 한다.
  • 매개변수 또는 타입이 달라야한다. 

예제

public Class Overloading{
	// 매개변수 미존재 
    void play() {
		System.out.println("매개변수 미존재");
	}

	// 매개변수 int형 1개
	void play(int a) {
		System.out.println("매개변수 int형 1개 존재");
	}
    
	// 매개변수 String형 1개
	void play(String game) {
		System.out.println("매개변수 String형 1개 존재");
	}
    
	// 매개변수 int형 1개,String형 1개
	void play(int a,String name) {
		System.out.println("매개변수 int형 1개,String 형 1개");
	}
}

실행

public Class OverloadingTest{
	
    // 오버로딩된 메소드가 적힌 클래스 호출
    Overloading test = new Overloading();
    
    test.play();
    test.play(1);
    test.play("study");
    test.play(1,"computer");
    
}

 

실행결과

매개변수 미존재
매개변수 int형 1개 존재
매개변수 String형 1개 존재
매개변수 int형 1개,String 형 1개

오버로딩을 사용하면 같은 기능을 하는 메소드를 매개변수타입이 다르다고 하나씩 다른 이름으로 지정해주지 않아도 된다. 만약 오버로딩이 없었다면,,, 메소드명을 정하는데 머리아팠을 것 같다. 

 

오버라이딩(Overriding)이란?

오버라이딩이란 상위클래스로부터 상속받은 메소드의 내용을 변경하는 것을 '오버라이딩(Overriding)'이라고 한다. 상속받은 메소드를 그대로 사용하기도 하지만, 하위클래스 자신에 맞게 변경해야하는 경우가 많다. 이럴 때 상위클래스의 메소드를 오버라이딩 한다.

 

오버라이딩(Overriding)의 조건

  • 이름이 같아야 한다.
  • 매개변수가 같아야 한다.
  • 반환타입이 같아야 한다.

상위클래스의 메소드를 하위클래스에서 오버라이딩 할 때

  • 접근 제어자를 상위클래스의 메소드보다 좁은 범위로 변경할 수 없다.
  • 예외는 상위클래스의 메소드보다 많이 선언할 수 없다.
  • 인스턴스 메소드를 static메소드로 또는 그 반대로 변경할 수 없다.

 

예제

// 부모클래스
public class Parent {
	void dowork() { System.out.println("부모 클래스의 dowork() 메소드입니다."); }
}

// 자식클래스
public class Child extends Parent {
	void dowork() {
		System.out.println("자식 클래스의 dowork() 메소드입니다.");
	}
}

// 실행 클래스
public class Overriding {
	public static void main(String[] args) {
		Overriding overriding = new Overriding();
		
		Parent pa = new Parent();
		pa.dowork();
		
		Child ch = new Child();
		ch.dowork();
		
		Parent pc = new Child();
		pc.dowork(); 
	}
}

 

실행결과

부모 클래스의 dowork() 메소드입니다.
자식 클래스의 dowork() 메소드입니다.
자식 클래스의 dowork() 메소드입니다.

 

위의 실행결과 중 세번째와 같은 인스턴스의 참조가 허용되는 이유는 바로 자바에서의 다형성(polymorphism) 때문이다.

다형성에 대해 궁금하다면 아래의 링크를 참조하길 바란다. 

 

[Java] 다형성(polymorphism)이란?

📚 멘토님이 다형성은 무엇인지, 왜 사용하는지에 대해서 물어보셨는데 머릿속으로는 뭔지 그려지는데 막상 대답을 하려니 내가 아는 내용이 맞는지 의심이 들었고, 현재 알고있는 내용도 어

yeoonjae.tistory.com

 

오버로딩과 오버라이딩 비교예제

Class Parent{
	void parentMethod(){}
}

Class Child extends Parent{

	void parentMethod(){}			//(1)
    	void parentMethod(int i){}		//(2)
	
    	void childMethod(){}			//(3)
    	void childMethod(int i){}		//(4)
    	void childMethod(){}			//(5)

}

결과

(1) : Child라는 클래스가 Parent라는 상위클래스를 상속받았다. 그렇기때문에 Parent클래스에 있는 메소드인 parentMethod()를 사용할 수 있다. --> 오버라이딩

(2) : 같은 이름의 메소드를 매개변수 개수만 다르게 하였다 --> 오버로딩

(3) : 메소드 생성

(4) : (3)의 메소드명과 동일하지만 매개변수가 다르다. --> 오버로딩

(5) : (3)의 메소드명과 매개변수까지 모두 동일하다 --> 에러


 

오버로딩(Overloading) : 메소드의 확장의 개념으로 메소드명은 동일하지만 매개변수의 타입과 개수가 다른 것
오버라이딩(Overriding) : 재정의의 개념으로 상위클래스의 메소드를 하위클래스에서 재정의해서 사용할 수 있다.

 


 

참조한 사이트
http://tcpschool.com/java/java_inheritance_overriding
자바의 신 책