오버로딩(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) 때문이다.
다형성에 대해 궁금하다면 아래의 링크를 참조하길 바란다.
오버로딩과 오버라이딩 비교예제
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 |
댓글