관리 메뉴

기록하는 공간

오버로딩과 오버라이딩 본문

자바

오버로딩과 오버라이딩

giwoong01 2023. 7. 5. 13:52

오버로딩과 오버라이딩은 이름이 비슷하여 서로 혼동하기 쉽지만 그 차이는 명확하다.


오버로딩과 오버라이딩

- 오버로딩(overloading)
    - 기존에 없는 새로운 메서드를 정의하는 것(new)
- 오버라이딩(overriding)
    - 상속받은 메서드의 내용을 변경하는 것(change, modify)

오버로딩과 오버라이딩의 차이를 하나씩 살펴보자.


1. 오버로딩(overloading)

1.1 오버로딩이란?

  • 기존에 없는 새로운 메서드를 정의하는 것
  • 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 ‘메서드 오버로딩(method overloading)’ 또는 ‘오버로딩(overloading)’이라고 한다.
  • 오버로딩이 성립하기 위한 조건이 있다.
    1. 메서드 이름이 같아야 한다.
    2. 매개변수의 개수 또는 타입이 달라야 한다.

1.2 오버로딩의 예

void println()
void println(boolean x)
void println(char x)
void println(int x)
void println(double x)
void println(int[] 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; }

마지막으로 이 경우에는 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있기 때문에, 중복된 메서드가 아니다. 그러므로 오버로딩으로 간주한다.

1.3 오버로딩의 장점

  • 오버로딩을 통해 여러 메서드들이 하나의 이름으로 정의될 수 있다.
    • 하나의 이름만 기억하면 되므로 기억하기도 쉽고 이름도 짧게 할 수 있어서 오류의 가능성을 줄일 수 있다.
    • 메서드의 이름이 같은 것을 보고 같은 기능을 할 것이라는 예측이 쉽다.
  • 메서드의 이름을 절약할 수 있다.
    • 하나의 이름으로 여러 개의 메서드를 정의할 수 있으니, 메서드의 이름을 짓는데 고민을 덜 수 있는 동시에 사용되었어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있기 때문이다.

2. 오버라이딩(overriding)

2.1 오버라이딩이란?

  • 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것.
  • 자손 클래스 자신에 맞게 변경해야 하는 경우에는 조상의 메서드를 오버라이딩 해야한다.
  • 오버라이딩이 성립하기 위한 조건이 있다.
    1. 이름이 같아야 한다.
    2. 매개변수가 같아야 한다.
    3. 반환타입이 같아야 한다.

2.2 오버라이딩의 예

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

class Point3D extends Point {
	int z;
		
	@Override		
	String getLocation() {
		return "x :" + x + ", y :" + y + ", z :" + z;
	}
}

다음 예시와 같이 부모 클래스의 메서드를 자식 클래스에서 재정의 하는 것이다.

2.3 오버라이딩 주의점

  • 조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때
    1. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
    2. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
    3. 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

마지막으로 오버로딩과 오버라이딩을 다음 코드를 보고 구분 해보자

class Parent {
	void parentMethod() {}
}

class Child extends Parent {
	void parentMethod() {}      // 오버라이딩
	void parentMethod(int i) {} // 오버로딩

	void childMethod() {}
	void childMethod(int i) {}  // 오버로딩
	void childMethod() {}       // 에러 -> 중복정의
}

끝으로 오버로딩과 오버라이딩의 차이점을 알아보았다.

 

처음 접했을 때 이름이 비슷해 같은 기능을 할 줄 알았지만,

공부하면서 확연히 다른 기능을 한다는 것을 배울 수 있었다.

'자바' 카테고리의 다른 글

assertThatThrownBy와 assertThatCode는 무엇인가  (0) 2023.10.31