2. 오버라이딩(Overriding)
2.1 오버라이딩(Overriding)이란?
조상 클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 오버라이딩이라고 한다.즉, 변수는 그냥 쓰되 상속된 메서드를 현재 쓰임에 맞게 조금씩 수정하여 사용.
2.2 오버라이딩의 조건
- 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)- 접근제어자를 좁은 범위로 변경할 수 없다.(조상의 메서드가 protected라면, 범위가 같거나 넓은 public으로만 변경할 수 있다.)
- 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
class A
{}
class B extends A
{ //오브젝트 클래스의 toString을 오버라이딩
public String toString()
{
return "오버라이딩";
}
}
class Test
{
public static void main(String[] args)
{
B b = new B();
System.out.println(b.toString());
System.out.println(b);
}
}
2.3 오버로딩 vs. 오버라이딩
오버로딩
- 기존에 없는 새로운 메서드를 정의하는 것.오버라이딩
- 상속받은 메서드의 내용을 변경하는 것.2.4 super - 참조변수
this
- 인스턴스 자신을 가리키는 참조변수.- 인스턴스의 주소가 저장되어 있음.
- 모든 인스턴스 메서드에 지역 변수로 숨겨진 채로 존재.
super
- this와 같음- 조상의 맴버와 자신의 맴버를 구별하는데 사용.
class Test
{
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()
{
int x = 30;
System.out.println("x = " + x); //지역변수 30
System.out.println("this.x = " + this.x); //인스턴스변수 20
System.out.println("super.x = " + super.x); //부모인스턴스변수 10
//변수에서는 오버라이딩 개념이 없고 모두 상속 받는다.
//따라서 변수명이 중복되면 구분이 필요하다.
}
}
2.5 super() - 조상생성자
- 자손 클래스의 인스턴스를 생성하면, 자손의 맴버와 조상의 맴버가 합쳐진 하나의 인스턴스가 생성된다.
- 조상의 맴버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.
주의 사항!!
- 가장 첫줄에 써야한다.(Object클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 super();를 생성자의 첫줄에 삽입한다.)
- 따라서!! this와 super는 같이 사용 불가능!!
- 사실 잘 안쓰임
class Test
{
public static void main(String[] args)
{
Point3D p3 = new Point3D(7,2,3);
System.out.println(p3.getLocation());
}
}
class Point
{
int x, 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;
}
}