상속을 배우면서 빠질 수 없는 개념들, 오버로딩(overloading)과 오버라이딩(overriding)에 대한 부분이다.
간단히 정의하면 아래와 같다.
개념 | 설명 |
---|---|
Overloading 오버로딩 |
오버로딩은 수퍼 클래스와 같은 이름의 메서드를 서브 클래스에서 여러개 만들어서 사용할 때 쓰는 개념 |
Overriding 오버라이딩 |
오버라이딩은 상속받은 서브 클래스가 수퍼 클래스의 기능(메서드)을 재정의해서 사용할때 쓰는 개념 |
둘의 차이는 오버로딩은 새로운 기능을 생성하는 것이라면, 오버라이딩은 기존의 기능을 변경하는 것이라 할 수 있다.
오버로딩
조건
- 메서드 이름이 같아야 한다.
- 파라미터의 개수 또는 파라미터의 타입이 달라야 한다.
예제코드
Car.java
1 | package devandy.java.inheritance; |
Bus.java
1 | package devandy.java.inheritance; |
CarExam.java
1 | package devandy.java.inheritance; |
CarExam
클래스의 main()
을 실행하면 결과는 아래와 같다.
1 | 차가 달립니다. |
Bus
클래스에는 선언되지 않았지만, 수퍼 클래스에서 선언된 파라미터를 받지않는 run()
을 Bus
클래스의 인스턴스를 통해 실행할 수 있었으며, 이것과 이름은 같지만 파라미터를 주입해서 생성한, 즉 오버로딩한 run(int speed)
도 실행할 수 있었다.
이처럼 메서드 이름이 같더라도 파라미터의 갯수가 반환 데이터 타입이 다르면 서로 다른 메서드처럼 사용할 수 있으며, 이를 오버로딩이라 한다.
오버라이딩
조건
- 이름이 같아야 한다.
- 파라미터까지 같아야 한다.
- 반환 데이터 타입도 같아야 한다.
오버로딩과 달리 오버라이딩은 수퍼클래스의 메서드와 완전히 같은 형식으로 선언될때 오버라이딩을 할 수 있다.
예제코드
위의 예제코드에서 Car
를 상속받는 Bus
클래스를 추가 생성했다.
Car.java
1 | package devandy.java.inheritance; |
Bus.java
1 | package devandy.java.inheritance; |
CarExam.java
1 | package devandy.java.inheritance; |
Car
클래스의 main()
실행결과는 다음과 같다.
1 | 버스가 달립니다. |
수퍼 클래스인 Car
클래스의 run()
에 선언된 print문에는 "차가 달립니다."
라고 작성되있었지만, 서브클래스에서 선언한 run()
의 "버스가 달립니다."
로 출력된걸 확인할 수 있다.
이처럼 수퍼클래스의 메서드와 이름도, 반환 데이터 타입도, 파라미터도 같은 메서드를 서브 클래스에 선엄함으로써 수퍼클래스의 메서드를 무시하고 서브클래스의 메서드를 사용할 수 있었다. 이를 오버라이딩이라 한다.
다시 정리하면, 둘의 차이는 오버로딩은 새로운 기능을 부여하는 것이라면, 오버라이딩은 기존의 기능을 변경하는 것이라 할 수 있다.