본문 바로가기

개발/java

[java] 오버라이딩 / 오버로딩 / super

반응형

자바의 정석

스터디 노트

오버라이딩

조상 클래스로 상속(extends)받은 메서드의 내용을 변경하는 것


오버라이딩 조건

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

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

1. 이름이 같아야 한다.

2. 매개변수가 같아야 한다.

3. 반환타입이 같아야 한다.

한마디로 선언부가 서로 일치해야 한다.


예외 

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

만일 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 자손 클래스의 메서드는 접근제어자가 protected 또는 public 이어야 한다. 대부분 같은 범위의 접근 제어자를 사용한다. 

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

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


오버라이딩 vs 오버로딩

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것 

오버라이딩 : 상속받은 메서드의 내용을 변경하는 것


class Parent{

void parentMethod(){}

}

class child extends Parent{

void parentMethod(){}     // 오버라이딩

void parentMethod(int i){} // 오버로딩

}


super 

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

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

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

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

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


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

static메서드는 인스턴스와 관련이 없다. 그래서 super는 static 메서드에서는 사용할 수 없고 인스턴스메서드에서만 사용할 수 있다.


메서드 또한 super를 사용할 수 있다. 특히 조상 클래스의 메서드를 자손 클래스에서 오버라이딩 한 경우에 super를 사용한다.


class point {

int x;

int y;

String getLocation(){

return "x :" + x + " y :" + y;

}

}


class pint3D extends point {

int z;

String getLocation(){//오버라이딩

//retrun  "x :" + x + " y :" + y + " z : " + z; 

return  super.getLocation() + " z : " + z;

}

}


조상클래스의 메서드에 내용을 추가하는 경우 super 를 사용해서 조상클래스의 메서드를 포함시키는 것이 좋다. 

후에 조상클래스의 메서드가 변경되더라도 변경된 내용이 자손클래스의 메서드에 자동적으로 반영될 것이기 때문이다.


super() 

this()와 마찬가지로 조상클래스의 생성자이다.

조상 클래스의 생성자를 호출하는데 사용된다.


자손 클래스의 인스턴스를 생성하면, 자손 + 조상 멤버가 합쳐진 하나의 인스턴스가 생성된다.

그래서 자손 클래스의 인스턴스가 조상 클래스의 멤버들을 사용할 수 있는 것이다.

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

자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수 도 있으므로 조상 멤버 가장 첫줄에 초기화 되어야 한다.

Object 클래스 생성자(Object())가 나올때 까지 거슬러 올라가면서 생성자 호출 반복된다.


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



반응형