[Java] Java의 정석 정리 (오버라이딩)

송병훈·2022년 9월 25일
0

자바의 정석

목록 보기
6/15
post-thumbnail

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

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


오버라이딩 (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() 메소드가 있다고 했죠.
참조형 변수를 출력하면 변수에 저장된 주소가 출력되는데,
toString() 메소드를 통해 이루어지는 거예요.
System.out.print(p);System.out.print(p.toString()); 같다는 말이죠.

근데 저는 참조변수를 출력할 때,
이 참조변수의 주소가 아니라
이 참조변수가 가리키는 인스턴스 안의 데이터들을 조회하고 싶어요.

어떻게 해야 할까요?

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

여기서 toString() 을 오버라이딩 할 때,
참조변수 안의 멤버들을 출력하도록 코드를 변경하면 어떻게 될까요?

System.out.print(p);System.out.print(p.toString()); 를 하면
주소가 아니라, 이 참조변수의 멤버들의 데이터가 조회되는 겁니다.
그럼 제가 원하는대로 되는 거죠.

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


오늘도 고생하셨어요 : )

profile
성실하고 꼼꼼하게

0개의 댓글