/* 기본 형식 */
public class 자식클래스 extends 부모 클래스 {
...
}
자식 클래스는 부모 클래스로부터 필드와 메서드를 물려받는다.
/* Example - Parent.java */
public class Parent {
int fieldA;
int fieldB;
public void method() {
...
}
}
/* Example - Child.java */
public class Child extends Parent {
// 자식 필드 선언
public int childField;
// 생성자 : 부모 클래스에서 필드 상속 받기
public Child(int fieldA, int fieldB) {
this.fieldA = fieldA;
this.fieldB = fieldB;
}
// 자식 메서드 선언 (Setter)
public void setChildField(int childField) {
this.childField = childField;
}
}
/* Example - Run.java */
public class Run {
public static void main(String[] args) {
// 자식 객체 생성
Child child = new Child(10, 20);
// 부모로부터 받은 필드 사용
System.out.println(child.fieldA); // 10
// 자식 필드 사용
child.setChildField(30);
}
}
자식 클래스를 생성하면 부모 클래스가 먼저 생성된 후 자식 클래스가 생성된다.
컴파일 과정에서 super(); 라는 코드가 자동으로 추가되고 이 코드가 부모 클래스의 기본 생성자를 호출한다.
public class 자식클래스 extends 부모 클래스 {
super();
...
}
super(); 코드는 생략 가능하지만,
만약 부모 클래스에 매개변수를 갖는 생성자가 있는 경우에는 별도로 호출이 필요하다.
/* Example - Parent.java */
public class Parent {
int fieldA;
// 부모 기본 생성자가 매개변수를 가짐
public Parent(int fieldA) {
this.fieldA = fieldA;
}
}
/* Example - Child.java */
public class Child extends Parent {
// 자식 기본 생성자에서 별도로 부모 클래스 호출 필요
public Child(int fieldA) {
super(fieldA);
...
}
}
부모 클래스에서 받은 메서드 중, 자식 클래스에서 그대로 사용하기 부적합해서 메서드를 변경해야 하는 경우가 있다.
이때 메서드 오버라이딩으로 해당 메서드를 자식 클래스에서 재정의하면 부모로부터 받은 메서드는 숨겨지고, 재정의된 메서드가 우선적으로 사용횐다.
메서드 오버라이딩 주의사항
1. 부모 메서드와 리턴타입, 메서드 이름, 매개변수가 동일해야 한다.
2. 접근 제한을 더 강화할 수 없다.
3. 새로운 예외를 throws 할 수 없다.
public class Dollar() {
public String strPrice(double price) {
return String.valueOf(price) + "$";
}
}
public class Euro() extends Dollar {
// 메서드 재정의
public String strPrice(double price) {
return String.valueOf(price / 0.9) + "€";
}
}
final 필드를 선언하여 필드의 변경을 방지했던 것처럼, 클래스와 메서드에 final 을 붙여 상속을 제한할 수 있다.
final 클래스 는 더이상 상속할 수 없다.
public final class ClassName { ... }
final 메서드 는 오버라이딩이 불가능하다.
public final int method() { ... }
protected 클래스는 같은 패키지에서는 누구나 접근이 가능하고, 다른 패키지에서는 자식 클래스만 접근할 수 있다.