추상클래스와 추상메서드
abstract class 클래스이름 {
void play(int pos);
void stop();
}
class AudioPlayer extends Player {
void play(int pos) { }
void stop() { }
}
abstract class AbstractPla extends Player {
void play(int pos) { }
}
- 추상클래스는 키워드 abstract를 붙이기만 하면 된다.
즉, 해당 클래스는 추상메서드가 있으니 상속받아 구현해야 한다는 의미를 포함한다. - 추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 추상클래스의 모든 추상메서드를 구현해주어야 한다.
- 만약, 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 해당 서브클래스 역시 abstract 키워드를 붙여주어야 한다.
인터페이스
: 인터페이스는 일종의 추상클래스이다. 추상클래스처럼 추상메서드도 갖지만, 추상클래스보다 추상화의 정도가 높다.
때문에 몸통을 갖춘 일반 메서드나 멤버변수를 구성원으로 가질 수 없다.
단, 구현하는 인터페이스의 메서드 중 일부만 구현한다면 abstract를 붙여서 추상클래스로 선언해야 한다.
추상클래스 | 인터페이스 |
---|---|
미완성 설계도 | 기본 설계도 |
일반메서드나 멤버변수를 멤버로 가질 수 있음 | 오직 추상메서드와 상수만을 멤버로 가짐 |
다중상속 불가능 | 다중상속 가능 |
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수 목록);
}
- 모든 멤버변수는 public static final이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract이어야 하며, 이를 생략할 수 있다.
인터페이스의 장점
만약 해당 상속계층도에서 Barrack와 Factory에 공통된 메서드를 추가하고자 한다면 어떻게 해야 할까?
Barrack 클래스와 Factory의 클래스에 필요한 메서드를 적어주면 되긴 하지만, 코드가 중복된다는 단점이 있다..
그렇다고 해서 Building 클래스에 코드를 추가해 주면 다른 서브클래스인 Academy와 Bunker 클래스도 코드를 상속받으므로 안 된다...
이런 경우에 인터페이스를 사용한다.
interface Liftable {
void liftOff();
void move(int x, int y);
void stop();
void land();
}
class LiftableImpl implements Liftable {
public void liftOff() { /* 내용 생략 */ }
public void move(int x, int y) { /* 내용 생략 */ }
public void stop() { /* 내용 생략 */ }
public void land() { /* 내용 생략 */ }
}
Lifitable 인터페이스를 구현한 LiftableImpl 클래스를 Barrack 클래스와 Factory 클래스에 포함시켜서 내부적으로 호출하여 사용하면 된다.
이렇게 함으로써 같은 내용의 코드를 두 클래스가 아니라 LiftableImpl 클래스 한 곳에서 관리할 수 있다 ㄷㄷ..
처음엔 그냥 Barrack 클래스랑 Factory 클래스가 Liftable 인터페이스를 구현하면 되지 않나 생각했는데, 이 방법 역시 같은 코드를 중복 작성하므로 옳지 않다. 그래서 Liftable 인터페이스를 임의의 클래스에서 구현해 주고 해당 클래스를 상속받으면 되는 것이다..!!
'Book > 자바의 정석' 카테고리의 다른 글
[자바의 정석] Chapter 11. 컬렉션 프레임워크 - List (0) | 2023.07.14 |
---|---|
[자바의 정석] Chapter 8. 예외처리 (0) | 2023.07.14 |
[자바의 정석] Chapter 7. 객체지향 프로그래밍 II - 오버라이딩, 접근 제어자, 다형성 (0) | 2023.07.14 |
[자바의 정석] Chapter 6. 객체지향 프로그래밍 I - 오버로딩, 생성자 (0) | 2023.07.14 |
[자바의 정석] Chapter 6. 객체지향 프로그래밍 I - 클래스, 인스턴스, 메서드 (0) | 2023.07.14 |