추상 클래스와 인터페이스의 차이점은 뭘까?
추상 클래스를 사용할지 인터페이스를 사용하지 어떻게 정할까?
일단 기본적으로 추상 클래스와 인터페이스가 무엇인지 알아보자
추상 클래스란?
추상 클래스는 일반 클래스와 별 다를 것이 없다
단지, 추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스이다
그래서 미완성 설계도라고도 표현한다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없다
class 앞에 "abstract" 키워드를 사용하여, 상속을 통해서 구현해야 한다는 것을 알려주고 선언부만 작성하는 추상 메서드를 선언할 수 있다
abstract class 클래스이름 {
...
public abstract void 메서드이름();
}
더 자세히 알고 싶으면 여기를 보면 좋을 거 같다
인터페이스란?
추상 클래스가 미완성 설계도라면 인터페이스는 기본 설계도라고 할 수 있다
인터페이스도 추상 클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속(구현)이 가능하다
interface 인터페이스이름 {
public static final 상수이름 = 값;
public abstract void 메서드이름();
}
추상 클래스 vs 인터페이스 차이점
추상 클래스는 추상 메서드를 포함한 클래스 즉, 변수, 일반 메서드, 추상 메서드와 같은 구성인 클래스이다
인터페이스는 오직 추상 메서드만 가지고 있는 클래스이다
일단 추상 클래스와 인터페이스의 공통점은 추상 메서드를 사용할 수 있다는 것이다
그럼 왜 굳이 두 가지로 나눠서 사용할까?
추상 클래스와 인터페이스의 기능들을 살펴보면 추상 클래스가 인터페이스의 역할을 다 할 수 있는데, 왜 굳이 인터페이스라는 게 있는 걸까?
이론적인 차이점을 다 제외하고 두 개로 나눠서 사용하는 가장 큰 차이점은 사용용도라고 생각한다
● 사용 의도 차이점
추상클래스는 IS - A "~이다"
인터페이스는 CAN - DO "~을 할 수 있는"
이렇게 구분하는 이유는 다중상속의 가능 여부에 따라 용도를 정한 것 같다
자바의 특성상 한 개의 클래스만 상속이 가능하여 해당 클래스의 구분을 추상 클래스 상속을 통해 해결하고, 할 수 있는 기능들을 인터페이스로 구현한다
● 공통된 기능 사용 여부
만약 모든 클래스가 인터페이스를 사용해서 기본 틀을 구성한다면...
공통으로 필요한 기능들도 모든 클래스에서 오버 라이딩하여 재정의 해야 하는 번거로움이 있다
이렇게 공통된 기능이 필요하다면 추상 클래스를 이용해서 일반 메서드를 작성하여 자식 클래스에서 사용할 수 있도록 하면 된다
어!? 그러면 그냥 추상 클래스만 사용하면 되는 거 아님??
물론, 이런 궁금증이 생길 수 있다
위에서 얘기했듯이 자바는 하나의 클래스만 상속이 가능하다
만약 각각 다른 추상 클래스를 상속하는데 공통된 기능이 필요하다면?
해당 기능을 인터페이스로 작성해서 구현하는 게 편하지 않을까?
위에 글들을 예로 들어보자면
자동차라는 클래스가 있다고 가정해보자
자동차에는 바퀴, 문, 백미러와 같은 공통적인 변수
달린다, 멈춘다 라는 공통적인 기능 즉, 메서드가 필요하다
위에 공통 변수와 공통 메서드를 포함한 추상 클래스를 만들어 보자
그리고 위에 만들어진 추상 클래스를 자동차가 상속받으면 기본적인 자동차가 완성된다
하지만 나는 이런 기본적인 자동차가 아닌 날 수도 있고, 바다를 건널 수 있고, 미사일 발사가 되는 각각 기능을 자동차에 넣고 싶다고 가정해보자
그럼 위에 기능을 가진 추상 클래스를 만들어서 상속받으면 안 되나?
당연히 안된다. 그 이유는 위에서도 말했다시피 클래스는 하나의 추상 클래스만 상속받을 수 있다
그렇다면 어떻게 저 위에 특별한 기능을 구현할 수 있을까?
이때 해결할 수 있는 것이 인터페이스(interface)의 다중상속이다
class 자동차 extends 추상 클래스 implements 날 수 있는(인터페이스)
이렇게 상속을 받고 구현을 하게 되면 날 수 있는 자동차가 만들어진다
만약에 날 수도 있고 미사일 발사도 가능한 자동차를 만들고 싶다면??
class 자동차 extends 추상 클래스 implements 날 수 있는, 미사일 발사가 되는(인터페이스)
두 가지 인터페이스를 구현하게 되면, 날 수 있고 미사일 발사를 할 수 있는 자동차 클래스가 만들어진다
사람이라는 또 다른 예로 들어보자면
눈, 귀, 코, 입을 추상 클래스로 만들고
춤을 잘 추는, 노래를 잘하는, 코딩을 잘하는 세 가지 인터페이스를 각각 만들었다고 치자
여기서 추상 클래스만 상속받으면 일반적인 사람이 만들어진다
여기에 코딩을 잘하는 인터페이스를 구현하게 되면
코딩을 잘하는 사람이 만들어진다
또 다른 구조 예제를 보면 이해가 잘될 것이다
사진을 보면 Kevin, Turtle, Pigeon이라는 클래스가 있다
위에 클래스를 만들기 위해 각각 인터페이스와 추상 클래스를 상속받은걸 확인할 수 있다
Kevin으로 예를 들자면, Human이라는 추상 클래스를 상속받고 있다
그리고 Human추상 클래스는 Creature를 상속받고 있다
Creature라는 추상 클래스는 Animal의 부모 클래스이기도 하다
그럼 Creature에 들어갈 만한 공통적인 부분은 뭐가 있을까?
나이가 있을 수 있겠고, 이동한다라는 메서드가 있을 수 있을 것이다
그럼 그 Creature를 상속받은 Human 클래스에는 뭐가 있을까?
도구를 사용하는 메서드가 존재할 수 있을 것이다. 또한, Talkable 인터페이스를 구현했기 때문에 말도 할 수 있을 것이다
그렇게 Human 추상 클래스를 상속받은 Kevin클래스는 나이가 있고 이동, 도구 사용, 말까지 할 수 있는 사람이 만들어진다
여기에 Kevin이라는 클래스는 Swimable와 Programmer라는 인터페이스를 구현했으니
Kevin이라는 사람은 수영도 할 수 있고 프로그래밍까지 할 수 있는 멋진 사람인 걸 알 수 있다
이렇게 인터페이스와 추상 클래스의 차이점을 알아보았다
인터페이스도 추상 클래스와 마찬가지로 용도를 알게 되면 자연스럽게 이해가 되는 부분이 많은 거 같다
이글을 보고 참고해서 작성했으니 위에 Kevin 예제 코드가 궁금하다면 들어가서 보는 것도 좋을 거 같다
'Java' 카테고리의 다른 글
Java 자바 추상클래스란 (0) | 2020.08.27 |
---|