티스토리 뷰
부제: 인터페이스와 추상클래스의 비교
인터페이스와 추상클래스의 차이점. JAVA 서적 아무거나 펴보면 무조건 나오는 내용이다. 혹시 당신은 그냥 문법적인 차이만 대충 알고 넘어가지 않았는가? 이번 글에서는 인터페이스와 추상클래스를 비교해보겠다.
1. Abstract Class
클래스의 형태 중 하나이다. 클래스는 일반 클래스(concrete class)와 추상 클래스(abstract class)로 나뉜다. 클래스를 abstract로 정의한 경우 그 클래스는 추상 클래스가 된다. 추상 클래스의 선언 예는 아래와 같다.
public abstract class Human {
public abstract void sleep();
public abstract int food();
}
추상 클래스가 일반 클래스와 다른 점은 아래와 같다.
- new 키워드로 인스턴스화 할 수 없다.
- 추상 메소드(abstract method)를 0개 이상 보유할 수 있다.
2. Interface
인터페이스는 클래스가 아니다. 내부에 메소드의 선언만 작성할 수 있다.(JAVA8 이상 부터는 default method를 지원 한다.) 인터페이스를 구현(implements)하는 클래스는 인터페이스 내부에 정의된 메소드를 전부 구현해야만 한다. 인터페이스의 선언 예는 아래와 같다.
public interface Vehicle{
void run();
void move();
}
3. 비교
인터페이스와 추상 클래스의 문법상 차이는 많은 블로그에서 다루고 있고 쉽게 찾을 수 있다. 간단하게 정리하면 다음과 같다.
비슷한 점
- 다른 클래스가 상속(extends) 하거나 구현(implements)할 수 있다.
- 둘 다 새로운 인스턴스를 생성할 수 없다.
- 추상 클래스(또는 인터페이스)를 상속(또는 구현) 하는 클래스는 추상 클래스(또는 인터페이스)의 추상메소드의 동작을 구현하도록 강제한다.
차이점
- 추상클래스는 변수를 포함할 수 있다. 인터페이스는 안된다.
- 추상클래스는 0개 이상의 추상 메소드를 포함한다. 그러나 인터페이스는 모든 메소드가 추상메소드이어야만 한다.
- 하나의 클래스는 하나의 추상클래스만 상속할 수 있다. (다중 상속 금지) 그러나 인터페이스는 여러개 구현 할 수 있다.
4. 템플릿메소드 패턴 vs 전략 패턴
도입에서 다루었듯, 이정도는 그냥 JAVA 관련 책 한 권 읽으면 누구나 알 수 있는 내용이다. 그래서 비교적 단순하게 다루었다. 그럼 추상클래스와 인터페이스의 차이는 무엇일까. 진짜 차이는 '사용 목적'에 있다.
결론을 말하자면, 추상 클래스의 사용 목적은 확장이다. 그리고 인터페이스의 사용 목적은 같은 동작을 보장하는 것이다.
추상 클래스를 활용하는 디자인 패턴으로 템플릿메소드 패턴(Template Method Pattern)이 있다. 템플릿메소드 패턴에서는 추상 클래스를 활용하여 변하지 않는 기능은 추상 클래스에 구현하고 자주 변경되거나 확장할 수 있는 기능은 서브 클래스(추상 클래스를 상속한 클래스)에 정의한다.
즉, 추상 클래스 내부에 필드나 메서드를 직접 정의하여 비슷한 소스코드의 반복을 줄이고 일부 메서드의 구현을 서브 클래스에 위임하여 기능의 확장을 추구하는 디자인패턴이다.
인터페이스를 활용하는 디자인 패턴으로 전략 패턴(Stratergy Pattern)이 있다. 전략패턴에서는 인터페이스를 활용한다. 인터페이스에는 서브 클래스(인터페이스를 구현하는 클래스)들이 구현할 메서드의 선언만 정의한다.
즉, 모든 서브 클래스들은 같은 메서드를 구현한다. 물론 선언을 제외한 메서드의 구현 내용은 달라질 수 있다. 그러나 전략패턴에서는 서브 클래스가 인터페이스에서 정의하지 않은 메서드를 따로 정의하지는 않는다. 결국 모든 서브 클래스는 세부적으론 다를 수 있겠지만 같은 동작을 한다.
-끝-
'IT > 기술면접' 카테고리의 다른 글
트랜잭션에 대하여 (0) | 2018.11.24 |
---|---|
JAVA의 Garbage Collection을 소개합니다 (0) | 2018.03.07 |
JAVA의 Exception(예외)이란 무엇인가 (0) | 2018.02.02 |
싱글턴(Singleton)패턴에 대해 자세히 알아보자 (1) | 2018.01.07 |
[JAVA] String, StringBuilder, StringBuffer에 대하여 (0) | 2017.10.05 |