Skip to Content
Suffering builds character

8. 오버라이딩

7. 특성의 중복 - 두 번째에 이어서 진행

Object 클래스 내 toString() 구현 코드

Object.java
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }

Object 클래스의 toString()의 메서드에는 위와 같은 Doc이 작성되어 있음

💡
Tip

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)이라고 함

→ 상위 클래스로부터 상속받은 메서드를 그대로 사용하는 경우도 있지만, 하위 클래스의 특성에 맞게 변경해야 하는 경우가 있을 수도 있기 때문

Main.java
public class Main { public static void main(String[] args) { Mouse jerry = new Mouse(); jerry.sing(); // 동물이 울음소리를 낸다 } }
Animal.java
class Animal { void sing() { System.out.println("동물이 울음소리를 낸다"); } }
Mouse.java
class Mouse extends Animal { }

쥐는 자신만의 울음소리를 낼 수 있기 때문에 상위 클래스로부터 내려받은 메서드를 재정의(Override)

Mouse 클래스

Mouse.java
class Mouse extends Animal { // 상속을 통해 Animal 클래스에서 내려받은 sing()를 자신만의 방식으로 새롭게 재정의 @Override // 해당 메서드는 상위 클래스로부터 재정의한 메서드임을 명시 void sing() { System.out.println("찍찍"); } }

Main 클래스 재실행

Main.java
public class Main { public static void main(String[] args) { Mouse jerry = new Mouse(); jerry.sing(); // 찍찍 } }

2. 오버라이딩을 활용한 특성의 중복 제거

이러한 개념을 적용할 경우 [7. 특성의 중복 - 두번째]에서 발생했던 중복을 제거할 수 있음

모든 클래스들에 상속되는 Object 클래스가 제공하는 toString() 역시 상위 클래스로부터 물려받은 메서드라고 볼 수 있기 때문에 하위 클래스에서 재정의(Override)할 수 있음

Mouse 클래스

Mouse.java
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 클래스

Cat.java
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())을 하위 클래스에서 오버라이딩하였기 때문

Last updated on