오버라이딩(overriding)

jungnoeun·2022년 5월 19일
0

java

목록 보기
9/22

오버라이딩이란?

오버라이딩

: 조상 클래스로부터 상속받은 메서드의 내용을 변경하는것

오버라이딩의 조건
자손클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와

  • 이름이 같아야 한다.
  • 메서드가 같아야 한다.
  • 반환타입이 같아야 한다.

조상클래스의 메서드를 자손클래스에서 오버라이딩할때

  • 접근제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상클래스의 메서드보다 많이 선언할 수 없다.
  • 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.





오버라이딩 vs 오버로딩

오버로딩
: 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩
: 상속받은 메서드의 내용을 변경하는 것(change, modify)

class Parent {
	void parentMethod() {}
}
class Child extends Parent {
	void parentMethod() {} //오버라이딩
    void parentMethod(int i) {} //오버로딩
}





super

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

this와 super
this
: 멤버변수와 지역변수의 이름이 같을때 this를 붙여서 구분한다.
super
: 상속받은 멤버와 자신의 멤버와 이름이 같을때 super를 붙여서 구분한다.

  • 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고 super와 this는 근본적으로 같다.
  • 모든 인스턴스메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이 된다.
  • static메서드(클래스메서드)는 인스턴스와 관련이 없으므로 this와 super는 static메서드에서는 사용불가하고 인스턴스메서드에서만 사용가능하다.
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);
    }
}

실행결과
x = 20
this.x=20
super.x=10





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

  • this와 마찬가지로 super는 생성자이다.
  • 자손 클래스의 인스턴스가 조상 클래스의 멤버들을 사용하기위해 조상 클래스의 초기화 작업이 수행되어야 한다.
  • 그래서 자손클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 한다.
  • 생성자의 첫 줄에서 조상 클래스의 생성자를 호출해야 한다.
    - 이유: 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수 있기 때문이다.

Object클래스를 제외한 모든 클래스의 생성자 첫줄에 생성자(this() 또는 super())를 호출해야 한다. 그렇지 않으면 컴파일러가 자동으로 super();를 생성자의 첫줄에 삽입한다.

인스턴스를 생성할때는 클래스를 선택하는 것만큼 생성자를 선택하는 것도 중요하다.
1. 클래스 - 어떤 클래스의 인스턴스를 선택할 것인가?
2. 생성자 - 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?

profile
개발자

0개의 댓글