추상(abstract) 클래스와 인터페이스(interface) 클래스
1. 추상 클래스와 추상 메소드란?
추상클래스란 말 그대로 추상적으로 밖에 그려지지 않은 클래스라고 한다. 즉, 클래스가 전체적인 구성을 다 가지지 못한 채 설계만 되어있는 클래스이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스를 생성할 수는 없다. 추상클래스는 상속(Extends)을 통해서 자식 클래스에 의해 완성이 된다. 그래서 추상클래스 자체로는 제 기능을 다하지는 못하지만, 새로운 기능을 정의하는데 있어서 바탕(틀)이 될 수 있다!
package ch7;
// 추상 클래스는 class 선언부 앞에 abstract를 적어준다.
abstract class 클래스명 {
.....
abstract 메소드명(); // 추상 메소드
}
- 추상 메소드가 하나 이상 포함되면 반드시 추상클래스로 선언이 되어야 한다.
- 추상클래스에서 추상 메소드가 아닌 일반 메소드를 포함시킬 수 있다.
- 추상클래스를 상속하는 자식 클래스에서 부모가 가진 메소드를 모두 오버라이딩 해야 한다.
- 추상 메소드는 몸체가 없고 선언부만 존재한다.
package ch7;
// 추상클래스 선언
// 구현부가 없이 선언부만 존재하는 것을 확인할 수 있다.
abstract class Player{
boolean pause;
int currentPos;
// 생성자로 변수 초기
Player(){
pause = false;
currentPos = 0;
}
abstract void play(int pos);
abstract void stop();
}
class AudioPlayer extends Player{
// play 메소드의 구현부
void play (int pos){
System.out.println("AudioPlayer.play");
}
// void 메소드의 구현부
void stop (){
System.out.println("AudioPlayer.stop");
}
}
class CDPlayer extends Player{
// play 메소드의 구현부
void play (int pos){
System.out.println("CDPlayer.play");
}
// void 메소드의 구현부
void stop (){
System.out.println("CDPlayer.stop");
}
}
class abEx02{
public static void main (String args[]){
AudioPlayer ap = new AudioPlayer();
ap.play(1);
CDPlayer cp = new CDPlayer();
cp.play(1);
}
}
2. 인터페이스(Interface) 클래스란?
인터페이스는 추상클래스처럼 추상 메소드를 갖지만 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 몸통을 갖춘 일반 메소드 또는 멤버 변수를 구성원으로 가질 수 없다. 오직 추상 메소드와 상수만을 멤버로 가질 수 있으므로 그 외의 다른 어떠한 요소도 허용하지 않는다. 추상클래스를 부분적으로 미완성된 설계도라고 했다면, 인터페이스 클래스는 아무 것도 없고 밑그림만 그려져 있는 상태이다.
package ch7;
interface 클래스명{
public static final 변수타입 변수명 = 값;
public abstract 메소드명(매개변수);
}
- 모든 멤버변수는 public static final 이어야하며, 이를 생략할 수 있다.
- 모든 메소드는 public abstract 이어야 하며, 이를 생략할 수 있다.
- 인터페이스는 인터페이스로부터만 상속(Extends)받을 수 있으며, 클래스와 달리 다중 상속이 가능하다.
ex) interface Fightable extends Movable, Attackable{ }
여기서 Movable과 Attackable은 모두 interface 클래스다.
void autoPlay(I i) {
i.play();
}
}
interface I {
public abstract void play();
}
class B2 implements I {
public void play() {
System.out.println("play in B class");
}
}
class C2 implements I {
public void play() {
System.out.println("play in C class");
}
}
class InterfaceTest2 {
public static void main(String[] args) {
A2 a = new A2();
a.autoPlay(new B2());
a.autoPlay(new C2());
}
}
결과
play in B class
play in C class
인터페이스 클래스의 장점
- 개발 시간을 단축시킬 수 있다.
메소드를 호출하는 쪽에서는 메소드의 내용에 관계없이 선언부만 알면 되기 때문이다. - 표준화가 가능하다.
프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
서로 상속관계에 있지도 않고, 같은 조상 클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어줄 수 있다.독립적인 프로그래밍이 가능하다.
인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다.
클래스와 클래스 간의 직접적인 관계를 인터페이스를 통해서 간접적인 관계로 변경하면 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.
참고링크
- 자바의 정석
'◼︎ 개발 > JAVA' 카테고리의 다른 글
[JAVA] 쓰레드(Thread)와 런에이블(Runnable) 2편 (8) | 2017.05.22 |
---|---|
[JAVA] 쓰레드(Thread)와 런에이블(Runnable) 1편 (0) | 2017.05.21 |