상속(Inheritance)은 객체 지향 프로그래밍에서, 부모 클래스가 자식 클래스에 속성(Properties)과 메서드(methods)를 가져다 사용할 수 있게 넘겨주는 행위이다.
ex). "개는 동물이다(Dog is an Animal)"를 예로 들면,
- Animal: 동물은 각자의 울음소리를 가지고 있다.
- Dog: 강아지는 “멍멍” 울음소리를 가지고 있다.
// 부모 클래스
public class Animal {
private final String sound = "으르렁";
public void animalSound() {
System.out.println("울음소리: " + this.sound);
}
}
// 자식 클래스 - 아무 것도 선언하지 않았다.
public class Dog extends Animal {
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.animalSound(); // "으르렁"이 출력된다.
}
}
final 키워드가 붙은 클래스는 상속이 불가능하다. 예를 들어, Java에서 참조 클래스 String은 상속이 불가능하다.
메서드 오버라이딩(Method Overriding)은 자식 클래스에서 부모 클래스로부터 물려받은 메서드를 재정의하는 것을 의미한다.
재정의되는 메서드는 부모 클래스에서 정의된 메서드와 동일한 메서드 시그니처(메서드 이름, 매개변수 타입 및 개수)를 가져야 한다.
반환 타입과 접근 제어자도 같거나, 자식 클래스에서 더 접근성이 높은 방향으로 변경할 수 있다.(private → public ..)
// 부모 클래스
public class Calculator {
// Methods
public double areaCircle(double r) {
System.out.println("Calculator 객체의 areaCircle() 실행");
return 3.14159 * r * r;
}
}
// 자식 클래스
public class Computer extends Calculator {
@Override // Override 어노테이션으로 오버라이딩 명시
public double areaCircle(double r) {
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r; // 더 정확한 계산을 위해 오버라이딩
}
}
Java에서는 메서드 오버라이딩 시
@Override어노테이션(Annotation)을 사용하여 컴파일러에게 명시적으로 알릴 수 있다.