8. 오버라이딩
7. 특성의 중복 - 두 번째에 이어서 진행
Object 클래스 내 toString() 구현 코드
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}Object 클래스의 toString()의 메서드에는 위와 같은 Doc이 작성되어 있음
Doc - 메서드 등 코드에 대한 설명, 메타 정보
In general, the toString method returns a string that “textually represents” this object.
The result should be a concise but informative representation that is easy for a person to read.
It is recommended that all subclasses override this method.
→ (마지막 줄) 모든 하위 클래스들은 이 메서드를 오버라이드(Override)하는 것이 권장됨
오버라이딩 한줄 요약
자식(Sub class) 이기는 부모(Super class) 없다2. Overriding
상위 클래스로부터 특성을 물려받은(상속받은) 메서드의 구현부 코드를 변경하여 새롭게 재정의하는 것을 오버라이딩(Overriding)이라고 함
→ 상위 클래스로부터 상속받은 메서드를 그대로 사용하는 경우도 있지만, 하위 클래스의 특성에 맞게 변경해야 하는 경우가 있을 수도 있기 때문
public class Main {
public static void main(String[] args) {
Mouse jerry = new Mouse();
jerry.sing(); // 동물이 울음소리를 낸다
}
}class Animal {
void sing() {
System.out.println("동물이 울음소리를 낸다");
}
}class Mouse extends Animal {
}쥐는 자신만의 울음소리를 낼 수 있기 때문에 상위 클래스로부터 내려받은 메서드를 재정의(Override)
Mouse 클래스
class Mouse extends Animal {
// 상속을 통해 Animal 클래스에서 내려받은 sing()를 자신만의 방식으로 새롭게 재정의
@Override // 해당 메서드는 상위 클래스로부터 재정의한 메서드임을 명시
void sing() {
System.out.println("찍찍");
}
}Main 클래스 재실행
public class Main {
public static void main(String[] args) {
Mouse jerry = new Mouse();
jerry.sing(); // 찍찍
}
}2. 오버라이딩을 활용한 특성의 중복 제거
이러한 개념을 적용할 경우 [7. 특성의 중복 - 두번째]에서 발생했던 중복을 제거할 수 있음
모든 클래스들에 상속되는 Object 클래스가 제공하는 toString() 역시 상위 클래스로부터 물려받은 메서드라고 볼 수 있기 때문에 하위 클래스에서 재정의(Override)할 수 있음
Mouse 클래스
class Mouse {
int age;
String name;
Mouse(age, name) {
this.age = age;
this.name = name;
}
// void printMouse() {
// System.out.printf("Mouse - age: %d살, name: %s \n");
// }
@Override
public String toString() {
return String.format("Mouse - age: %d살, name: %s \n");
}
}Cat 클래스
class Cat {
int age;
String name;
String address;
// void 고양이_조회() {
// System.out.printf("Cat- age: %d살, name: %s, address: %s");
// }
@Override
public String toString() {
return String.format("Cat - age: %d살, name: %s \n");
}
}또한 이러한 toString() 클래스는 위 코드처럼 개발자가 직접 작성하지 않고 편집기가 제공하는 자동완성 기능을 통해 각 클래스가 가진 필드를 토대로 자동으로 포매팅된 형태로 코드를 완성된 형태로 제공하기 때문에 편하게 사용할 수 있음(개발 생산성 증가)
편집기를 통해 자동 생성된 toString() 코드
@Override
public String toString() {
return "Mouse [age=" + age + ", name=" + name + ", address=" + address + "]";
}결과적으로 [7. 특성의 중복 - 두번째] 에서 발생한 단점이 대부분 해결됨
대부분이라고 표현한 것은 아래와 같이 필드 값이 변경, 추가되었을 경우에는 toString()을 다시 작성하여야 한다는 것
3. 상속과 오버라이딩 요약
결과적으로 어떤 클래스에서 toString()을 작성하여 인스턴스가 가진 정보(필드값)를 간단하게 조회할 수 있었던 것은
Object 클래스로부터 전달받은 특성(toString())을 하위 클래스에서 오버라이딩하였기 때문