○ 메소드 오버로딩 (중복정의)
- 정의 : 메소드가 처리하는 기능은 같고, 메소드 괄호 속에 오는 인수(인자, 매개변수, 파라미터)의 개수가 다르거나 자료형(Data Type)이 다른 경우 메소드의 이름을 동일한 이름으로 부여하여 메소드를 정의할 수 있도록 문법적으로 허용한다.
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
41
42
43
44
45
46
|
public class Test098 {
public static void main(String[] args) {
drawLine(); // 같은 클래스 안에 있으므로 클래스명 생략 가능
//--==>> ====================
// 매개변수가 없는 메소드를 찾아간다
drawLine('+');
//--==>> ++++++++++++++++++++
// char 한 개를 매개변수로 받는 메소드를 찾아간다
drawLine('>');
//--==>> >>>>>>>>>>>>>>>>>>>>
// char 한 개를 매개변수로 받는 메소드를 찾아간다
drawLine('/', 50);
//--==>> //////////////////////////////////////////////////
// char 한 개, int 한 개를 매개변수로 받는 메소드를 찾아간다
drawLine('+', 30);
//--==>> ++++++++++++++++++++++++++++++
// char 한 개, int 한 개를 매개변수로 받는 메소드를 찾아간다
}
// 선을 그리는 메소드 정의
public static void drawLine() {
System.out.println("====================");
}
// 선의 형태를 바꾸어 그리는 메소드 정의
public static void drawLine(char c) {
for (int i=0;i<20;i++) {
System.out.print(c);
}
System.out.println();
}
// 선의 형태와 길이를 바꾸어 그리는 메소드 정의
public static void drawLine(char c, int n) {
for (int i=0;i<n;i++) {
System.out.print(c);
}
System.out.println();
}
}
|
cs |
[특징]
- 원래 하나의 클래스 안에 동일한 이름을 가진 메소드를 정의할 수는 없다. 메소드는 '메소드명'으로 식별하기 때문.
- 그렇다고 같은 기능을 가지고 있는데 drawLine1(), drawLine2(), drawLine3()...으로 정의한다면 사용자는 몇 번의 drawLine이 원하는 기능을 가지고 있는지 모두 알아야 한다.
- 따라서 같은 기능을 가진 메소드의 이름은 같게 하여 효율성을 높이되, 매개변수의 개수와 타입을 다르게 주어서 구분하기로 한다.
○ 메소드 오버라이딩 (재정의)
- 정의 : 메소드 이름, 리턴타입, 파라미터 수나 타입이 완전히 일치해야 성공하며, 반드시 상속 관계가 있어야 한다.
[특징]
- 재정의된 하위 클래스의 메소드 접근제어지시자는 상위 클래스의 메소드 접근제어지시자보다 범위가 크거나 같아야 한다. (ex. 상위 클래스가 'protected'인 경우, 하위 클래스가 이 메소드를 오버라이딩 하려면 'protected' 또는 'public' 이어야 한다)
- 'static', 'final', 'private' 메소드는 오버라이딩 할 수 없다.
static : 상속의 개념이 아니라 탄생시점 때문에 오버라이딩 불가. 클래스가 로딩되는 시점에 이미 메모리를 할당받았기 때문에 고쳐쓸 수 없다.
final : '나 이거 오버라이딩 안시켜줄거야'라는 의미로 쓴다. 최종적으로 완료시켜놓은 메소드니까 재정의하지말라는 의미로 쓰인다.
private : 상속을 안시켜줄거라고 지정해 놓은 접근제어자다. 아예 상속 받지 않게 해놓았기 때문에 오버라이딩은 더더욱 불가하다.
- Exception의 추가가 불가능하다.
즉, 상위 클래스의 메소드가 가지고 있는 기존 예외 사항에 새로운 Exception을 추가하는 것은 불가능하다는 것이다. 상위 클래스의 Exception을 그대로 받아서 오버라이딩 해야 한다.
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
41
|
class SuperTest109 {
private int a = 5;
protected int b = 10;
public int c = 20;
public void write() {
System.out.println("Super write() 메소드 : " + a + " : " + b + " : " + c);
}
}
// 자식 클래스(하위 클래스, sub class)
class SubTest109 extends SuperTest109 {
protected int b = 100;
@Override
public void write() {
//System.out.println("Sub write() 메소드 : " + a + " : " + b + " : " + c);
//-- 슈퍼클래스에서 선언된 변수 a 에는 접근할 수 없다.
// → private 변수이기 때문에...
System.out.println("Sub write() 메소드 : " + b + " : " + c);
}
}
// main() 메소드를 포함하는 외부의 다른 클래스
public class Test109 {
public static void main(String[] args) {
// 하위 클래스(SubTest109) 인스턴스 생성
SubTest109 ob = new SubTest109();
ob.write();
//--==>> Sub write() 메소드 : 100 : 20
System.out.println("---------------------------- 구분선");
((SuperTest109)ob).write();
//--==>>Sub write() 메소드 : 100 : 20
// 부모클래스로 형변환을 하더라도 오버라이딩이 되었으니까 Sub write가 나옴
}
}
|
cs |
- 부모 클래스인 SuperTest는 변수 a, b, c를 가지고 있으며, 자식클래스인 Test109는 b를 가지고 있다.
- 15번 Line : 어노테이션(Annotation)
- 16번 Line : 부모 클래스인 6번 Line과 완전히 일치하기 때문에 오버라이딩이 성공한다.
- 17번 Line : 단, a는 부모 클래스에서 private으로 선언되었기 때문에 접근할 수 없다.
- 32번 Line : 메소드 호출 시, 오버라이딩 성공하여 21번 Line의 출력문이 출력된다.
이 때, b는 가까운 자식 클래스의 변수이며, c는 부모 클래스에 public으로 선언된 변수다.
- 37번 Line : [주의] 자식클래스로 생성한 객체 ob를 (SuperTest109)ob 로 부모클래스로 형변환하였다.
하지만 이미 오버라이딩 되었기 때문에 32번 Line 결과와 동일하게 자식클래스로 출력된다.
@어노테이션(Annotation) :
- 사용자의 편의를 위해 작성된다.
- 메타데이터(기능적으로 영향을 미치지 않는 데이터)로 JDK 1.5 버전 부터 사용 가능하다.
- @Override를 쓰는 순간 상속받았다는 사실과 해당 메소드가 오버라이딩 되었다는 것을 명시할 수 있다.
- @Override를 쓰지 않아도 오류는 발생하지 않지만 오버라이딩 한 메소드는 붙이는 것을 원칙으로 한다.
- 어노테이션은 컴파일 대상으로 class파일 안에 남아있다. (//주석은 남아있지 않는다)
<정리>
[공통점]
메소드명을 같게 한다.
[차이점]
오버로딩 : 파라미터의 개수나 타입을 다르게 설정한다.
오버라이딩 : 모든 모양이 똑같아야 한다. 리턴타입, 파라미터 수나 타입이 완전히 일치해야 한다.
반드시 상속관계가 있어야 한다.
'스터디 > 개념정리' 카테고리의 다른 글
다형성이란?/업캐스팅/다운캐스팅/상속/java (0) | 2020.02.15 |
---|---|
상속의 기본 개념/클래스 상속/java (0) | 2020.02.15 |
배열과 난수/java (0) | 2020.02.11 |