자바의 추상 클래스와 인터페이스
신입 개발자의 면접에 대해 알아보다 기술면접에서
자바에는 추상 클래스 (abstract Class) 와 인터페이스(interface) 의 차이 및 존재 이유를 설명해주세요.
분명 두 개념은 알지만 차이점 이라고 하니 숨이 턱..
추상 클래스는 클래스 내 '추상 메소드' 가 하나 이상 존재하거나 abstract 로 정의된 경우 입니다.
예를 들어 이런식으로 코드를 짤 수 있습니다.
abstract class A () {
// 추상 메소드
public abstract int a();
// 일반 메소드
public int b() {
System.out.println("methodB");
}
}
인터페이스는 모든 메소드가 추상 메소드인 경우 입니다.
(물론 자바 8 이상에서는 default 키워드를 이용해 일반 메소드도 구현 가능합니다.)
인터페이스는 다음과 같이 작성한다.
public interface A() {
/*
*인터페이스의 추상 메소드는 항상 public 이어야 한다.
*접근자를 생략하면 default 접근자가 생기는것이 아니라 자동으로 public 이 됩니다.
*/
void a(int a, int b, int c); // (public) void a(int a, int b, int c);
public void b();
public void c();
}
두 개념을 비교해보면 명확한 차이가 있습니다.
모양새도 다르고 사용 방법도 다릅니다. 하지만 하는 일은 비슷하죠.
추상클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제한다.
그러면 여기서 드는 의문이 있습니다.
하는 일이 비슷하면 왜 종류가 존재하지?
추상클래스에 하나 또는 여러개의 추상메소드를 만들면 인터페이스는 추상클래스의 하위호환 아니야?
같은 의문입니다.
결론부터 말씀드리자면 인터페이스와 추상클래스는 존재의 목적이 다릅니다. 추상클래스는 그 추상클래스를 상속받아서 기능을 이용하고 확장 시키는데 있습니다. 반면에 인터페이스는 함수의 껍데기만 존재하는데 그 이유는 그 함수의 구현을 강제하기 위함입니다. 구현 함으로써 구현 객체의 동일한 동작을 보장할 수 있습니다.
뭔가 비슷하면서 다른 애매함이 있습니다.
자바는 다중상속을 허용하지 않습니다. 그 이유는 다중 상속의 모호함 때문입니다.
예를들어 다음과 같은 B , C 클래스는 상속받는 A 클래스가 있습니다.
public class A extend B , C {
@Override
public a() {
super.doSomething();
}
}
이처럼 doSomething() 메소드가 B , C 에 둘 다 존재한다면
두 클래스중 어디에 있는 doSomething() 메소드를 실행해야 할까요? 애매합니다.
이렇게 애매한것이 다중 상속의 모호함 입니다.
이런 다중 상속의 모호함 때문에 자바는 과감하게 다중 상을 못하도록 했습니다.
이와는 다르게 인터페이스는 다중 구현을 할 수 있습니다.
public class A implements B, C {
@Override
public doSomething() {
eatKimchi();
}
}
마치 여러개를 상속 받는 것처럼 보입니다. 그래서 추상클래스의 상속과 헷갈리죠.
이것만 보면 인터페이스는 다중 상속의 모호함을 해결하기 위해 만든것 아니야? 라고 오해 할 수 있습니다.
이 오해를 풀기 위해서는 상속과 인터페이스의 개념을 짚어봐야합니다.
상속은 조상클래스의 기능을 이용하거나 확장하기 위해서 사용되고, 다중 상속의 모호함 때문에 하나만 상속할 수 있습니다.
인터페이스는 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 보장받기 위함입니다.
추상 클래스와 인터페이스의 외형적인 차이 뿐만 아니라
의미의 차이도 알아두어야 합니다.