IT 개발노트
오버라이딩 본문
1. 오버라이딩(overriding)
1.1 오버라이딩이란?
- 조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 오버라이딩이라고 한다.
1.2 오버라이딩의 조건
- 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)
- 접근제어자를 좁은 범위로 변경할 수 없다.
-> 조상의 메서드가 protected라면, 범위가 같거나 넓은 protected나 public으로만 변경할 수 있다.
- 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
class Parent {
void parentMethod() throws IOException, SQLException {
// ...
}
}
class Child extends Parent {
void parentMethod() throws IOException { // 정상작동
// ...
}
}
class Child extends Parent {
void parentMethod() throws Exception { // 에러발생!!!조상의 예외보다 더 많은 예외를 포함하기 때문.
// ...
}
}
1.3 오버로딩 vs 오버라이딩
오버로딩(over loading) : 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
void parentMethod() {}
}
class Child extends parent {
void parentMethod() {} // 오버라이딩
void parentMethod(int i) {} // 오버로딩
void childMethod() {}
void childMethod(int i) {} // 오버로딩
void childMethod() {} // 에러!!! 중복정의
}
1.4 super - 참조변수
- this : 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있음 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
- super : this와 같음. 조상의 멤버와 자신의 멤버를 구별하는데 사용
class Parent {
int x=10; // Parent 클래스의 멤버변수
}
class Child extends Parent {
int x=20; // Child 클래스의 멤버변수
void method() {
System.out.println("x=" + x); // 20
System.out.println("this.x=" + this.x); // 20
System.out.println("super.x=" + super.x); // 10
}
}
class Parent {
int x=10; // Parent 클래스의 멤버변수
}
class Child extends Parent {
void method() {
System.out.println("x=" + x); // 10
System.out.println("this.x=" + this.x); // 10
System.out.println("super.x=" + super.x); // 10
}
}
class Point {
int x;
int y;
String getLocation() {
return "x :" + x + ", y :" + y;
}
}
class Point3D extends Point {
int z;
String getLocation() { // 오버라이딩
// return "x :" + x ", y :" + y + ", z :" + z;
return super.getLocation() + ", z :" + z; // 조상의 메서드 호출
}
}
1.5 super() - 조상의 생성자
- 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
- 조상의 멤버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.
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) { // 에러발생!!! Point()클래스의 기본생성자를 찾을 수 없다는 에러발생
this.x = x;
this.y = y;
this.z = z;
}
String getLocation() { // 오버라이딩
return "x :" + x + ", y :" + y + ", z :" + z);
}
}
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) { // 정상작동
super(x,y);
this.z = z;
}
String getLocation() { // 오버라이딩
return "x :" + x + ", y :" + y + ", z :" + z);
}
}
class PointTest {
public static void main(String args[]) {
Point3D p3 = new Point3D(1,2,3);
}
}
class Point {
int x;
int y;
Point() {}
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;
}
String getLocation() { // 오버라이딩
return "x :" + x + ", y :" + y + ", z :" + z);
}
}
class PointTest {
public static void main(String args[]) {
Point3D p3 = new Point3D(1,2,3);
}
}