지난 번에 오버로딩에 대해서 알아봤어요.
오버로딩 :
같은 메소드명, 다른 매개변수로 메소드를 만들어
하나의 메소드명에 다양한 매개변수가 들어와도
같은 기능을 할 수 있도록 만드는 것.
오버로딩과 오버라이딩의 이름이 비슷해서
헷갈려하는 분이 많다고 하더라구요.
영어로 보면 구분이 더 쉬울텐데 말이죠.
overloading: 과하게 쌓아올리다
-> 같은 기능을 수행하는 같은 이름의 메소드를 쌓음
overriding: 덮어쓰다
-> 이전의 메소드 기능 말고, 새로운 기능을 수행하도록 덮음
오버라이딩은 메소드의 기능을 새롭게 만들어 덮어씌우는 거예요.
어떻게 덮어씌우는 걸까요?
바로 상속을 통해서 덮어씌우는 겁니다.
오버라이딩 :
조상클래스로부터 상속받은 메소드의 내용을
상속받은 클래스의 스타일대로 변경하는 것
그럼 오버라이딩은 어떻게 하는 걸까요?
부모클래스의 메소드와
자식클래스의 메소드의
어느 부분이 같고, 어느 부분이 다른 걸까요?
+접근제어자를 좁은 범위로 변경할 수 없습니다.
(접근제어자는 뒤에서 알아보죠.) -> 접근제어자
+조상클래스의 메소드보다 많은 수의 예외를 선언할 수 없다.
(예외도 뒤에서 알아볼 거예요.) -> 예외
class PointTest {
public static void main(String args[]) {
Point3D p3 = new Point3D(1,2,3);
}
}
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
String getLocation() {
return "x :" + x + ", y :"+ y;
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
@Override
String getLocation() { // 오버라이딩
return "x :" + x + ", y :"+ y + ", z :" + z;
}
}
부모클래스인 Point클래스와, 자식클래스인 Point3D클래스에서
String getLocation()
의 반환타입, 메소드명, 매개변수가 동일합니다.
그리고 구현부의 기능이 달라요. 바로 오버라이딩이죠
Point클래스의 String getLocation()
는 이차원의 좌표를 반환하는 반면에
Point3D클래스의 String getLocation()
는 삼차원의 좌표를 반환하도록 만들었어요.
저번 시간에 Object 클래스의 toString() 메소드가 있다고 했죠.
참조형 변수를 출력하면 변수에 저장된 주소가 출력되는데,
toString() 메소드를 통해 이루어지는 거예요.
System.out.print(p);
과 System.out.print(p.toString());
같다는 말이죠.
근데 저는 참조변수를 출력할 때,
이 참조변수의 주소가 아니라
이 참조변수가 가리키는 인스턴스 안의 데이터들을 조회하고 싶어요.
어떻게 해야 할까요?
Object 클래스는 모든 클래스의 조상이므로 toString() 메소드는
어떤 클래스에서든지 오버라이딩 할 수 있어요.
여기서 toString() 을 오버라이딩 할 때,
참조변수 안의 멤버들을 출력하도록 코드를 변경하면 어떻게 될까요?
System.out.print(p);
과 System.out.print(p.toString());
를 하면
주소가 아니라, 이 참조변수의 멤버들의 데이터가 조회되는 겁니다.
그럼 제가 원하는대로 되는 거죠.
이런 식으로 오버라이딩을 통해
조상클래스 메소드의 기능을
자손클래스에서 내가 원하는대로 변경할 수 있습니다.
오늘도 고생하셨어요 : )