상속
상속
기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.
코드를 공통적으로 관리할 수 있기에 코드의 추가 및 변경이 용이하다.
코드의 재사용성을 높이고 코드의 중복 제거를 하여 프로그램의 생산성과 유지보수에 크게 기여한다.
class Parent {}
class Child extends Parent { }
//Child클래스는 Parent클래스를 상속받앗다.
생성자와 초기화 블럭은 상속되지 않고 멤버만 상속된다.
자손 클래스의 멤버 개수는 조상클래스보다 항상 같거나 많다.
상속관계는 형제관계가 존재하지 않고 항상 부모와 자식의 관계만이 있다.
자바에서는 단일 상속만 가능하다.
오버라이딩
조상클래스로부터 상속받은 메서드의 오버라이딩이라고 한다.
상속받은 메서드를 그대로 사용할 수도 있지만 자식 클래스에 맞게 변경해야하는 경우 사용한다.
class User {
String name;
String info() {
return "name : " + name;
}
}
class SocialUser extends User {
String type;
String info() {
return "name : " + name + "type : " + type;
}
}
-오버라이딩 조건
- 조상클래스의 메서드와 이름이 같아야 한다.
- 조상클래스의 메서드와 매개변수가 같아야 한다.
- 조상클래스의 메서드와 반환타입이 같아야 한다.
- 접근 제어자는 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
- 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
class Parent {
void func() throws IOException, SQLException {}
}
class Child {
void func() throws Exception {}
/*
Exception의 경우 예외 갯수가 더 작아보이나 모든 예외의 최고 조상이므로
가장 많은 예외를 선언한 것이므로 잘못된 오버라이딩이다.
*/
super
자손클래스에서 조상클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수.
멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 통해 구별한다.
조상과 자손을 구별하는데 사용된다는 것을 제외하면 this와 super는 근본적으로 같다.
모든 인스턴스 메서드는 자신이 속한 인스턴스의 주소가 지역변수로 저장이 되어지는데 이 값이 참조변수인 this와 super의 값이 된다.
static 메서드는 인스턴스와 관련이 없다. 그래서 this와 마찬가지로 super역시 static 메서드에서는 사용할 수 없다.
super()
this()와 마찬가지로 super() 또한 생성자이다. super()는 조상 클래스의 생성자를 호출하는데 사용된다.
자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 모두 합쳐진 하나의 인스턴스가 생성된다. 이때 조상클래스의 멤버를 초기화 하여야 하기때문에 자식클래스의 생성자에서 조상클래스의 생성자가 호출되어야 한다.