본문 바로가기

Java/Basic

[Java] 오버라이딩(overriding)

- 'override'의 사전적 의미는 '~위에 덮어쓰다(overwrite)'이다.

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

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


오버라이딩의 조건

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

 

- 선언부가 서로 일치해야 한다. 다만 접근 제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.

 

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

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

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

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


오버로딩 VS 오버라이딩

오버로딩은 기존에 없는 새로운 메서드를 추가하는 것이고, 오버라이딩은 조상으로부터 상속받은 메서드의 내용을 변경하는 것이다.

 

 


super

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

- 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별하듯 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 붙여서 구별한다.

- 조상클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 super 대신 this를 사용할 수 있다. 그래도 조상 클래스의 멤버와 자손 클래스의 멤버가 중복 정의되어 서로 구별해야하는 경우메나 super를 사용하는 것이 좋다.

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

- 모든 인스턴스메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이 된다.

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

 

example

 

example


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

- this()와 마찬가지로 super() 역시 생성자이다.

- this()는 같은 클래스의 다른 생성자를 호출하는 데 사용되지만, super()는 조상 클래스의 생성자를 호출하는데 사요된다.

- 자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상이 멤버가 모두 합쳐진 하나의 인스턴스가 생성된다. 자손 클래스의 인스턴스가 조상 클래스의 멤버들을 사용할 수 있는 것이다.

- 조상 클래스 멤버의 초기화 작업이 수행되어야 하기 때문에 자손 클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 한다.

- 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야하는 이유는 자손 크랠스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 하기 때문이다.

- 조상 클래스 생성자의 호출은 클래스의 상속관계를 거슬러 올라가면서 계속 반복된다. 모든 클래스의 최고 조상인 Object 클래스의 생성자인 Object()까지 가서야 끝이 난다. 그래서 Object 클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출해야 한다. 그렇지 않으면 컴파일러는 생성자의 첫 줄에 'sujper();'를 자동적으로 추가할 것이다.