Hyunebee
오버라이딩 본문
오버라이딩
조상클래스에서 상속받은 메소드를 재구성해서 사용하것을 오버라이딩이라고 한다.
class Car{
void Engine(){
System.out.println("자동차입니다.");
}
}
class superCar extends Car{
@Override
void Engine() {
System.out.println("슈퍼카입ㅂ니다.");
}
}
이처럼 상속받은 메소드를 변경해서 사용할 수 있다. 여기서 주의할점
- 메소드의 이름이 같아야 한다.
- 메소드의 매개변수가 같아야 한다.
- 메소드의 반환타입이 같아야 한다.
즉 선언부가 같아야 한다. 여기서 접근제어자와 exception은 변경할 수 있다.
-접근제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 있다.
-조상클래스의 exception보다 많은 exception을 선언할 수 없다.
-인스턴스메서드를 static메서드로 그 반대로 변경할 수 없다.
Super
멤버를 구별하기 위해 사용했던 this와 같은 역할로 활용된다. 부모 클래스를 나타낼 때 사용한다. 예제를 보면 알기 쉽다.
class SuperTest {
public static void main(String args[]) {
Child c = new Child();
c.method();
}
}
class Parent {
int x=10;
}
class Child extends Parent {
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x="+ super.x);
}
}
x는 Parent의 인스턴스변수인 x임으로 10이다.
this.x 도 현재 인스턴스 x으 가르킴으로 10이다.
super.x는 부모 클래스에 있는 x임으로 10이다.
class SuperTest2 {
public static void main(String args[]) {
Child c = new Child();
c.method();
}
}
class Parent {
int x=10;
}
class Child extends Parent {
int x=20;
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x="+ super.x);
}
}
위의 코드와 다른점을 찾아보자 Child클래스의 int x가 선언이 되었다.
x는 Child 클래스에 인스턴스 변수 x가 생겼음으로 20이다.
this.x 는 현재 인스턴스 x으 가르킴으로 20이다.
super.x는 부모 클래스에 있는 x임으로 10이다.
Super()
this()와 같이 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하지만 Super()는 부모 클래스의 생성자를 호출한다. 이는 자식 클래스가 생성될 경우 자식은 부모의 인스턴스도 생성하게 된다. 이때 자식은 부모의 인스턴스를 사용할 수 도 있기 때문에 먼저 생성자를 초기화 시켜주어야한다. 그렇기 때문에 최상위 Object 클래스를 제외한 클래스의 모든 생성자에는 this() 또는 Super를 호출해야한다. 하지만 우리가 입력하지 않아도 실행이 되는건 자바에서 자동으로 컴파일시 추가해 주기 때문이다.
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.x = x; // -> 삭제
this.y = y; // -> 삭제
this.z = z;
}
String getLocation() { // ¿À¹ö¶óÀ̵ù
return "x :" + x + ", y :"+ y + ", z :" + z;
}
}
위의 코드를 보면 Point3D에서 에러가 발생한다.
왜냐하면 Point에 생성자가 없기때문이다 아까 자바에서 자동으로 Super()를 추가해준다고 위에서 언급했다. 하지만 위의 Point의 생성자를 보면 x,y를 매개변수로 하고있는 생성자가 있기때문에 Point()에 대한 생성자가 없기 때문에 오류가 발생했다. 이때 오류를 지우기 위해서는 Point 클래스에 Point()생성자를 추가하거나 위의 주석을 지워주면 된다. 그러면 Super(x,y)가 Point()클래스의 Point(int x, int y) 생성자를 찾을 수 있기 때문이다. 그러고 Point3D의 생성자의 this.x와 this.y를 지워주면 더욱 깔끔한 코드가 된다.