본문 바로가기
Language/Java

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

by jaee_ 2021. 8. 11.

오버로딩(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
자바의 신 책

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

[Java] JAVA 8 특징  (0) 2021.08.18
[Java] 다형성(polymorphism)이란?  (0) 2021.08.15
[Java] 상속(Inheritance)에 대해서  (0) 2021.08.14
[Java] 변수(Variable)와 자료형(Data type)  (0) 2021.07.18
[Java] 삼항연산자 알아보기  (0) 2020.11.25

댓글