오버로딩 vs 오버라이딩

준우·2023년 2월 18일
0

Java

목록 보기
27/30
post-thumbnail
post-custom-banner

💡 오버로딩 vs 오버라이딩
오버로딩(overloading): 이름은 같지만 기존에 없던 새로운 기능의 메서드를 새로 정의하는 것 (new)
오버라이딩(overriding): 상속 받은 메서드의 내용을 변경/재정의하는 것 (change, modify)

🧐 결론을 먼저 말하자면 둘의 차이는 위와 같다.
각 역할의 자세한 내용에 대해서는 아래에서 알아보자.

오버로딩(overloading)

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

overloading, 한국말로 "과적하다."

오버로딩의 대표적인 예시가 바로 println() 이다.
우리는 println() 메소드를 쓸 때, 어떤 매개변수를 써야할지 고민한 적이 한번도 없다.
왜냐하면 PrintStram 클래스 안에 아래와 같은 메서드들이 정의되어있고
컴파일러가 알맞은 메소드를 호출해주었기 때문이다.

void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(float x)
void println(int x)
void println(long x)
void println(Object x)
void println(String x)

이렇게 메서드 한 개로 여러가지 기능들을 할 수 있는 것이 오버로딩이다.

자바가 오버로딩을 지원하지 않는다면 모든 메서드의 이름은 달랐어야할 것이고
우리는 println을 호출할때 마다 알맞은 메서드명을 떠올리느라 애를 먹었을지도 모른다.

void printlnInt(int x)
void printlnChar(char x)
void printlnFloar(floar x)
.
.
.

오버로딩 성립 조건

  • 메서드 이름이 같아야 한다.
  • 매개변수의 개수 또는 타입이 달라야 한다.
  • 반환 타입은 영향이 없다.

오버로딩의 올바른 예

  • 매개변수는 다르지만 같은 의미의 기능을 수행
class MyMath3 {
	int add(int a, int b) {
		System.out.print("int add(int a, int b) - ");
		return a+b;
	}
	
	long add(int a, long b) {
		System.out.print("long add(int a, long b) - ");
		return a+b;
	}
	
	long add(long a, int b) {
		System.out.print("long add(long a, int b) - ");
		return a+b;
	}

	long add(long a, long b) {
		System.out.print("long add(long a, long b) - ");
		return a+b;
	}

	int add(int[] a) {		// 배열의 모든 요소의 합을 결과로 돌려준다.
		System.out.print("int add(int[] a) - ");
		int result = 0;
		for(int i=0; i < a.length;i++) 
			result += a[i];
		
		return result;
	}
}

주의점

long add(int a, long b)
long add(long a, int b)

위와 같은 메서드 두개가 있을 때, add(3, 3)처럼 메소드를 호출하는 경우 컴퓨터는 어떤 메서드를 호출해야할지 모호하다. 그래서 "The method is ambiguous" 오류가 발생한다. 따라서 add(3, 3L) 혹은 add(3L, 3) 처럼 명확하게 사용해야 한다.

오버라이딩(overriding)

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것

override, 한국말로 "덮어쓰다."

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

위 Point 클래스를 상속받은 아래 Point3D 클래스에서 getLocation()을 그냥 호출하면
Point3D 클래스에서 추가된 z의 좌표값을 알 수 없을 것이다.

class Point3D extends Point {
	int z;
    
    //오버라이딩
    String getLocation(){
		return "x: " + x + ", y: " + y + ", z:" + z;  
    }
}

상속받은 Point의 getLocation()을 아래처럼 자신의 상황에 맞게 재정의하는 것이 오버라이딩이다.

오버라이딩 성립 조건

  • 조상 클래스의 메소드와 반환타입, 메서드 이름, 매개변수 목록이 모두 일치해야한다.
  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

결론

💡 오버로딩 vs 오버라이딩
오버로딩(overloading): 이름은 같지만 기존에 없던 새로운 기능의 메서드를 새로 정의하는 것 (new)
오버라이딩(overriding): 상속 받은 메서드의 내용을 변경/재정의하는 것 (change, modify)

🫡 Reference

post-custom-banner

0개의 댓글