자바 객체지향(OOP)의 특징 중 하나인 다형성을 지원하는 방법으로 메소드 오버로딩, 오버라이딩이 있다.
오버로딩과, 오버라이딩을 간단히 정의하자면 다음과 같다.
- 오버로딩 : 동일한 이름을 가지는 메소드를 매개변수의 타입과 갯수로 구분짓도록 하는것을 오버로딩 이라고 한다.
- 오버라이딩 : 부모(상위) 클래스의 메소드를 재정의 하여 사용하는 것을 오버라이딩 이라고 한다.
1. 오버로딩
오버로딩은 일반적으로 메소드 오버로딩과 생성자 오버로딩이 있다. 하지만 크게 구분짓지는 않는다.
다음 예제소스를 통해서 확인해 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public class exOverloading {
public String strTest;
//기본생성자 - 매개변수 없는 타입의 생성자
public exOverloading() {
this.strTest = "기본생성자";
}
//매개변수가 있는 생성자 - new 클래스명(파라미터)로 객체를 생성하면 해당 생성자가 실행된다.
public exOverloading(String msg) {
this.strTest = msg;
}
//매개변수가 없는 메소드 - 인스턴스변수를 출력
public void print() {
System.out.println(this.strTest);
}
//매개변수가 있는 메소드 - 매개변수를 출력해 준다.
public void print(String msg) {
System.out.println(msg);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
exOverloading overloading = new exOverloading();
exOverloading overloading2 = new exOverloading("생성자 오버로딩 테스트");
//생성자 오버로딩에 대한 인스턴스 변수 확인
System.out.println(overloading.strTest);
System.out.println(overloading2.strTest);
System.out.println();
//메소드 오버로딩 결과 확인
overloading2.print();
overloading2.print("메소드 오버로딩 테스트");
}
}
|
결과)
기본생성자
생성자 오버로딩 테스트
생성자 오버로딩 테스트
메소드 오버로딩 테스트
예제소스를 보면 알 수 있듯이 동일한 메소드 및 생성자 라도 매개변수에 따라 서로다른 메소드 및 생성자를 호출할 수 있다는것을 알 수 있다.
2. 오버라이딩
부모(상위) 클래스의 메소드를 재정의 하여 사용하는 기능을 말한다. 상속을 받았지만 자식클래스 고유의 기능을 별도로 정의할 필요가 있을때 메소드 오버라이딩을 이용한다. 이부분은 상속에서 기본적으로 사용하는 기능이니 꼭 숙지하고 넘어 가도록 하자.
parent.java
1
2
3
4
5
6
|
public class parent {
public void print() {
System.out.println("부모클래스에서 print() 메소드");
}
}
|
exOverRidding.java
1
2
3
4
5
6
7
8
9
10
11
|
public class exOverRidding extends parent{
public void print() {
System.out.println("자식 클래스에서의 print() 메소드");
}
public static void main(String[] args) {
parent test = new exOverRidding();
test.print();
}
}
|
결과)
자식 클래스에서의 print() 메소드
자식클래스에서 print()메소드를 재정의 하였다. 객체를 생성하고 메소드를 호출하면 자식클래스에서 재정의한 메소드가 호출되는것을 확인할 수 있다.
3. 특성에 따른 사용가능 조건
구분 |
오버로딩 |
오버라이딩 |
매개변수 개수 및 타입 |
메소드 별로 서로 달라야 사용 가능 |
부모클래스와 동일해야함 |
메소드 이름 |
오버로딩 하는 메소드는 모두 동일해야함 |
부모클래스와 동일해야함 |
리턴타입 |
조건없음 |
부모클래스와 동일해야함 |
위 표에서 알 수 있듯이, 오버라이딩은 말그대로 재정의 이기 때문에 반드시 부모클래스와 매개변수 개수, 타입, 리턴타입, 이름이 동일해야하며 오버로딩은 메소드이름을 제외한 나머지 모두 달라야 사용가능함을 알 수 있다.
4. 오버라이딩과 static 메소드
static메소드는 실행되기 전에 이미 메모리에 적재되어 있는 것을 말한다. 이 static메소드는 재정의를 위해 사용하는 것은 아니지만 재정의를 한다고 해서 오류가 발생하지는 않는다.
만약 static메소드가 있는 부모 클래스를 상속받아서 해당 static메소드를 재정의하면 자식 클래스에 있는 해당 메소드는 사용할 수 없다. 이를 하이딩(hidding)이라고 한다.
2챕터에서 오버라이딩 예제소스중 print메소드를 static으로 변형한 후에 결과를 확인해 보자.
parent.java
1
2
3
4
5
6
7
|
public class parent {
//static으로 메소드 선언
public static void print() {
System.out.println("부모클래스에서 print() 메소드");
}
}
|
exOverRidding.java
1
2
3
4
5
6
7
8
9
10
11
12
|
public class exOverRidding extends parent{
//부모클래스의 static메소드를 재정의해보자.
public static void print() {
System.out.println("자식 클래스에서의 print() 메소드");
}
public static void main(String[] args) {
parent test = new exOverRidding();
test.print();
}
}
|
결과)
부모클래스에서 print() 메소드
2챕터에서의 결과와는 반대로 자식객체를 생성하여 메소드를 호출했는데도 불구하고 부모클래스의 메소드가 수행되었음을 확인할 수 있다.
'프로그래밍, 언어 > Java초, 중급' 카테고리의 다른 글
자바 상속(Inheritance)과 다형성(polymorphism) - final, abstract, Interface (0) | 2019.09.08 |
---|---|
자바 생성자(Java Constructor) (0) | 2019.09.08 |
자바 메소드 매개변수(Method prameter) - 기본형 매개변수와, 참조형 매개변수 (0) | 2019.09.07 |
자바 클래스내 변수(위치에 따른) - 클래스 변수와 인스턴스 변수?(static method, 정적메소드 추가설명) (0) | 2019.09.01 |
자바 메소드란?(Java method) (0) | 2019.09.01 |