*추상클래스(abstract class)란?
- 클래스가 설계도라면 추상클래스는 '미완성 설계도'
- 추상메서드(미완성 메서드)를 포함 하고 있는 클래스
- 추상메서드 : 선언부만 있고 구현부(몸통, body)가 없는 메서드
- 일반메서드가 추상메서를 호출할 수 있다(호출할 때 필요한건 선언부)
- 완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.
- 다른 클래스를 작성하는 데 도움을 줄 목적으로 작성된다.
abstract class Player {
int currentPos; // 현재 play되고 있는 위치를 저장하기 위한 변수
Player() { // 추상클래스도 생성자가 있어야 한다.
currentPos = 0;
}
abstract void play(int pos); // 추상메서드
abstract void stop(); // 추상메서드
void play(0 {
play(currentPos); // 추상메서드를 사용할 수 있다.
}
.....
* 추상 메서드(abstract mehod)란?
- 선언부만 있고 구현부가 없는 메서드
/* 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다. */
abstract 리턴타입 메서드이름() ;
ex)
/* 지정된 위치(pos)에서 재생을 시작하는 기능이 수행되도록 작성한다.*/
abstract void play(int pos) ;
- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용
- 추상클래스를 상송받은 자손클래스에 추상메서드의 구현부를 완성해야 한다.
* 인터페이스(interface)란 ?
- 일종의 추상클래스, 추상 클래스 보다 추상화 정도가 높다.
- 실제 구현된 것이 전혀 없는 기본 설계도(알맹이 없는 껍데기)
- 추상메서드와 상수만을 맴버를 가질 수 있다.
- 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
- 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는데 사용한다.
- 두 대상(객체)간의 '연결, 대화, 소통'을 돕는 '중간 역활'을 한다.
- 선언(설계)와 구현을 분리시키는 것을 가능하게한다.
- 클래스를 사용하는 쪽 (user) 과 클래스를 제공하는 쪽(Provider)이 있다.
- 메서드를 사용(호출)하는 쪽 (user)에서는 사용하려는 메서드(Provider) 선언부만
알면된다.
-> 인터페이스의 작성
- 'calss' 대신 'interface'를 사용한다는 것 외에는 클래스 작성과 동일하다.
interface 인터페이스 이름{
public static final 타입 상수이름 = 값 ;
public abstract 메서드이름(매개변수목록);
}
- 하지만 구성요소(맴버)는 추상메서드와 상수만 가능하다.
- 모든 멤버변수는
public static final 이어야 하며, 이를 생략할 수 있다.
- 도든 메서드의 public abstract 이어야 하며, 이를 생략 할 수 있다.
-> 인터페이스의 상속
- 인터페이스도 클래스처럼 상속이 가능하다.(클래스와 달리 다중상속 허용)
- 인터페이스는 Oject클래스와 같은 최고 조상이 없다.
interface Movable {
//** 지정된 위치(x, y)로 이동하는 기능의 메서드 */
void move(int x, int y);
}
interface Attackable {
//** 지정된 대상(u)을 공격하는 기능의 메서드 */
void attack(Unit u);
}
//인터페이스는 클래스와 달리 다중 상속을 허용
interface Fightable extends Movable, Attackable { }
->인터페이스의 구현
- 인터페이스를 구현하는 것은 클래스를 상속받는 것과 같다. 다만 'extends' 대신 'implements' 사용
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서를 구현해야한다.
}
- 인터페이스에 정의된 추상메서드를 완성해야 한다.
class Fighter implements Fightable {
public void move() { /* 내용 생략*/
public void attack() {/* 내용 생략*/
interface Fightable{
interface Fightable{
void move(int x, int y);
void attack(Unit u);
}
- 상속과 구현이 동시에 가능
class Fighter extends Unit implements Fightable {
public void move(int x, int y){/* 내용 생략 */}
public void attack(Unit u) {/* 내용 생략 */}
-> 인터페이스를 이용한 다형성
- 인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
- 인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.
void attack(Fightable f) { // Fightable 인터페이스를 구현한 클래스의 인터턴스를
// ... // 매개변수로 받는 메서드
}
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
Fightable method() { // Fightable인터페이스를 구현한 클래스의 인스턴스를 반환
// ....
return new Fighter();
}
->인터페이스의 장점
1. 개발시간을 단축시킬 수 있다.
- 인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고도 양쪽에서 동시에 개발 진행 할 수 있다.
2. 표준화가 가능하다.
- 프로젝에 사용되는 기본 틀을 인터페이스로 작성후 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록
하게함으로써 보다 일관되고 정형화된 프로그램 개발이 가능
3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
- 서로 상속관계에 있지도 않고 같은 조상 클래스를 가지고 있지 않는 서로 아무런 관계도 없는 클래스 들에게
하나의 인터페이스를 공통적으로 구현 하다록 함으로써 관계를 맺어 줄 수 있다.
4. 독립적인 프로그램 가능하다.
- 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제구현에 독립적인 프로그램 가능