자바 추상클래스와 인터페이스
public abstract class 클래스이름 {
...
public abstract void 메서드이름();
}
class 앞에 'abstract' 키워드를 사용하여 정의한다.
하나 이상의 추상 메서드를 가지는 클래스이다.
추상 메서드를 선언하여 상속을 통해서 하위 클래스에서 반드시 구현하도록 강제하는 클래스이다.
추상 메서드를 포함하지 않는 클래스에서도 abstract를 붙여서 추상 클래스로 지정할 수 있다.
반대로 추상 메서드를 포함하는 클래스는 반드시 추상 클래스이여야 한다.
추상클래스 만들기
(1) 추상 메소드를 포함하는 클래스
abstract class Shape {
public Shape(){ }
public void paint() { draw(); }
abstract public void draw(); // 추상메소드 선언
}
(2) 추상 메소드가 없지만 abstract로 선언한 클래스
abstract class Student{ //추상 클래스 선언
String name;
public void load(String name) {
this.name=name;
}
}
-> 추상 메소드를 가지고 있으면 반드시 추상 클래스로 선언되어야 한다.
추상 클래스의 특징
public class Example{
public static void main(String [] args){
Circle circle;
circle = new Circle() // 컴파일 오류. 추상 클래스 Circle의 객체를 생성 XX
추상 클래스의 구현은 슈퍼 클래스에 선언된 모든 추상 메소드를 서브 클래스에서 오버라이딩하여 실행 가능한 코드로 구현하는 것이다.
추상 클래스는 추상 메소드를 통해 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스의 역할을 하고, 서브 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성을 실현할 수 있다.
추상 클래스 구현
Calculator를 상속받은 ExamCalc 클래스 구현
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 ExamCalc 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 int ouble 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){
ExamCalc c = new ExamCalc();
System.out.println(c.add(1,2));
System.out.println(c.subtract(3,2));
System.out.println(c.average(new int [] {2,3,4 }));
실행결과
3
1
3.0
추상클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있다.
추상클래스는 계층적 상속 관계를 가지는 클래스들의 구조를 만들 때 적합하다.
[ public ] interface 인터페이스명 {...} //인터페이스 선언
클래스는 필드, 생성자, 메소드를 멤버로 가지는 반면,
인터페이스는 상수와 메소드만을 멤버로 가진다.
인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.
interface 인터페이스명 {
// 상수
타입 상수명 = 값;
// 추상 메소드
타입 메소드명(매개변수, ...);
// 디폴트 메소드
default 타입 메소드명(매개변수, ...) {...}
// 정적 메소드
static 타입 메소드명(매개변수) {...}
}
interface 인터페이스명 {
// 상수
타입 상수명 = 값;
// 추상 메소드
타입 메소드명(매개변수, ...);
// 디폴트 메소드
default 타입 메소드명(매개변수, ...) {...}
// 정적 메소드
static 타입 메소드명(매개변수) {...}
}
상수 필드 선언
인터페이스는 데이터를 저장할 수 없다.
데이터를 저장할 인스턴스 또는 정적 필드를 선언할 수 없고 대신 상수 필드만 선언이 가능하다.
상수는 public static final로 선언한다.`
[ pulbic static final ] 타입 상수명 = 값;
pulbic interface RemoteControl {
public int MAX_VOLUME = 100;
public int MIN_VOLUME = 0;
}
인터페이스 구현 - implements
public class 구현클래스명 implements 인터페이스명 {
//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
인터페이스 예제 - 도형의 구성을 묘사하는 인터페이스 (명품자바프로그래밍 5장 13번)
interface Shape{
final double PI = 3.14; //상수
void draw(); //도형을 그리는 추상메소드
double getArea(); //도형의 면적을 리턴하는 추상메소드
default public void redraw() { //디폴트 메소드
System.out.print("--- 다시 그립니다. ");
draw();
}
}
class Circle implements Shape{
private int radius;
public Circle(int radius) {
this.radius = radius;
}
public void draw() {
System.out.println("반지름이 " + this.radius + "인 원입니다.");
}
public double getArea() {
return PI * radius * radius;
}
}
public class Exercise {
public static void main(String args[]) {
Shape donut = new Circle(10);
donut.redraw();
System.out.println("면적은 " + donut.getArea());
}
}
실행결과
--- 다시 그립니다. 반지름이 10인 원입니다.
면적은 314.0
인터페이스 특징
인터페이스는 객체를 생성할 수 없다.
인터페이스 타입의 레퍼런스 변수는 선언 가능하다.
인터페이스끼리 상속 가능하다.
인터페이스를 상속받아 클래스를 작성하면 인터페이스의 모든 추상메소드를 구현해야 한다.