남궁성님의 자바의 정석 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;
}
}
오버로딩과 오버라이딩은 명백히 다른 개념이다. 오버라이딩은 상속 관계 사이에서, 상속 받은 메서드의 내용을 변경하는 것이다. 오버로딩은 “이름”만 공유하는 완전히 다른 새로운 메서드를 만드는 것이다.
super 는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다. 멤버변수와 지역변수의 이름이 같을 때 멤버변수에 this를 붙여 사용한 것과 비슷하다. 모든 인스턴스메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this 와 super 값이 된다. static 메서드는 인스턴스와 관련이 없기 때문에 static 메서드에서는 this 와 super 를 사용할 수 없다.
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;
}
}