🌱 오늘의 주제 : 추상 클래스(abstract class)
🌱 추상 클래스(abstract class)
- 공통 부분만을 그린 미완성 설계도, 인스턴스 생성불가.
- 미완성 메서드(추상 메서드)를 포함하고 있는 클래스
- 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.
- 추상 클래스는 추상 메서드를 포함하고 있다는 것만 제외하고, 일반 클래스와 전혀 다르지 않다. (생성자, 멤버변수, 메서드 가능)
- 실생활에서 예를 들어, 같은 크기의 TV라도 기능의 차이에 따라 여러 종류의 모델이 있지만, 설계도는 아마 90% 이상 동일할 것이다. 미완성 설계도를 만들어 놓고, 각각 이 설계도를 이용해 제품을 완성하는 것이 효율적일 것이다. 이때, 설계도가 추상 클래스 역할이다.
abstract class 클래스 이름 {
}
🌱 추상 메서드(abstract method)
- 미완성 메서드이다. 선언부(abstract 리턴타입 메서드이름( ); )만 있고 구현부 { } 는 없다.
- 미완성인 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에, 조상 클래스에서는 선언부만 작성하고, 실제 내용은 상속 받는 클래스에서 구현하도록 비워 두는 것이다. 그렇기 때문에, 상속받는 자손 클래스는 오버라이딩을 통해 조상의 추상메서드를 구현해 주어야 한다.
- 만약 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손클래스 역시 추상클래스로 지정해 주어야 한다.
// 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다.
abstract 리턴타입 메서드이름 ( );
abstract class Player { // 조상 - 추상 클래스
abstract void play(int pos); // 추상 메서드
abstract void stop( ); // 추상 메서드
}
class AuidoPlayer extends Player {
void play(int pos) { 내용 생략 } // 추상 메서드를 구현
void stop() { 내용 생략 } // 추상 메서드를 구현
abstract class AbstractPlayer extends Player { // 조상인 추상클래스의 추상메서드를 모두 구현 안했기 때문에 앞에 abstract 붙임.
void play(int pos) { 내용 생략} // 추상 메서드를 구현
🌱 추상 클래스의 작성
- 기존의 클래스의 공통적인 부분을 뽑아서 추상 클래스로 만들어 상속하도록 하는 경우
- 추상 : 낱낱의 구체적 표상이나 개념에서 공통된 성질을 뽑아 이를 일반적인 개념으로 파악하는 정신 작용
- 상속계층도를 따라 내려 갈수록 세분화되며, 올라갈수록 공통요소만 남게 된다.
package abstract_method;
public class Ex7_10 {
public static void main(String[] args) {
// 추상 클래스의 작성 예제
Unit[] group = {new Marine(), new Tank(), new Dropship() };
for(int i = 0; i < group.length; i++) {
group[i].move(100,200); // Object클래스에는 move메서드가 정의되어 있지 않기 때문에 move메서드를 호출하는데 에러.
}
} // main
}
abstract class Unit {
int x, y;
abstract void move(int x, int y);
void stop() {
// 현재 위치에 정지
}
}
class Marine extends Unit {
void move(int x, int y) {
System.out.println("Marine[x= " + x + ",y=" + y + "]");
}
void stimPack() {
// 스팀팩을 사용한다.
}
}
class Tank extends Unit { // 탱크
void move(int x, int y) {
System.out.println("Tank[x = " + x + ",y= "+ y + "]");
}
void changeMode() {
// 공격모드를 변환한다.
}
}
class Dropship extends Unit { //송수선
void move(int x, int y) {
System.out.println("Dropship[x = " + x + ",y = " + y + "]");
}
void load() { // 선택된 대상을 태운다
}
void unload() { // 선택된 대상을 내린다.
}
}
----------------------
Marine[x= 100,y=200]
Tank[x = 100,y= 200]
Dropship[x = 100,y = 200]
'Java' 카테고리의 다른 글
Java - 컬렉션 프레임웍의 핵심 인터페이스 (0) | 2023.02.03 |
---|---|
Java - 인터페이스(interface) (0) | 2023.01.29 |
Java - 참조변수의 형변환 (0) | 2023.01.28 |
Java - 다형성(polymorphism) (0) | 2023.01.28 |
Java - super( ), super, 오버라이딩 (0) | 2023.01.25 |