접근제어자 class 클래스명 extends 부모클래스명 {
}
자식클래스(subclass): 상속을 받는 클래스
부모클래스(parent class, super class): 상속을 해주는 클래스
public class Animal {
private String name;
private int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Dog extends Animal {
private String breed;
public Dog(String name, int age, String breed) {
super(name, age);
this.breed = breed;
}
public String getBreed() {
return breed;
}
}
여기서 Animal이 부모, Dog가 자식 클래스이다.
자바에서는 상속을 통해 다형성을 구현할 수 있다. 다형성은 상위 클래스에서 정의된 메서드를 하위 클래스에서 오버라이딩하여 다양한 동작을 수행할 수 있도록 하는 개념이다.
⚠ 오버로딩 vs 오버라이딩
- 오버라이딩: 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용(시그니처까지 같아야 한다.)
- 오버로딩: 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르게 정의해서 사용 :(시그니처가 다르다.)
오버라이딩 예제
public class Animal {
// 생략
public void speak() {
System.out.println("Animal is speaking...");
}
}
public class Dog extends Animal {
// 생략
@Override
public void speak() {
System.out.println("Dog is barking...");
}
}
캐스팅이란 타입을 변환하는 것을 뜻합니다. 자바의 상속관계에 있는 부모와 자식 클래스 간에는 서로 간의 형변환이 가능합니다.
1. 업캐스팅: 자식클래스가 부모클래스로 형변환되는 것 (부모의 틀을 갖는 객체)
Animal animal = new Cat();
if (animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.meow();
}
부모 클래스가 자식 클래스의 인스턴스를 참조하면, 같은 부모 클래스 타입으로 여러 자식 클래스들을 다룰 수 있게 된다.
다중 상속의 지원 여부
자바는 단일 상속만을 지원하지만 파이썬은 다중 상속을 지원한다.
자바에서는 클래스의 다중 상속을 지원하지 않기 때문에 인터페이스를 이용하여 다중 상속을 구현할 수 있다.
생성자 호출 방식
자바의 경우 하위 클래스의 생성자에서 상위 클래스의 생성자를 호출 할 때 super()
메서드를 사용하여 수행하지만, 파이썬에서는 super() 대신에 __init__()
메서드를 사용한다.
메서드 오버라이딩
자바와 파이썬 모두 메서드 오버라이딩을 지원한다. 하지만 자바에서는 메서드를 오버라이딩할 때 @Override 어노테이션을 사용하여 오버라이딩임을 명시해야 한다. 반면, 파이썬에서는 메서드를 오버라이딩할 때 특별한 명시가 필요하지 않다.
추상 클래스와 인터페이스
자바에서는 추상 클래스와 인터페이스를 사용하여 추상화를 구현할 수 있다. 추상 클래스는 추상 메서드를 하나 이상 포함하는 클래스로, 인터페이스는 추상 메서드만을 포함하는 형태이다. 반면, 파이썬에서는 추상 클래스와 인터페이스가 없다. 즉, 클래스나 인터페이스에 추상 메서드가 존재하더라도, 해당 메서드를 강제로 구현하도록 하지 않는다.
from abc import ABC, abstractmethod
# 인터페이스 선언
class Shape(ABC):
@abstractmethod
def area(self):
pass
# Shape 인터페이스를 구현하는 클래스
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side ** 2
# Shape 인터페이스를 구현하는 클래스
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2