오버 로딩 (overloading)

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것

오버로딩 조건

1. 메서드 이름이 같아야 한다.

2 매개변수의 개수 또는 타입이 달라야 한다.

3. 반환 타입은 관계없다.

 

비록 메서드의 이름이 같다 하더라도 매개변수가 다르면 구별될 수 있기 때문에 오버로딩 가능

대표적인 예시는  println 메서드이다. 

어떤 종류의 매개변수를 지정해도 출력할 수 있도록 아래와 같이 10개의 오버로딩 되어있다.

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; }
매개변수의 이름만 같을뿐 매개변수 타입이 같기때문에 오버로딩 x
-----------------------------------------------------------------------------

int add(int a, int b) { return a+b; }
long add(int a, int b) { return (long)(a+b); }
리턴타입만 다른경우이다. 매개변수의 타입과 개수가 일치해서 오버로딩 x
-----------------------------------------------------------------------------

long add(int a, long b) { return a+b; }
long add(long a, int b) { return a+b; }
int형과 long형 매개변수가 하나씩 선언되어 있지만,서로 순서가 다르므로 오버로딩 o
------------------------------------------------------------------------------

 

오버라이딩 (overriding)

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것.

상속받은 메서드를 자손 클래스 자신에 맞게 변경해야되는 경우에 사용.

 

오버라이딩 조건

1. 선언부가 조상 클래스의 메서드와 일치해야한다. (메서드이름, 매개변수, 변환타입)

2.  접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다. (대부분 같은 범위의 접근제어자 사용)

3. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

 

오버라이딩 예시)

class Point {
	int x;
    int y;
    
    String getLocation() {
    	return "x :" + x + ", y :"+ y;
	}
}        

class Point3D extends Point {
	int z;
    
    String getLocation() {  //오버라이딩 (z축도 출력할 수있도록 변경)
    	return "x :" + x + ", y :"+ y + ", z :" + z;
	}
}
--------------------------------------------------------
Point클래스로부터 상속받은 getLocation()은 Point3D에 맞지 않는다. (x, y 만 출력하기 때문)
그래서 이 메서드를 Point3D클래스 자신에 맞게 z축의 좌표값도 포함하여 변환하도록
오버라이딩 하였다.

 오버로딩 vs 오버라이딩

사실 오버로딩과 오버라이딩은 관계가 전혀 없지만 혼동하기 쉬워 묶어서 포스팅하였다.

오버로딩     =    기존에 없는 새로운 메서드를 정의 하는것 (new)

오버라이딩  =   상속받은 메서드내용을 변경하는것 (change, modify)