* 이 글은 자바의정석에서 읽은 내용을 제가 정리한 글입니다.
오버로딩(Overloading)
- 오버로딩?
: 한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것
- 오버로딩(Overloading)의 사전적의미
: '과적하다' 즉 많이 싣는 것, 하나의 메서드 이름으로 여러기능을 구현
조건
1. 메소드 이름이 같아야한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
* 오버로딩 된 메서드 들은 매개변수에 의해서만 구별될 수 있으므로 반환타입은 오버로딩을 구현하는데 아무런 영향을 주지 못함.
- 오버로딩의 예
- println메서드
println 메서드를 호출할때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라진다.
PrintStream클래스에는 어떤종류의 매개변수를 지정해도 출력할 수 있도록 아래와 같은 10개의 오버로딩 된 println메서드를 정의
- void println()
- void println(boolean x)
- void println(char x)
- void println(char[] x)
- void println(double x)
- void println(float x)
- void println(int x)
- void println(long x)
- void println(Object x)
- void println(string x)
- 오버로딩이 성립되지 않는 경우
- 매개변수의 이름은 다르지만 매개변수의 타입이 같은 경우
int add(int a,int b) { return a+b; }
int add(int x,int y) { return x+y; }
- 리턴타입만 다른 경우
int add(int a, int b) { return a+b;}
long add(int a, int b) { return (long)(a+b);}
- 오버로딩이 성립되는 경우
- 두 메서드의 매개변수 타입, 이름은 같지만 위치가 다른경우
long add(int a, long b) {return a+b;}
long add(long a, int b) {return a+b;}
: 두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어 있지만, 서로 순서가 다른 경우에는 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 중복메서드 정의가 아닌, 오버로딩으로 간주한다.
오버라이딩(Overriding)
- 오버라이딩?
: 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
- 오버라이딩의 사전적의미
: ~위에 덮어쓰다(overwrite)
조건
자손클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
1. 이름이 같아야한다.
2. 매개변수가 같아야한다.
요약하자면 선언부가 서로 일치해야한다는 것이다.
1. 접근제어자는 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다.
2. 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
- 오버라이딩의 예
class Point{
int x;
int y;
String getLocation() {
return "x: " + x + ", y: " + y;
}
}
class Point3D extends Point {
int z;
String getLocation() {
return "x: " + x + ", y: " + y + ",z: "+ z;
}
}
Point클래스의 getLocation()은 한 점의 x,y좌표를 문자열로 반환하도록 작성되었다.
이 두 클래스는 서로 상속관계에 있으므로 Point3D클래스는 Point클래스로부터 getLocation()을 상속받지만,
Point3D클래스는 3차원 좌표계의 한 점을 표현하기 위한 것이므로 조상인 Point클래스로부터 상속받은
getLocation()은 Point3D클래스에 맞지 않는다. 그래서 이 메서드를 Point3D클래스 자신에 맞게 z축 좌표값도 포함하여 반환하도록 오버라이딩 했다.
오버라이딩 vs 오버로딩
오버라이딩과 오버로딩은 서로 혼동하기 쉽지만 사실 그 차이는 명백하다. 오버로딩은 기존에 없는 새로운 메서드를 추가하는 것이고, 오버라이딩은 조상으로 부터 상속받은 메서드의 내용을 변경하는 것이다.
오버로딩(Overloading) - 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩(Overriding) - 상속받은 메서드의 내용을 변경하는 것(change,modify)
'언어 > JAVA' 카테고리의 다른 글
[JAVA] 가비지 컬렉터(GC) 동작원리 (0) | 2023.04.13 |
---|---|
[Java] 우선순위 큐 (PriorityQueue) 개념 , Comparable (0) | 2023.02.02 |
[Java] 객체 정렬하기 - Comparable (0) | 2023.02.01 |
java - 시간, 분 차이 구하기 (0) | 2021.03.28 |