자바에서 다형성을 지원하는 방법으로 메서드 오버로딩과 오버라이딩이 있습니다.
오버로딩(Overloading) : 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술
오버라이딩(Overriding) : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용
서로 개념은 다르지만 이름이 비슷해서 헷갈리는 경우도 있고, 신입 개발자의 경우 면접 단골 질문이기도 하니
하나하나 예제를 살펴보겠습니다.
오버로딩(Overloading)
오버로딩은 메서드 오버로딩과 생성자 오버로딩이 있습니다. 하지만 둘 다 같은 개념이에요.
같은 이름의 함수(메서드)를 여러개 정의하고, 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게됩니다.
예제소스)
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
|
class OverloadingTest{
//이름이 cat인 메서드
void cat(){
System.out.println("매개변수 없음");
}
//매개변수 int형이 2개인 cat 메서드
void cat(int a, int b){
System.out.println("매개변수 :"+a+", "+b);
}
//매개변수 String형이 한 개인 cat 메서드
void cat(String c){
System.out.println("매개변수 : "+ c);
}
}
public class OverTest {
public static void main(String[] args) {
//OverloadingTest 객체 생성
OverloadingTest ot = new OverloadingTest();
//매개변수가 없는 cat() 호출
ot.cat();
//매개변수가 int형 두개인 cat() 호출
ot.cat(20, 80);
//매개변수가 String 한개인 cat() 호출
ot.cat("오버로딩 예제입니다.");
}
}
|
cs |
실행결과)
이름이 cat인 메서드가 총 3개가 있지만 각각 매개변수의 유형과 개수가 다른게 보이시죠?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//이름이 cat인 메서드
void cat(){
System.out.println("매개변수 없음");
}
//매개변수 int형이 2개인 cat 메서드
void cat(int a, int b){
System.out.println("매개변수 :"+a+", "+b);
}
//매개변수 String형이 한 개인 cat 메서드
void cat(String c){
System.out.println("매개변수 : "+ c);
}
|
cs |
그리고 호출 시 매개변수를 입력하면 호출 매개변수에 따라 매칭되어 함수를 실행시켜 줍니다.
1
2
3
4
5
6
7
8
|
//매개변수가 없는 cat() 호출
ot.cat();
//매개변수가 int형 두개인 cat() 호출
ot.cat(20, 80);
//매개변수가 String 한개인 cat() 호출
ot.cat("오버로딩 예제입니다.");
|
cs |
오버라이딩(Overriding)
상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메서드도 하위 클래스로 상속되어 하위 클래스에 사용할 수 있습니다. 또한, 하위 클래스에서 메서드를 재정의해서도 사용할 수 있습니다.
쉽게 말해 메서드의 이름이 서로 같고, 매개변수가 같고, 반환형이 같을 경우에 상속받은 메서드를 덮어쓴다고 생각하시면 됩니다. ' 부모클래스의 메서드는 무시하고, 자식 클래스의 메서드 기능을 사용하겠다'와 같습니다.
예제소스)
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
|
class Woman{ //부모클래스
public String name;
public int age;
//info 메서드
public void info(){
System.out.println("여자의 이름은 "+name+", 나이는 "+age+"살입니다.");
}
}
class Job extends Woman{ //Woman클래스(부모클래스)를 상속받음 :
String job;
public void info() {//부모(Woman)클래스에 있는 info()메서드를 재정의
super.info();
System.out.println("여자의 직업은 "+job+"입니다.");
}
}
public class OverTest {
public static void main(String[] args) {
//Job 객체 생성
Job job = new Job();
//변수 설정
job.name = "유리";
job.age = 30;
job.job = "프로그래머";
//호출
job.info();
}
}
|
cs |
실행결과)
Job Class(자식클래스)에서 Woman Class(부모클래스)를 상속받아 부모클래스에 있는 info()를 재정의하여 사용하였고,
메인메서드에서 Job 객체를 생성하고 호출하였기 때문에 Job클래스의 내용이 실행되었습니다.
부모클래스의 info() 와는 다르죠? 부모클래스를 호출하였다면 실행결과는 여자의 이름은 유리, 나이는 30살입니다. 가 되었겠죠.
자식클래스만 호출했을때 부모클래스의 내용도 그대로 가져오고 싶을때는 어떻게 해야할까요?
여자의 이름과 나이, 직업을 모두 알고싶을때는 똑같이 재정의 해도 되고, super예약어를 사용해도 됩니다.
예제소스 1)
1
2
3
4
5
6
7
8
9
10
11
|
class Job extends Woman{
String job;
public void info() {
System.out.println("여자의 직업은 "+job+"입니다.");
System.out.println("여자의 이름은 "+name+", 나이는 "+age+"살입니다."); //추가
}
}
|
cs |
예제소스 2)
1
2
3
4
5
6
7
8
9
10
|
class Job extends Woman{
String job;
public void info() {
super.info(); //추가
System.out.println("여자의 직업은 "+job+"입니다.");
}
}
|
cs |
실행결과)
1) 부모클래스에 있던 변수들을 자식클래스에서 상속받았기 때문에 자식클래스에서 선언을 해주지 않더라도 사용할 수 있습니다.
2) super 예약어 를 사용하는 이유는 자식클래스에서 재정의된 info() 메서드에 의해 부모클래스에 있는 info()메서드가 가려지기(덮어썼기) 때문입니다.
*super 예약어에 대한 내용은 따로 포스팅을 하겠습니다. 완료 후 링크를 걸어놓을게요.
**
오버로딩(Overloading)과 오버라이딩(Overriding) 성립조건
구분 |
오버로딩 |
오버라이딩 |
메서드 이름 |
동일 |
동일 |
매개변수, 타입 |
다름 |
동일 |
리턴 타입 |
상관없음 |
동일 |
'프로그래밍 > Java' 카테고리의 다른 글
자바(JAVA) 상속/ 생성자/ SUPER 예약어 (1) | 2016.10.06 |
---|---|
자바(JAVA) 인터페이스와 추상클래스의 설명과 예제 (0) | 2016.09.30 |
자바 기초 문제 (4) | 2016.09.29 |
댓글