추상 클래스와 인터페이스의 차이점과 그 사용 목적을 정확히 하고자 이번 글을 포스팅하게 되었다.
부모 클래스를 상속 받는 자식 클래스가 반드시 오버라이딩 해야 하는 메서드를 부모 클래스에 정의할 수 있다. 이것을 추상 메서드라 하는데 이름 그대로 추상적인 개념을 제공하는 메서드이다. 실체가 존재하지 않고, 메서드 바디가 없다.
// 추상 메서드 예시
public abstract void testMethod();
class 앞에 'abstract' 키워드를 사용해 정의하며, 하나 이상의 추상 메서드를 가지는 클래스를 의미한다. 추상 메서드를 선언하여 상속을 통해 하위 클래스에서 반드시 구현하도록 제약을 가한다.
// 추상 클래스 예시
public abstract class AbstractClass { ... }
public abstract class AbstractAnimal {
public abstract void sound();
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Dog extends AbstractAnimal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
move() 메서드는 추상 메서드로 선언되지 않았으므로 자식 클래스에서 강제로 구현하지 않아도 상관없다.
interface 키워드를 사용하여 선언하는 인터페이스는 상수(static final)와 추상 메서드의 집합이다.
추상 클래스보다 추상화 정도가 높고, 추상 클래스와는 다르게 구현부가 있는 일반 메서드, 일반 멤버 변수를 가질 수 없다는 특징이 있다.
// 인터페이스 예시
public interface MyInterface {
int MAX_VALUE = 100;
String DEFAULT = "Hello";
void myMethod();
int calculate(int x, int y);
}
class MyClass implements MyInterface {
@Override
public void myMethod() {
System.out.println("myMethod 구현");
}
@Override
public int calculate(int x, int y) {
return x + y;
}
}
인터페이스: 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞기 기능을 구현(implements)
추상클래스: 자신의 기능들을 하위 클래스로 확장 시킴(extends)
< 추상클래스를 사용하는 경우 >
< 인터페이스를 사용하는 경우 >