자바 추상 클래스와 인터페이스
추상 클래스는 상속에서 슈퍼 클래스로 사용된다.
추상 메소드
추상 메소드란 선언은 되어 있으나 코드가 구현되어 있지 않은, 즉 껍데기만 있는 메소드이다. 추상 메소드를 작성하려면 abstract 키워드와 함께 원형만 선언하고 코드는 작성하지 않는다. 다음은 추상 메소드를 선언한 예이다.
public abstract String getName();
public abstract void setName(String s);
추상 클래스(abstract class)
추상 클래스는 객체를 생성할 수 없다.
추상클래스를 단순히 상속받는 서브클래스는 추상 클래스가 된다. 추상 클래스의 추상 메소드를 그대로 상속받기 때문이다. 그러므로 서브 클래스에 abstract를 붙여 추상 클래스임을 명시해야 컴파일 오류가 나지 않는다.
추상 클래스는 추상 메소드를 통해 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스의 역할을 하고, 서브 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성을 실현할 수 있다.
추상클래스를 상속받은 서브 클래스는 개발자에 따라 다양하게 구현된다. 추상 클래스를 책의 목차에 비유하면, 서브 클래스는 목차에 따라 작성된 책과 같다. 책을 쓸 때도 목차를 잡아놓고 책을 쓰면 훨씬 쉽고 빠르며 방향이 흐트러지지 않는 것처럼 추상 클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있다. 추상 클래스로 기본 방향을 잡아놓고 서브 클래스에서 구현하면 구현 작업이 쉬워진다. 또한 추상 클래스는 계층적 상속 관계를 가지는 클래스들의 구조를 만들 때 적합하다.
추상 클래스 구현 연습
package GoodCalc;
abstract class Calculator{
public abstract int add(int a, int b); //두 정수의 합을 구하여 리턴
public abstract int subtract(int a, int b); // 두 정수의 차를 구하여 리턴
public abstract double average(int[] a); //배열에 저장된 정수의 평균 리턴
}
public class GoodCalc extends Calculator{
@Override
public int add(int a,int b) { //추상 메소드 구현
return a+b;
}
@Override
public int subtract(int a,int b) { //추상 메소드 구현
return a-b;
}
@Override
public double average(int[] a) {//추상 메소드 구현
double sum=0;
for(int i=0; i<a.length; i++) {
sum+=a[i];
}
return sum/a.length;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
GoodCalc c=new GoodCalc();
System.out.println(c.add(2, 3));
System.out.println(c.subtract(2, 3));
System.out.println(c.average(new int[] {2,3,4}));
}
}
인터페이스
인터페이스(interface)는 규격을 의미한다.
자바의 인터페이스는 interface 키워드를 사용하여 클래스를 선언하듯이 선언한다.
interface PhoneInterface{//인터페이스 선언
public static final int TIMEOUT=10000; //상수 필드, public static final 생략 가능
public abstract void sendCall(); //추상 메소드, public abstract 생략 가능
public abstract void reveiveCall(); //추상 메소드, public abstract 생략 가능
public default void printLogo(){ //default 메소드, public 생략 가능
System.out.println("**Phone**");
};// 디폴트 메소드
}
java 10 까지 인터페이스는 상수, 추상메소드(public abstract), default 메소드, private 메소드, static 메소드 총 5가지 종류의 멤버로 구성되며, 필드(멤버변수)를 만들 수 없다.
인터페이스는 객체를 생성할 수 없다. 인터페이스에 구현되지 않은 추상 메소드를 가질 수 있기 때문에 객체를 생성할 수 없다.
인터페이스 타입의 레퍼런스 변수는 선언 가능하다. PhoneInterface galaxy;
클래스는 인터페이스를 상속받을 수 없고, 인터페이스끼리만 상속이 가능하다. 인터페이스의 상속은 extends 라는 키워드를 이용한다. 자바는 인터페이스의 다중 상속을 허용한다.
인터페이스를 상속 받아 클래스를 작성하면 인터페이스의 모든 추상 메소드를 구현하여야 한다.
인터페이스 구현이란 implements 라는 키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현한 클래스를 작성하는 것을 말한다.
인터페이스와 추상 클래스의 비교
추상 클래스는 서브 클래스에서 필요로 하는 대부분의 기능을 구현하여 두고 서브 클래스가 상속받아 활용할 수 있도록 하되, 서브 클래스에서 구현할 수밖에 없는 기능만을 추상 메소드로 선언하여, 서브 클래스에서 구현하도록 하는 목적
인터페이스는 객체의 기능을 모두 공개한 표준화 문서와 같은 것으로, 개발자에게 인터페이스를 상속받는 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 목적
인터페이스는 필드는 포함하지 않는다. 그리고 다중 상속을 지원한다.