Q.
각각 무엇인지?
언제 추상클래스를 사용하고 언제 인터페이스를 사용하지?
공통점과 차이점은 뭐가 있지?
abstract class AbstractClazz {
...
public abstract void absMtd();
}
public static final
. 메서드는 public abstract
이어야 한다. interface 인터페이스_이름 {
public static final 타입 상수_이름 = 값;
public abstract 메서드_이름(매개변수목록);
}
Q> 추상클래스가 인터페이스의 역할을 다 할 수 있는데 왜 각각을 나누었는가?
A> 사용용도가 다르기 때문.
추상 메서드를 하나 이상 가진 것이 추상 클래스이다. 추상 클래스를 상속함으로써 그 클래스가 가지는 메서드들을 상속받은 하위 클래스에서 오버라이딩하게 된다.
그래서 왜! 사용하는가?
코드의 중복을 줄이고 유지보수의 편의성을 위해.
스타크래프트의 유닛으로 예시로 들면,
설명하기에 앞서 추상 클래스는 생성자, 일반 메서드, 멤버 변수 등을 가질 수 있다.
그 말은 즉, 생성자나 오버라이딩을 활용한다면 공통분모에 대한 코드의 중복을 줄이고, 각 유닛에 알맞게 하위 클래스에서 재정의가 가능하다는 것이다.
예를 들면, A, B, C가 엮여 동작하는 클래스가 존재하는데 A개발자가 A와 B클래스를 만들고 C개발자가 C클래스를 만든다고 가정
그런데, A개발자가 만들고 있는 A클래스가 C개발자가 만들고 있는 C클래스가 완성이 되어야 개발이 가능한 경우가 있다. 이런 경우에 용이
A개발자는 C클래스를 가짜(임시) 클래스로 만들어서 C클래스가 필요한 자리에 채워넣은 뒤, C개발자가 C클래스를 완성한 후에 바꿔뀜으로써, 개발 일정에 차질이 없도록 하기 위함
즉, 이렇게 인터페이스를 사용함으로써 결합도를 낮게 만들어 협업과 유지보수에 용이하다.
또 다른 이유로는 상속의 이유이다.
추상 클래스는 단일 상속이기에 트리 형식으로 상위 클래스와 하위 클래스로 나뉘는 형태로 볼 수 있다.
즉, 하위 클래스는 상위 클래스에서 추상화시킨 생성자 혹은 메서드를 재정의하면서 하위 클래스로 내려갈수록 구체화된다.
반면, 인터페이스는 수직적 구조가 아닌 수평적 구조를 갖는 형태라고 볼 수 있다.
여기서 말하는 수평적 구조는 다중 상속이 가능하기 때문에 비슷한 기능을 가진 것들을 묶어 수평적 구조를 가진다는 걸 말한다.
공통점
- new를 통해 직접 객체를 생성할 수 없으며, 상속받은 자식만이 객체를 생성할 수 있다.
- 둘 다 하나의 클래스이며, 하위클래스에서 모든 메서드를 구현해야 한다.
- 추상 메서드(선언부만 존재하는 메서드)를 갖는다.
차이점
- 추상 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 상속이 가능하다.
- 인터페이스는 추상 메서드만 사용 가능한 반면, 추상 클래스는 일반 메서드와 추상 메서드 모두 사용 가능하다.
- 인터페이스는 생성자를 가질 수 없고, 상수만 가능한 반면, 추상 클래스는 생성자와 일반변수를 가질 수 있다.
- 추상 클래스는 상속받는 클래스가 일부만 구현(하위 클래스로 전가)할 수 있지만 인터페이스는 반드시 인터페이스에 있는 메서드를 모두 구현해야 한다.
[참고]
[JAVA] 추상클래스 VS 인터페이스 왜 사용할까? 차이점, 예제로 확인 :: 마이자몽
추상클래스와 인터페이스의 공통점과 차이점
자바[Java] 인터페이스[Interface] 사용과 이유