본문 바로가기

JAVA/자바의정석

자바(JAVA) : 객체지향 프로그래밍 II (2) - 오버라이딩

728x90
반응형

오버라이딩(overriding)

 

[1] 오버라이딩 이란?

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

상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야하는 경우가 많아, 이럴때 조상의 메서드를 오버라이딩 한다.

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;
	}
}

[2] 오버라이딩의 조건

오버라이딩은 매서드 내용만을 새로 작성하는 것이므로 메서드의 선언부는 조상의 것과 완전히 일치해야 한다.

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
이름이 같아야 한다
매개변수가 같아야 한다
반환타입이 같아야 한다

즉, 선언부가 서로 일치해야 한다.

접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다.

 

1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.

접근 제어자의 접근범위를 넓은 것에서 좁은 것 순으로 나열하면 public, protected, (default), private 이다.

 

2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

 

3. 인스턴스메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.

 

[3] 오버로딩 vs 오버라이딩

오버로딩은 기존에 없는 새로운 매서드를 생성(정의)하는것.

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

 

[4] super

super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다.

멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이

상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 붙여서 구별할 수 있다.

조상 클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있다.

조상 클래스의 멤버와 자손클래스의 멤버가 중복 정의되어 서로 구별해야하는 경우에만 super를 사용한는 것이 좋다.

 

조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고 suepr와 this는 근본적으로 같다.

 

static메서드(클래스메서드)는 인스턴스와 관련이 없다. 그래서 this와 마찬가지로 super역시 static 메서드에서는 사용할 수 없고 인스턴스메서드에서만 사용할 수 있다.

public class Page330 {
	public static void main(String[] args) {
		Child child = new Child();
		child.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 = 10
this.x = 10
super.x = 10

x, this.x, super.x 모두 같은 변수를 의미하므로 모두 같은 값이 출력되었다.

 

<다른예제>Child 클래스에 인수를 다르게 정해줬을 때

public class Page330 {
	public static void main(String[] args) {
		Child child = new Child();
		child.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);
	}
}

super.x 는 조상 클래스로부터 상속받은 멤버변수 x를 뜻하며, this.x 는 자손 클래스에 선언된 멤버변수를 뜻한다.

이처럼 조상 클래스에 선언된 멤버변수와 같은 이름의 멤버변수를 자손 클래스에서 중복해서 정의하는 것이 가능하며 참조변수 super를 이용해서 서로 구별할 수 있다.

 

변수만이 아니라 메서드 역시 super를 써서 호출할 수있다. 특히 조상클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에 super를 사용한다.

 

[5] super( ) - 조상 클래스의 생성자

this()와 마찬가지로 super() 역시 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는데 사용되지만, super()는 조상 클래스의 생성자를 호출하는데 사용된다.

 

 

728x90
반응형