자바 프로그래밍에서 상속과 인터페이스는 객체지향 프로그래밍의 핵심 개념 중 하나이다. 이 두 가지 개념은 코드의 재사용성을 높이고, 유연하고 확장 가능한 소프트웨어를 작성하는 데 중요한 역할을 한다. 이 글에서는 인터페이스와 상속의 차이에 대해 정리해 보고자 한다.
상속은 객체지향 프로그래밍에서 기존 클래스의 속성과 메서드를 새로운 클래스에게 물려주는 것을 의미한다. 상속을 통해 자식 클래스는 부모 클래스의 모든 멤버 변수와 메서드를 사용할 수 있으며, 필요에 따라 추가적인 멤버를 정의하거나 기존 메서드를 오버라이딩 할 수 있다.
// 부모 클래스
class Animal {
String name;
public void eat() {
System.out.println("This animal eats food.");
}
public void sleep() {
System.out.println("This animal sleeps.");
}
}
// 자식 클래스
class Dog extends Animal {
// 자식 클래스에서 추가한 메서드
public void bark() {
System.out.println("The dog barks.");
}
// 부모 클래스의 메서드를 재정의
@Override
public void eat() {
System.out.println("The dog eats dog food.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "Buddy";
dog.eat(); // The dog eats dog food.
dog.sleep(); // This animal sleeps.
dog.bark(); // The dog barks.
}
}
인터페이스는 클래스가 구현해야 하는 메서드의 집합을 정의하는데 사용된다. 인터페이스는 실제 구현은 제공하지 않으며, 메서드의 시그니처(이름, 반환 타입, 매개변수 목록)만을 정의한다. 클래스는 인터페이스를 구현함으로써 해당 인터페이스에 정의된 모든 메서드를 반드시 구현해야 한다.
// 인터페이스
interface Animal {
void eat();
void sleep();
}
// 인터페이스를 구현한 클래스
class Dog implements Animal {
@Override
public void eat() {
System.out.println("The dog eats dog food.");
}
@Override
public void sleep() {
System.out.println("The dog sleeps.");
}
// 추가 메서드
public void bark() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // The dog eats dog food.
dog.sleep(); // The dog sleeps.
dog.bark(); // The dog barks.
}
}
※ 참고 - 인터페이스와 추상 클래스의 차이
인터페이스
- 인터페이스는 클래스가 반드시 구현해야 하는 메서드의 집합을 정의하며, 이를 통해 다중 구현을 지원하여 하나의 클래스가 여러 인터페이스를 구현할 수 있게 한다.
- 인터페이스 내의 멤버 변수는 기본적으로 public static final로 선언된 상수이며, 생성자를 가질 수 없다.
추상 클래스
- 추상 클래스는 일부 메서드를 구현할 수 있는 기본 클래스로, 인스턴스 변수를 가질 수 있으며 다양한 접근 제어자를 사용할 수 있다.
- 추상 클래스는 단일 상속만 지원하며, 하나의 추상 클래스만 상속받을 수 있다. 또한, 추상 클래스는 생성자를 가질 수 있어 자식 클래스에서 이를 호출할 수 있다.
자바에서 상속과 인터페이스는 각각 다른 목적과 용도로 사용된다. 상속은 코드 재사용성과 확장성을 높이기 위해 사용되며, 인터페이스는 클래스 간의 일관성을 유지하고 특정 기능을 강제하기 위해 사용된다. 이 두 가지 개념을 적절히 활용하면 더욱 유연하고 유지보수하기 쉬운 소프트웨어를 작성할 수 있다.