1. 문법적 차이
추상화는 변수와 다양한 접근제한자 사용이 가능하다.
둘 다 인스턴스는 생성할 수 없다.
문법적으로는 바뀌어야 하는 값을 가지거나, 접근제한자를 통해 보안성을 높이고 싶을 때 추상화클래스를 사용할 수 있다.
2. 개념적 차이
관련 포스팅 클래스 vs 인터페이스
클래스는 is kind of의 분류의 개념이고 인터페이스는 is able to의 기능추가의 개념이다.
추상화 클래스는 풍부한 개념과 약간의 기능의 추상화를 통해 상속에 우선순위를 둔다.
인터페이스는 기능의 추상화를 통해 다형성에 우선순위를 둔다.
예를들어 동물병원에서 동물과 같이 개념적으로 재사용할 부분은 많지만 실제 객체로 생성되기엔 너무 추상적인 개념일 때 추상화 클래스를 사용할 수 있다. 동물병원에서 취해야할 서비스를 인터페이스를 사용하면 다형성을 통해 어떤 병원을 가든 동일한 서비스를 보장 받을 수 있다.
3. 실제 프로젝트에서는 왜 추상화 클래스보다는 인터페이스를 많이 쓰는가 ?
상속과 다형성의 우선순위 차이가 존재하기 때문에 주체가 누가 되느냐가 중요한 것 같다.
스프링 프레임워크를 사용하면 제어의 역전을 통해 내가 설계한 클래스를 스프링이 객체관리와 의존관계 주입을 해준다. 스프링이 객체 관리와 의존관계 주입을 해줄 것을 알고 개발자가 코드를 작성할 때에는 어떤 클래스가 풍부한 내용을 갖고 있어 이용한다기보다 의존관계 주입을 통해 내가 사용하는 클래스의 기능이 어떻게 동작하는지는 몰라도 객체끼리의 대화가 가능하도록 하는 다형성이 우선시되어 인터페이스를 많이 쓰는 것 같다.
+ 스프링 컨테이너에서 객체를 빈으로 관리할 때는 싱글톤으로 관리하기에 상태관리는 인프라스트럭쳐 계층을 통해 외부의 DB나 저장소에 의존해야한다. 변수를 가질 수 있는 추상화 클래스를 안쓰게된 이유중에 하나가 아닐까 싶다.