Java 오버라이딩(overriding)

yesjuhee·2024년 10월 24일

Java 공부

목록 보기
9/17

남궁성님의 자바의 정석 3편 "Chapter 07 객체지향 프로그래밍 2"를 읽고 저의 방식대로 정리 한 글입니다.

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.

class Point {
	int x, y;
	
	String getLocation() {
		return "x: " + x + ", y: " + y;
	}
}
class Point3D extends Point {
	int z;
	
	String getLocation() {
		return "x: " + x + ", y: " + y + ", z:" + z;
	}
}
  • 오버라이딩 하는 메서드는 선언부가 서로 일치해야 한다. 즉 이름, 매개변수, 반환타입이 동일해야 한다.
  • 접근 제어자(access modifier)는 변경할 수 있으나 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외(exception)는 변경할 수 있으나 조상 클래스의 메서드보다 많이 선언할 수 없다.
  • 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.

오버로딩 vs 오버라이딩

오버로딩과 오버라이딩은 명백히 다른 개념이다. 오버라이딩은 상속 관계 사이에서, 상속 받은 메서드의 내용을 변경하는 것이다. 오버로딩은 “이름”만 공유하는 완전히 다른 새로운 메서드를 만드는 것이다.

super, super()

super 는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다. 멤버변수와 지역변수의 이름이 같을 때 멤버변수에 this를 붙여 사용한 것과 비슷하다. 모든 인스턴스메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 thissuper 값이 된다. static 메서드는 인스턴스와 관련이 없기 때문에 static 메서드에서는 thissuper 를 사용할 수 없다.

class Point {
	int x, y;
	
	String getLocation() {
		return "x: " + x + ", y: " + y;
	}
}
class Point3D extends Point {
	int z;
	
	String getLocation() {
		return super.getLocation() + ", z: " + z;
	}
}

super() 는 조상클래스의 생성자를 호출하는데 사용된다. Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자 this() 또는 super() 를 호출해야 한다. 그렇지 않으면 컴파일러가 자동으로 super(); 를 생성자의 첫 줄에 추가한다.

class Point {
	int x = 10;
	int y = 20;
	
	Point(int x, int y) {
		// super(); 자동 삽입
		this.x = x;
		this.y = y;
	}
}
class Point3D extends Point {
	int z = 30;
	
	Point3D() {
		this(100, 200, 300);
	}
	Point3D(int x, int y, int z) {
		super(x, y);
		this.z = z;
	}
}

아래 코드는 에러가 발생하는 케이스이다. Point3D의 생성자의 첫 줄에 super(); 가 자동 추가되는데, 부모 클래스인 Point는 기본 생성자가 정의되어있지 않기 때문이다.

class Point {
	int x = 10;
	int y = 20;
	
	Point(int x, int y) {
		// super(); 자동 삽입
		this.x = x;
		this.y = y;
	}
}
class Point3D extends Point {
	int z = 30;
	
	Point3D(int x, int y, int z) {
		this.x = x;
		this.y = y;
		this.z = z;
	}
}
profile
https://yesjuhee.tistory.com/

0개의 댓글