추상 클래스와 인터페이스의 특징
추상 클래스(Abstract Class)
추상 클래스(Abstract Class)는 인터페이스와 유사합니다. 인터페이스와 마찬가지로 인스턴스화 할 수 없으며, 구현을 포함하거나 포함하지 않은 메서드 모두를 가질 수 있다.
하지만 인터페이스와 비교하여 추상클래스가 가질 수 있는 중요한 특징 중 하나는 필드를 가질 수 있따는 점이다. 그리고 해당 필드는 static 또는 final이 아닐 수 있으며, public이나 prorected 또는 private으로 선언할 수도 있습니다. 인터페이스를 사용하면 모든 필드가 public, static, final로 처리되면 모든 메서드는 public입니다. 또한 단일 클래스만 extends 할 수 있는 반면, 인터페이스는 여러개를 구현할 수 있습니다.
인터페이스(Interface)
인터페이스(Interface)는 상호 작용 방식을 명세해둔 것입니다. 인터페이스의 호출자는 인터페이스의 구현에 대한 지식이 없어도 원하는 기능을 수행할 수 있어야합니다. 예를 들어 우리는 자동차가 어떻게 움직이는지 세부 구현을 모르지만, 엑셀을 밟으면 앞으로 가고 브레이크를 밟으면 멈춘다는 약속을 통해 자동차를 운전할 수 있습니다. 따라서 인터페이스는 일종의 계약(contract)이라고도 불립니다.
추상 클래스와 인터페이스의 특징 비교
- 추상 클래스의 특징
- 인스턴스화 할 수 없으며 단일 상속만 가능합니다.
- static, final이 아니며, protected 또는 private인 속성을 가질 수 있습니다.
- 하위 클래스는 추상 클래스의 모든 추상 메서드를 구현해야 합니다.
- 인터페이스의 특징
- 인스턴스화 할 수 없으며 다중 상속이 가능합니다.
- public, static, final인 속성만 가질 수 있습니다.
- 구현 클래스는 인터페이스의 모든 메서드를 구현해야 합니다.
추상 클래스와 인터페이스의 의미
추상클래스는 코드 재사용을 위해 사용됩니다. 하위 클래스는 추상 클래스를 상속받아 추상 클래스의 속성과 메서드를 사용할 수 있으므로 동일한 코드를 재작성하지 않아도됩니다. 이는 일반 클래스를 통해서도 달성할 수 있지만 추상 클래스를 사용한다면 추상 메서드의 구현을 컴파일 시점에서 확인할 수 있고, 추상 클래스의 객체 생성을 막을 수 있다는 점에서 유리합니다.
이러한 역할은 인터페이스도 비슷해 보이지만, 인터페이스가 필요한 이유는 다릅니다. 추상 클래스가 코드 재사용에 초점을 맞춘다면, 인터페이스는 *디커플링에 초점을 맞추고 있습니다. 인터페이스는 일련의 프로토콜 또는 계약을 추상화한 것이므로, 호출자는 인터페이스에만 주의를 기울이고 구현 방식 자체에 대해서는 알 필요가 없습니다. 인터페이스를 통해 구현을 분리하여 코드의 결합도를 줄이고 확장성을 높일 수 있습니다. 이를 인터페이스 기반 프로그래밍이라고 하며, 이는 1994년에 출판된 "GOF의 디자인 패턴"에 처음 등장한 개념으로 1995년에 발표된 자바보다 먼저 등장하였습니다.
인터페이스 기반 프로그래밍을 통해 구현을 캡슐화하여 추상화에 기반한 프로그래밍을 할 수 있지만, 그렇다고 인터페이스를 남용하는 것은 바람직하지 않습니다. 예를 들어 서비스 계층 처럼 구현이 하나 뿐이고 다른 구현으로 대체할 일이 없다면 굳이 정의할 필요가 없습니다. 모든 것에 인터페이스를 만든다면 개발에 부담되며 오히려 코드 추적을 어렵게 만드는 등의 단점이 있습니다.
추상 클래스와 인터페이스를 언제 사용해야 될까 ?
추상 클래스는 상속을 사용하므로 *is-a 관계인데 반해, 인터페이스는 특정 기능이 있음을 나타내는 has-a 관계입니다. 따라서 인터페이스를 사용할 지 추상 클래스를 사용할지 판단하는 기준은 명확합니다. is-a 관계를 나타내며 코드 재상용 문제를 해겨하려면 추상 클래스를 사용하고, *has-a 관계를 나타내며 코드 재상요이 아닌 추상화 문제를 해결하려면 인터페이스를 사용하면 됩니다.
클래스 상속의 관점에서 추상 클래스는 상향식 설계 방식입니다. 먼저 하위 클래스의 코드를 반복한 다음 상위 클래스를 추상화하면서 생성되는 것이 추상 클래스입니다. 반면 인터페이스는 반대로 하향식 설계 방식입니다. 일반적으로 먼저 인터페이스를 설계한 다음 특정 구현을 고려하게됩니다.
* 디커플링이란 ?
-> 서로 다른 작업을 하는 코드를 분리시키는 작업을 의미합니다.
* is-a이란 ?
-> 상속 관계를 의미합니다.
* has-s란 ?
-> 한 클래스가 다른 클래스를 소유한 관계입니다.
'프로그래밍 > Java' 카테고리의 다른 글
[Spring, Spring Boot] @Value가 null일 때의 원인과 해결 방법 (0) | 2024.06.17 |
---|---|
[StringBoot] Azure 번역기 API 사용하기 (0) | 2024.06.12 |
[Spring, SpringBoot] Controller에서 데이터 받는 방법 (@RequestBody, @RequestParam, @ParthVariable) (0) | 2024.05.27 |
[Spring, Spring Boot] NoClassDefFoundError javax/xml/bind/DatatypeConverter (0) | 2024.04.17 |
[Java, 자바] static의 의미와 사용법 (0) | 2024.04.16 |
개발의 모든 것 !
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!