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 인터페이스

Abstract Class와 Interface 비교

- 공통점

① 가지고 있는 추상 메서드 구현을 강제한다.

② 인스턴스화가 불가능하다.

- 차이점

종류 설명
접근자 인터페이스
- 모든 변수는 public static final, 모든 메서드는 public abstract이다.

추상 클래스
- static이나 final이 아닌 필드를 가질 수 있다. 그렇기 때문에 추상 클래스를 상속 받은 객체들이 다른 상태를 가지고 있을 수 있다.
- public, protected, private 모두 가질 수 있다.
다중 상속 인터페이스
- 인터페이스를 구현하는 클래스는 다른 여러개 인터페이스를 함께 구현할 수 있다.

추상 클래스
- 자바는 다중 상속을 지원하지 않기 때문에 여러 추상 클래스를 상속할 수 없다.
사용 의도 인터페이스
- 상속 관계를 타고 올라갔을 때 다른 조상 클래스를 상속하더라도 같은 기능이 필요한 경우 사용한다.
- 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용한다.

추상 클래스
- 추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속한다.
- 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.

 

참고

- https://velog.io/@new_wisdom/Java-%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4

- https://myjamong.tistory.com/150

'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