자바에는 추상화를 구현하기 위해서 추상클래스와 인터페이스 두 가지 기능이 존재한다.
추상 클래스가 미완성 설계도라면 인터페이스는 기본 설계도라 할 수 있다.
추상 클래스는 트리 형식으로 상위 클래스와 하위 클래스로 나뉘어지는 구조이고, 하위 클래스는 상위 클래스에서 추상화시킨 생성자 혹은 메서드를 정의하면서 더 구체화되어간다.
반면에, 인터페이스는 트리 구조와 같은 수직적 구조가 아닌 수평적 구조를 가진다.
추상 클래스의 경우 클래스 명 앞에 abstract 키워드를 붙이고, 추상 메서드뿐만 아니라 생성자, 필드, 일반 메서드도 포함할 수 있다. 일반 클래스와 크게 다르지 않기 때문에 extends 키워드를 사용하여 상속 받는다.
인터페이스의 경우 앞에 interface 키워드를 사용하여 구현하고, 오로지 추상 메서드와 상수만을 포함할 수 있다. 인터페이스는 인터페이스로부터만 상속 받을 수 있고, implements 키워드를 사용하여 구현이 가능하다.
추상 클래스나 인터페이스에 구현한 추상메서드들은 상속받는 클래스에서 재정의(오버라이딩)을 해야만 한다. (강제성 부여)
위만 보면 "그럼 인터페이스를 굳이 사용해야하나?" 싶을 수 있는데 자바에서 인터페이스를 사용하는 이유는 다음과 같다.
1. 협업(Cooperation)
두 명의 개발자가 목적어만 다른 기능을 수행하는 클래스를 만들기로했을 때, 개인의 개성이 반영되어 메서드 명은 물론이고 클래스 명도 달라 합치는 데 힘이 들 수 있다.
인터페이스는 메서드의 틀을 미리 만들어 개발자 간의 의사소통 혼선을 줄여주고 다형성 개발에 유리함을 가져다 준다.
2. 다중 상속(Multiple inheritance)
자바는 복잡을 초래하는 것을 방지하기 위해 클래스를 통한 다중 상속은 지원하지 않지만, 인터페이스를 통한 다중 상속은 지원하기 때문이다.
이외에도 인터페이스를 사용하는 여러 디자인 패턴이 있고, 인터페이스를 잘 사용하면 프레임워크나 배포되는 공용 컴포넌트, 유틸 등을 개발할 때 매우 효과적이다. 하지만 잘 사용하지 않으면 복잡도만 증대시키는 상황을 초래할 수 있으므로 주의가 필요하다.
Summary
추상 클래스
: 클래스 구현부 내부에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 클래스를 말한다.
· 추상 클래스는 new 연산자를 사용하여 객체를 생성X
· 추상 클래스(부모)와 일반 클래스(자식)는 상속의 관계
· 공통된 필드와 메서드를 통일하여 일반 클래스 작성 시 시간 절약이 가능
· 추상 클래스는 단일 상속만 가능하며 일반 변수를 가질 수 있다.
· 상속을 받아 기능을 확장시키는 것이 목적
인터페이스
: 모든 메서드가 추상 메서드인 경우를 말한다.
· 추상 클래스보다 한 단계 더 추상화된 클래스라 볼 수 있다.
· 내부 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract 생략 가능
· 기존에는 인터페이스에 일반 메서드 구현이 불가능했지만, 자바8버전부터 default 예약어를 통해 구현이 가능
· 인터페이스는 static final 필드만 가질 수 있다. (필드 선언할 때 생략되어 있다 가정)
∵ 아무 인스턴스도 존재하지 않는 시점
· 인터페이스도 마찬가지로 new 연산자 사용하여 객체 생성X
· 추상 클래스와 반대로 다중 상속이 가능
· 구현 객체가 같은 동작을 한다는 것을 보장하는 것이 목적