Java | 오버로딩(Overloading)과 오버라이딩(Overriding)

나경호·2022년 5월 15일
0

CS | Java

목록 보기
5/9
post-thumbnail

파견이 끝나고 복귀하니 정신없는 시간을 보내게 되어 잠시 공부내용을 기록하는 것에 소홀했던 나.. 반성합니다.
이번엔 서로 다른 개념이지만 아름이 비슷해 헷갈리는 Overloading과 Overriding에 대해 정리해보려고 합니다.

오버로딩(Overloading)

  • 단어의 뜻은 ‘과적한다’는 의미로, 같은 이름의 메서드가 매개변수의 타입과 개수를 다르도록하여 다른 기능을 수행하도록하는 기술이다.
  • 기존에 없는 새로운 메서드를 정의하는 것이다.

오버라이딩(Overriding)

  • 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
  • 자손 클래스 자신에 맞게 변경해야하는 경우에 오버라이드, 즉 덮어씌우는 것이다.

오버로딩(Overloading)


class OverloadingTest {
    void animal() {
        System.out.println("매개변수 없음");
    }

    void animal(int a){
        System.out.println(a);
    }

    void animal(int a, int b){
        System.out.println(a+b);
    }

    void animal(int a, long b){
        System.out.println(a+b);
    }
} 

class Main{

    public static void main(String[] args) {
        OverloadingTest olt = new OverloadingTest();
        olt.animal();
        olt.animal(1);
        olt.animal(1, 2);
        olt.animal(1,30000000);
    }
}

결과값

매개변수 없음
1
3
300000001

즉, 같은 이름의 메서드이지만 매개변수의 개수 또는 타입이 다른 경우에 Overloading이 성립한다고 볼 수 있다.

또한

animal(int a, long b) { System.out.println(a+b); }
animal(long a, int b) { System.out.println(a+b); }

이 두 메서드의 경우에도 Overloading이라고 할 수 있다.

Overloading의 장점

우리가 가장 익숙할만한 Overloading의 예는 println이 있다.
만약 우리가 출력할 때마다 매개변수의 개수, 타입이 다른 경우 또는 순서가 다른 경우마다 모두 메서드의 이름을 다르게 선언해야한다면 굉장히 불편할 것이다.
아래와 같이 예를 들 수 있다.

println();
printlnBoolean(boolean x);
printlnChar(char x);
printlnDouble(double x);
printlnString(String x);

오버라이딩(Overriding)

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;
		}
						
}

위의 코드와 같이 부모 클래스를 상속받은 자식 클래스가 부모 클래스와 다른 정보를 저장해야할 때 오버라이딩한다.

오버라이딩에도 역시 조건이 있다.
자식 클래스에서 오버라이딩하는 매서드는 부모 클래스의 메서드와
1. 이름이 같아야 한다.
2. 매개변수가 같아야 한다.
3. 반환타입이 같아야 한다.

  • JDK 1.5부터 ‘공변 반환타입(covariant return type)’ 이 추가되어, 반환타입을 자식 클래스의 타입으로 변경하는 것은 가능하도록 조건이 완화됨.

조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때

  1. 접근 제어자(public, protected, (default), private)를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  2. 예외는 조상 클래스의 베서드보다 많이 선언할 수 없다.
  3. 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

즉, 오버라이딩은

  1. 선언부 일치
  2. 조상 클래스보다 좁은 접근 제어자 사용 불가
  3. 조상 클래스보다 더 넓은 예외 사용 불가

라는 조건을 가진다고 기억하면 된다.

@Override는 어떤 용도인가?

@Override에서 @는 어노테이션(Annotation)이라고 하며, 주석이라는 뜻이다. 우리가 알고있는 //과 같은 일반적인 주석과 다르게, 검증하는 기능을 한다. @Override는 여기서 오버라이딩을 검증하는 기능을 한다. 코드상으로 검사했을 때, 오버라이딩이 실제로 시행되지 않았다면 컴파일시 오류를 출력한다.

결론

오버로딩 vs 오버라이딩

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

Reference

profile
기억창고👩‍🌾

0개의 댓글