Search

오버라이딩

오버라이딩 (Overriding)

조상 클래스로부터 상속받은 메소드의 내용을 변경하는 것
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; } }
Java

오버라이딩의 조건

자손 클래스에서 오버라이딩하는 메소드는 조상 클래스의 메소드와
이름이 같아야 한다.
매개변수가 같아야 한다.
반환타입이 같아야 한다. (JDK1.5부터는 자손 클래스의 타입으로 변경 가능해짐)
조상 클래스의 메소드를 자손 클래스에서 오버라이딩 할 때
접근 제어자는 조상 클래스의 메소드보다 좁은 범위로 변경 불가능
public > protected > (default) > private
조상 클래스의 메소드보다 많은 수의 예외 선언 불가능
Exception은 모든 예외의 최고 조상이므로 하나 선언한 것처럼 보여도 가장 많은 수의 예외 선언을 한 것
인스턴스 메소드를 static 메소드로, 그 반대로도 변경 불가능

오버로딩 vs 오버라이딩

오버로딩 : 기존에 없는 새로운 메소드를 정의하는 것
오버라이딩 : 상속받은 메소드의 내용을 변경하는 것
class Parent { void parentMethod() {} } class Child extends Parent { void parentMethod() {} // 오버라이딩 void parentMethod(int i) {} // 오버로딩 void childMethod() {} void childMethod(int i) {} // 오버로딩 void childMethod() {} // 에러. 중복 정의 }
Java

super

조상 클래스로부터 상속받은 멤버를 자손 클래스에서 참조하는데 사용되는 참조변수
멤버변수와 지역변수 이름이 같을 때 this를 사용했듯이, 조상 클래스 멤버와 자손 클래스 멤버가 중복 정의되어 서로 구별해야 하는 경우 super 사용
→ 근본적인 역할은 서로 같다!
클래스(static) 메소드인스턴스와 관련이 없기 때문에, thissuper 모두 사용 불가능
SuperTest.java
SuperTest2.java
메소드 역시 super를 통한 호출 가능
class Point { int x; int y; String getLocation() { return "x : "+ x + ", y :" + y; } } class Point3D extends Parent { int z; String getLocation() { // 오버라이딩 // return "x : "+ x + ", y :" + y + ", z :" + z; return super.getLocation() + ", z :" + z; // 조상 메소드 호출 } }
Java

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

super() : 조상 클래스의 생성자를 호출하는 데 사용
this() : 같은 클래스의 다른 생성자를 호출하는 데 사용
자손 클래스의 인스턴스를 생성했을 때, 조상 클래스의 멤버들을 사용하려면 조상 클래스 멤버들의 초기화 작업이 필요
→ 생성자 첫줄에서 조상 클래스 생성자의 호출 필요
Object 클래스를 제외한 모든 클래스의 생성자 첫 줄생성자, this() 또는 super()를 반드시 호출해야 함. → 안하면 컴파일러가 자동으로 super();를 생성자 첫줄에 삽입
인스턴스 생성 시, 어떤 클래스와 생성자 선택할 건지가 중요
클래스 : 어떤 클래스의 인스턴스를 생성할 것인가?
생성자 : 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?
조상 클래스의 멤버변수는 조상의 생성자에 의해 초기화되도록 해야 함.
PointTest.java
Point3DPoint3D(int x, int y, int z)Point(int x, int y)Object()
Point2Test.java

참고 자료