병훈's Blog

[Java] 오버라이딩 (Overriding) 본문

Java

[Java] 오버라이딩 (Overriding)

thdqudgns 2022. 9. 26. 00:45

지난 번에 오버로딩에 대해서 알아봤어요.

오버로딩 :
같은 메소드명, 다른 매개변수로 메소드를 만들어
하나의 메소드명에 다양한 매개변수가 들어와도
같은 기능을 할 수 있도록 만드는 것.

 


오버라이딩 (Overriding)

오버로딩과 오버라이딩의 이름이 비슷해서
헷갈려하는 분이 많더라구요. 저도 처음엔 그랬어요.

영어로 보면 구분이 쉽습니다.

 

  • 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() 메소드가 있다고 했죠.

 

System.out.print(p); 또는 System.out.print(p.toString());

참조형 변수를 출력하면 변수에 저장된 주소가 출력되는데
toString() 메소드를 통해 이루어지는 거예요.

 

근데 저는 참조변수를 출력할 때, 참조변수의 주소가 아니라
참조변수가 가리키는 인스턴스 안의

데이터들을 조회하고 싶어요.

 

어떻게 해야 할까요?

 

Object 클래스는 모든 클래스의 조상이므로 toString() 메소드는
어떤 클래스에서든지 오버라이딩 할 수 있어요.

 

여기서 toString() 을 오버라이딩 할 때,
참조변수 안의 멤버들의 데이터를 출력하도록

코드를 변경하면 어떻게 될까요?

 

System.out.print(p); 또는 System.out.print(p.toString()); 를 하면
주소가 아니라, 이 참조변수의 멤버들의 데이터가 조회됩니다.

그럼 제가 원하는대로 되는 거죠.

 

이런 식으로 오버라이딩을 통해
조상클래스 메소드를
자손클래스에서 내가 원하는대로 변경할 수 있습니다.

 


오늘도 고생하셨어요 : )

728x90
728x90

'Java' 카테고리의 다른 글

[Java] package와 import  (0) 2022.09.28
[Java] super  (0) 2022.09.27
[Java] 상속 (Inheritance)  (0) 2022.09.26
[Java] 초기화 (initialized)  (0) 2022.09.25
[Java] this  (0) 2022.09.25