상속은 이미 존재하는 클래스를 바탕으로, 변수나 메서드를 물려받아 사용하는 개념입니다.
즉, 부모(상위) 클래스가 가진 기능을 자식(하위) 클래스가 이어받아서 재사용하거나 확장할 수 있습니다.
자바에서 클래스를 상속할 때는 extends 키워드를 사용합니다
(예시 코드)
// 부모 클래스
class Animal {
String name;
void eat() {
System.out.println("먹고 있습니다");
}
}
// 자식 클래스
class Dog extends Animal {
void bark() {
System.out.println("멍멍");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog(); // Dog는 Animal을 상속받았으므로
dog.name = "마루"; // Animal 클래스의 name 필드 사용 가능
dog.eat(); // Animal 클래스의 eat 메서드 사용 가능
dog.bark(); // Dog 클래스에서 새로 정의한 bark 메서드
}
}
자식 클래스는 부모 클래스의 모든 멤버를 갖지만 접근 제어자(public, protected, private 등)에 따라 실제 사용 가능 여부가 달라집니다
// Parent.java
class Parent {
public String publicField = "누구나 접근 가능";
protected String protectedField = "자식 클래스에서 접근 가능";
private String privateField = "해당 클래스에서만 접근 가능";
public void publicMethod() {
System.out.println("public 메서드");
}
protected void protectedMethod() {
System.out.println("protected 메서드");
}
private void privateMethod() {
System.out.println("private 메서드");
}
}
// Child.java
class Child extends Parent {
void accessTest() {
System.out.println(publicField); // 가능
System.out.println(protectedField); // 가능
// System.out.println(privateField); // 불가능 - 컴파일 에러
publicMethod(); // 가능
protectedMethod(); // 가능
// privateMethod(); // 불가능 - 컴파일 에러
}
}
상속을 받았을 때, 부모 클래스의 메서드를 그대로 사용할 수도 있지만, 자식 클래스에서 재정의(오버라이딩) 할 수도 있습니다.
재정의란 부모의 메서드를 자식이 덮어써서 새롭게 만드는 것을 말합니다
class Animal {
void eat() {
System.out.println("동물이 먹고 있습니다");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("강아지가 사료를 먹고 있습니다");
}
}
오버라이딩된 메서드 안에서 부모 메서드를 호출하고 싶다면 super 키워드를 사용할 수 있습니다
class Animal {
void eat() {
System.out.println("동물이 먹고 있습니다");
}
}
class Dog extends Animal {
@Override
void eat() {
super.eat(); // 부모의 eat() 호출
System.out.println("강아지가 사료를 먹고 있습니다");
}
}
자바는 단일 상속만을 지원합니다
즉, 한 클래스가 오직 하나의 부모 클래스만을 상속받을 수 있습니다
여러 부모 클래스를 동시에 상속받으면 같은 메서드 이름이 여러 곳에서 정의되어 충돌이 발생할 수 있기 때문입니다
이 문제를 피하기 위해 인터페이스를 사용해 다중 구현을 지원하는 방식으로 자바는 구조화되어 있습니다
댓글 영역