추상 클래스와 인터페이스 장단점 정리
추상 클래스의 장점
•
서로 관련이 깊은 클래스들 간에는 동일한 성격의 변수나 메서드들이 존재하게 되는데, 이를 추상 클래스에 정의해두고 상속받도록 구조를 변경하면 코드의 중복을 줄일 수 있다.
예시로, 강아지 클래스에 숨쉬기() 메서드, 고양이 클래스에 숨쉬기() 메서드를 각각 구현하기보다
포유류라는 클래스를 만들고 숨쉬기() 메서드를 구현한 뒤, 상속받도록 만들면 된다.
포유류라면 모두 같은 방법으로 숨을 쉬기 때문이다.
만약 먹기() 메서드를 만든다면, 표유류마다 먹을 수 있는 음식이 다르기 때문에
추상 메서드로 만든 뒤 상속받도록 하고 각 클래스에서 구현부를 작성하도록 할 수도 있다.
추상 클래스의 단점
•
다중 상속을 지원하지 않기 때문에 기능 구현을 강제하는데 한계가 있다.
인터페이스의 장점
•
서로 관계가 없는 클래스에게 공통 기능을 구현하도록 함으로서 관계를 맺어줄 수 있다.
•
인터페이스를 매개변수로 받아 인터페이스가 가진 메서드들로 코드를 작성하면, 인터페이스를 구현한 클래스들은 같은 동작을 하기 때문에 유연성 있는 코드가 된다.
예를 들어 한 데이터 베이스 회사가 제공하는 클래스를 사용해서 프로그램을 작성했다면
다른 종류 데이터베이스를 사용하기 위해서는 기존 데이터 베이스 관련 코드를 모두 수정해야한다.
하지만, 인터페이스를 정의하고 인터페이스에 정의된 기능들로 코드를 작성한 뒤 인터페이스를 구현한 클래스를 매개변수로 받아 사용하고 있었다면
매개변수로 넣어주는 구현 클래스만 변경하면 똑같은 동작을 기대할 수 있다.
인터페이스의 단점
•
꼭 필요하지 않은 메서드가 포함되어있어도 구현(implements) 하는 클래스들은 인터페이스가 가진 모든 메서드의 구현부를 완성해야한다.
그렇다면 언제 어떤 것을 사용하는 것이 좋을까?
추상 클래스는 그 추상 클래스를 상속받아서 추상 클래스 내에 구현된 기능을 재사용하고 확장시키는데 있다.
반면, 인터페이스는 추상 메서드를 구현하도록 강제하여 인터페이스를 구현한 클래스들에 대해서 같은 동작을 할 것이라는 보장을 할 수 있다.
즉, 내가 생각했을 때는 클래스들 간에 공통된 부분이 많아서 코드의 중복을 줄이고 싶다면 추상 클래스를 사용하고
클래스들 간에 동일한 결과를 반환하는 기능을 강제로 구현하게 하고 싶을때는 인터페이스를 사용하면 될 것 같다.
따라서 추상 클래스와 인터페이스를 같이 상속받는 경우는,
성격이 비슷한 클래스들 간 공통되는 부분이 있어 코드의 중복 제거와 메서드 재사용성을 향상시키기 위해 부모클래스를 정의한 뒤 상속받아 사용하는 것이고
이 클래스에게 특정 기능을 강제로 구현하도록 하여 다형성을 통한 코드 유연성을 확보하기 위함일 것이다.