프로젝트를 하다가 한번쯤 써봤던 인터페이스와 추상클래스지만 항상 비슷한거 같은데..?
라고만 생각하고 제대로 된 차이를 알아본 적이 없었던 것 같아서 이번 기회에 정리를 해보려고 합니다.
먼저 각자 어떤 특징을 가지고 있는지 간단히 알아봅시다.
1. 특징
- 추상클래스(Abstract Class) 특징
클래스는 크게 일반 클래스와 추상 클래스로 나눌 수 있습니다.
그 중에서 추상 클래스는 클래스 내부에 '추상 메소드'가 하나 이상 포함되거나 abstract 로 정의된 경우를 의미합니다.
또한 다른 클래스들처럼 생성자, 필드 , 일반메소드도 포함 할 수 있습니다.
- 인터페이스(Interface) 특징
인터페이스는 모든 메소드가 추상 메소드로 가지고 있습니다.
또한 상수를 가질 수 있습니다.
(자바8에서는 default 키워드를 이용해서 일반 메소드도 구현 가능하다고 합니다.)
* 추상 메소드는 선언만 되어있고 내용은 구현하지 않는 껍데기입니다.
public abstract void A(); 이런식으로 사용합니다.
2. 헷갈리는 이유
추상 클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현을 강제합니다.
둘다 외견상으로나 하는 일이나 비슷하기 때문입니다. (저만 헷갈리는걸수도..)
3. 그렇다면 차이점은?
하는 일은 비슷하지만 존재하는 이유가 다릅니다.
추상 클래스는 이를 상속받은 클래스가 추상 클래스의 기능을 이용 또는 확장하는데 목적이 있습니다.
이렇게 사용했을때 가질 수 있는 이점은 확장에 있는데
같은 추상 클래스를 상속받는 객체에서 동일한 이름을 가진 메소드를 추상클래스에서
하나로 교집합을 뽑아내듯 가질 수 있다는 점입니다. 그리고 동일한 이름을 가졌지만
각각의 객체에서 조금씩 차이가 있다면 해당 객체마다 조금씩 수정해서 사용할 수 있습니다.
그러나 인터페이스는 상수와 메소드의 껍데기만 가지는데 그 이유는 해당 인터페이스를 사용하는 곳에서
해당하는 메소드의 구현을 강제적으로 하도록 하기 위해서 사용합니다. 즉 구현 객체가 같은 동작을 한다는것을
보장하기 위해서 사용합니다.
추가적으로 클래스는 다중상속이 불가능하고
인터페이스는 가능합니다.
첫 포스팅을 했는데 머리속으로 이해하는거랑 글로 쓰는거랑은 많은 차이가 있다는걸 느낍니다..
공부 정리용으로 쓰는 블로그니 맹신하지는 마시길
아래는 추가적으로 읽어보면 좋을거 같은 블로그가 있어서 출처를 남깁니다.
추상클래스와 인터페이스 언제 사용하나?
- 추상클래스
- 여러개의 가까운 클래스들 (is-a 관계가 형성될) 사이에 동일한 코드를 공유해서 사용하고 싶을때.
- 추상클래스를 상속한 클래스들이 많은 공통 메소드들과 필드와 public 보다 다양한 접근 제어자에 의해 사용하고 싶을때.
- non-static 과 non-final 필드를 선언하고 싶을때. 결과적으로 객체들의 상태를 메소드에서 접근하고 수정 할 수 있게 되겠지.
- 인터페이스
- 크게 상관없는(is-a 정도는 아닌 has-a 정도인) 클래스들이 너의 인터페이스를 구현( java8 부터는 구현된 것을 사용도 포함)해야 할 필요가 있을때. 예를들어 Comparable and Cloneable
- 특정 데이터타입의 행위를 특별하게 구현하길 원할때 그러나 누가 그것의 행위를 구현 했는지에 대한 관심은 없을때
- 다중 구현상속의 이점을 누려야 할때
출처: https://hamait.tistory.com/650?category=79137 출처: https://jeong-pro.tistory.com/82 [기본기를 쌓는 정아마추어 코딩블로그] [HAMA 블로그]
'Java' 카테고리의 다른 글
JAVA 시간 차이 계산하기 (0) | 2021.04.10 |
---|---|
GSON 과 JSON (0) | 2021.03.07 |
자바 generic (0) | 2021.01.30 |