이번 시간에는 "Java_인터페이스, 추상클래스"에 대해 다뤄보겠습니다.
public interface 인터페이스명 { 타입 상수명 = 값; //상수 타입 메소드명(매개변수, ... ); //추상 메소드 default 타입 메소드명(매개변수, ... ){ //구현부 } //디폴트 메소드 static 타입 메소드명(매개변수) { //구현부 } //정적 메소드 }
추상클래스란, A클래스, B클래스, C클래스가 있다고 할 때, 각 클래스 안에는 각자의 필드와 메소드가 있을 것이다. 추상클래스는 A클래스, B클래스, C클래스들 간에 비슷한 필드와 메소드를 공통적으로 추출해 만들어진 클래스이다. 즉, 추상클래스는 계층적 상속 관계를 가지는 클래스들의 구조를 만들때 적합하다.
(상황예시)
'키보드'라는 클래스가 있다. '키보드'를 만드는 제조사는 여러개이다. A제조사, B제조사, C제조사는 각 제조사만의 스타일대로 키보드를 제작하고 소비자들에게 제품을 출시한다. 여기서 차이가 있다면, A제조사는 누를때마다 불빛이 들어오고, B제조사는 누를때마다 딸깍거리는 소리가 장난아니다. C제조사는 키감이 좋다. 여기서 이 키보드들 간에 공통점은 바로 '키보드를 누른다'라는 액션이다. 즉, 메소드가 공통적이다. 그럼 이 메소드를 추출해서 추상클래스 안에 두면 되고, 키보드를 상속받아 A키보드, B키보드, C키보드가 탄생한다.
아직도 감이 안오는가? 단순하게 요약해보자면 3가지로 요약가능하다.
- 공통된 필드와 메소드를 통일할 목적, 유지보수성을 높일 수 있다.
- 실체클래스 구현시 시간을 절약하기 위해
즉 강제로 주어지는 필드와 메소드를 가지고 나만의 스타일대로 구현만 하면 된다. 설계 시간이 절약되고, 구현하는데만 집중할 수 있다.(번외로, 추상클래스를 설계하는 일은 AA(어플리케이션 아키텍쳐)가 해줄 것이다.)- 규격에 맞는 실체클래스 구현을 위해
2번의 시간절약과 비슷한 내용이다. '나만의 스타일대로 구현'을 보고 제멋대로 구현할 수 있다는 말이 아니다. '규격'안에서의 구현을 허락한다는 말이다. 중요한건, 소스 수정시 다른 소스의 영향도를 적게 가져가면서 변화에는 유연하게 만들기 위해 추상클래스를 사용하기도 한다. 규격에 맞게 소스가 구현되어 있기 때문에 해당 규격에 대한 구현부만 수정하면 손쉽게 수정이 가능하기 때문이다.(이부분은 객체지향(자바) solid설계원칙을 알면 이해하기 쉽다.)
문법
추상 클래스가 되는 경우 => 추상 메소드가 하나 이상 포함되거나 키워드 abstract로 정의된 경우
public abstract class 클래스명{ //필드 //생성자 //메서드 //추상메서드 }
추상메소드
선언은 되어 있으나 코드가 구현되어 있지 않은, 즉 껍데기만 있는 메소드, abstract키워드와 함께 메소드의 타입, 이름, 매개변수 리스트만 선언해야 한다.
[public / protected] abstract 리턴타입 메소드명(매개변수1, 매개변수2, ... );
객체(인스턴스)를 생성할 수 없다.
소개부분에서 소개했지만 추상클래스에는 실행코드가 없는 추상메소드가 있을 수 있기 때문에 추상클래스의 객체를 생성할 수 없도록 제한하였다. 그러나 추상클래스를 상속받은 클래스를 통하면 인스턴스화가 가능하다.
추상클래스명 ab = new 클래스명();
서브클래스
추상클래스를 상속받은 서브클래스는 조상클래스의 추상메소드를 그대로 상속받아 추상클래스가 된다. 그러므로 서브클래스 앞에 abstract 키워드를 반드시 사용하여 추상클래스임을 명시해야한다. 또한 모든 개발자들은 서브클래스에서 추상클래스에 선언된 추상메소드를 모두 구현해야 한다. 추상클래스를 책의 목차라고한다면 서브클래스는 목차에 따라 작성된 실제 책과 같다. 책을 쓸 때도 목차를 잡아놓고 책을 쓰면 훨씬 쉽고 빠르며 방향이 흐트러지지 않는 것처럼 추상클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있다. 추상 클래스로 기본 방향을 잡아놓고 서브 클래스에서 구현하면 구현 작업이 쉬워진다.
추상클래스는 생성자를 가질 수 있고, 접근지정자(public, protected, default, private)는 어떤 것이나 가능하다.
상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제한다.
존재목적의 차이
참고자료