1. 추상 클래스
- 상속을 통해 자손 클래스에서 완성을 유도하는 클래스이다.
- 미완성 설계도라고 표현된다.
- 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 두는 추상 메서드가 존재한다. 그렇기 때문에 추상 메서드는 상속 받는 클래스에 따라 달라질 수 있다.
- 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메서드와 필드가 많은 경우, 즉 관련성이 높은 클래스 간에 코드를 공유하고 싶을 때 사용한다.
/**
추상 클래스 예시
**/
public abstract class Player {
boolean pause;
int currentPosition;
public Player() {
this.pause = false;
this.currentPosition = 0;
}
//지정된 위치에서 재생을 시작하는 추상 메서드
abstract void play(int position);
//재생을 즉시 멈추는 추상 메서드
abstract void stop();
void pause() {
if(pause) {
pause = false;
play(currentPosition);
} else {
pause = true;
stop();
}
}
}
/**
추상 클래스 상속 예시
**/
public class CDPlayer extends Player {
@Override
void play(int position) {
//구현 생략
}
@Overrdie
void stop() {
//구현 생략
}
//추가 구현
int currentTrack;
void nextTrack() {
currentTrack++;
//...
}
void preTrack() {
if(currentTrack > 1) {
currentTrack--;
}
//...
}
}
1.1 규칙
- 추상 클래스는 abstract를 붙여 표현한다.
- 추상 메서드를 포함하지 않아도 추상 클래스로 지정할 수 있다.
- 상속을 위한 클래스이기 때문에 new를 통해 객체를 직접 생성할 수 없다.
- interface의 메서드와 같이, 메서드에 abstract를 사용할 경우 구현 부분이 존재하지 않는다.
- 자식 클래스에서 반드시 오버라이딩해야 한다. 이는 자식 클래스에서 추상 메서드를 반드시 구현하도록 강제하는 것이다.
2. 인터페이스
- 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높아, 추상 클래스와 달리 몸통을 갖춘 일반 메서드, 멤버 변수를 가질 수 없다. 구현된 것은 아무 것도 없다.
- 기본 설계도라고 표현된다.
- 추상 클래스와 다르게 다중 상속이 가능하다. 인터페이스는 인터페이스로부터만 상속 받을 수 있다.
- 어떤 기능 또는 행위를 하는데 필요한 메서드를 제공한다는 의미를 강조하기 위해 인터페이스 명은 대부분 able로 끝나는 것들이 많다.
- 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우 사용한다.
/**
인터페이스 예시1
**/
public interface Movable {
void move(int x, int y);
}
/**
인터페이스 예시2
**/
interface Attackable {
void attack(Unit u);
}
/**
인터페이스 구현 예시
**/
interface Fightable extends Movable, Attackable {}
2.1 규칙
- 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.
- 인터페이스 변수는 아무 인스턴스가 존재하지 않는 시점이기 때문에 스스로 초기화 될 권한이 없다. 때문에 모든 멤버 변수는 public static final이어야 하며, 이를 통해 구현 객체의 같은 상태를 보장한다. public static final은 생략할 수 있다.
- 모든 메서드는 public abstract이어야 하며, 이를 생략할 수 있다.
- Java8부터 static 메서드와 default 메서드를 사용할 수 있게 되었다.
3. 추상 클래스 vs 인터페이스
- 공통점
① 가지고 있는 추상 메서드 구현을 강제한다.
② 인스턴스화가 불가능하다.
- 차이점
종류 | 설명 |
접근자 | 인터페이스 - 모든 변수는 public static final, 모든 메서드는 public abstract이다. 추상 클래스 - static이나 final이 아닌 필드를 가질 수 있다. 그렇기 때문에 추상 클래스를 상속 받은 객체들이 다른 상태를 가지고 있을 수 있다. - public, protected, private 모두 가질 수 있다. |
다중 상속 | 인터페이스 - 인터페이스를 구현하는 클래스는 다른 여러개 인터페이스를 함께 구현할 수 있다. 추상 클래스 - 자바는 다중 상속을 지원하지 않기 때문에 여러 추상 클래스를 상속할 수 없다. |
사용 의도 | 인터페이스 - 상속 관계를 타고 올라갔을 때 다른 조상 클래스를 상속하더라도 같은 기능이 필요한 경우 사용한다. - 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용한다. 추상 클래스 - 추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속한다. - 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다. |
참고
'Java' 카테고리의 다른 글
BufferedReader, BufferedWriter (0) | 2021.12.02 |
---|---|
JAR, WAR, EAR 차이점 (0) | 2021.11.11 |
HashTable, HashMap, ConcurrentHashMap 차이점 (0) | 2021.10.08 |
SOLID 원칙 (0) | 2021.10.06 |
객체 지향 프로그래밍과 절차적 프로그래밍 (0) | 2021.10.06 |