1 분 소요

Overloading 오버로딩

한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.

오버로딩 조건

  • 메서드 이름이 같고, 매개변수의 개수나 타입이 달라야 한다.
  • 리턴 값만 다른 것은 오버로딩 할 수 없다.
// 매개변수는 같지만 타입이 다르기 때문에 오버로딩 가능
int add(int a, long b) {return a + b;}
int add(long a, int b) {return a + b;}
public class Overloading {
    public static void main(String[] args) {
        Shape s = new Shape(); // 객체 생성
 
        s.area(); // 메서드 호출
        s.area(5);
        s.area(10,10);
        s.area(6.0, 12.0);
    }
}

class Shape {
    public void area() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
        System.out.println("넓이");
    }
    public void area(int r) {
        System.out.println("원 넓이 = " + 3.14 * r * r);
    }

    public void area(int w, int l) {
        System.out.println("직사각형 넓이 = " + w * l);
    }

    public void area(double b, double h) {
        System.out.println("삼각형 넓이 = " + 0.5 * b * h);
    }
}

//출력값
넓이
 넓이 = 78.5
직사각형 넓이 = 100
삼각형 넓이 = 36.0

Overriding 오버라이딩

부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것

오버라이딩 조건

  • 메서드 이름, 매개 변수, 리턴 값이 모두 같아야 함
  • 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 함
  • 예외는 상위 클래스의 메서드보다 많이 선언할 수 없음
public class OverridingTest {

	public static void main(String[] args) {
		Person person = new Person();
		Child child = new Child();
		Senior senior = new Senior();
		
		person.scream();
		child.scream();
		senior.scream();
	}
}

class Person {
	void scream() {
		System.out.println("꾸에엑");
	}
}

class Child extends Person {
	@Override
	protected void scream() {
		System.out.println("우에왥");
	}
}

class Senior extends Person {
	@Override
	public void scream() {
		System.out.println("끼엨에엑");
	}
}

//꾸에엑
//우에왥
//끼엨에엑

Person 클래스에 scream() 메서드가 정의되어 있으며, Child, Senior 클래스에서 scream() 메서드를

재정의함으로서 Person 클래스의 run() 메서드를 오버라이딩하고 있음.

@Override는 ?

이는 어노테이션(Annotation)이라는 것으로 일반적인 주석과 다르게, 검증하는 기능을 한다.

@Override라는 어노테이션은 오버라이딩을 검증하는 기능을 한다. 코드상으로 검사했을 때 오버라이딩이 실제로 시행되지 않았다면 컴파일시 오류를 출력한다.

오버로딩과 오버라이딩의 차이점

  • 오버로딩 - 기존에 없는 새로운 메소드를 추가하는 것
  • 오버라이딩 - 상속받은 메소드를 재정의 하는 것
구분 Overriding Overloading
접근 제어자 부모 클래스의 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식 클래스의 메소드에서 설정할 수 있다. 모든 접근 제어자를 사용할 수 있다.
리턴형 동일해야 한다. 달라도 된다.
메소드명 동일해야 한다. 동일해야 한다.
매개변수 동일해야 한다. 달라야만 한다.
적용 범위 상속관계에서 적용된다. 같은 클래스 내에서 적용된다.

카테고리: ,

업데이트:

댓글남기기