클래스가 가지고 있는 내용(메서드, 변수 등)들을 중복되어 갖고 있는 클래스들 간의 유지/보수성을 위해 하나의 클래스(부모 클래스)에 정의한 후, 상속받아 사용한다.
자식클래스가 부모클래스를 상속받을 때, 클래스 선언문 뒤에
extend <부모클래스>를 붙인다.상속의 조건
- 공통 멤버를 가지고 있는 클래스들간의 공통점이 있는가?
- is a 관계가 성립되는가?
public class Student{
private String name;
private int age;
private int studentNum;
}
public class Employee{
private String name;
private int age;
private int employeeNum;
}
public class Professor{
private String name;
private int age;
private int professorNum;
}
중복되는 내용이 있는 클래스를 부모클래스를 만들어 상속시킨다.
public class Person{
private String name;
private int age;
}
public class Studen extends Person{
private int studentNum;
}
public class Employee extends Person{
private int employeeNum;
}
public class Professor extends Person{
private int professorNum;
}
메서드 오버라이딩
상속받은 메서드를 재정의하는것이 메서드 오버라이딩이다.
부모클래스로부터 자식클래스로 상속할 때, 메서드 오버라이딩이 일어난다.
이 때,
- 상속받은 메서드 바디만 변경할 수 있고,
- 상속받은 메서드 선언부는 변경이 불가능하고,
- 상속받은 메서드의 접근제어자는 동일범위 혹은 더 큰 범위만 가능하다.
public class Person{
private String name;
private int age;
public String toString() {
return "name"+name+": age"+"age";
}
}
public class Studen extends Person{
private int studentNum;
public String toString() {
return "name"+name+" : age"+age+" : Student Number"+studentNum;
}
}
super는 상속하는 부모 객체를 나타낸다.
public class Person{
private String name;
private int age;
public String toString() {
return "name"+name+": age"+"age";
}
}
public class Studen extends Person{
private int studentNum;
public String toString() {
return super.toString()+" : Student Number"+studentNum;
}
}
부모객체를 활용한 생성자 오버로딩
public Student(String name, int age, int studentNum) {
super.setName(name);
super.setAge(age);
this.studentNum=studentNum;
}
public Person(String name, int age){
this.name=name;
this.age=age;
}
public Student(String name, int age, int studentNum) {
super.(name, age);
this.studentNum=studentNum;
}
생성자 오버로딩이 일어날 때 부모객체에서 생성자에 대한 언급이 없으면, 자바는 컴파일 과정에서 super()를 자동으로 생성하기 때문에 오류가 난다.
public class Person{
private String name;
private int age;
// public Person() {
//
// }
public String toString() {
return "name"+name+": age"+"age";
}
}
public Student(String name, int age, int studentNum) {
super(); // 자동으로 생성되기 때문에 오류발생
this.studentNum=studentNum;
}