① 추상 클래스
: 추상 클래스란 쉽게 말해 미완성 설계도이다. 그렇기 때문에 객체 생성이 불가능한 클래스이다.
추상 클래스는 미완성 메서드(추상 메서드)를 포함하고 있는 클래스라는 뜻이다.
- 추상 클래스 선언방법
abstract class 클래스이름 {
...
}
② 추상 메서드
: 추상 메서드란 미완성 메서드 즉 구현부{}가 없는 메서드이다.
→ 이와 같이 미완성 상태로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문이다.
- 추상 메서드 선언방법
//주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다.
abstract 리턴타입 메서드이름();
- 추상 클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해주어야 한다. 추상메서드 중 하나라도 구현하지 않는다면, 자손클래스 역시 추상클래스로 지정해주어야 한다.
abstract class Player {
abstract void play(int pos);
abstract void stop();
}
class AudioPlayer extends Player { //AudioPlayer=완성된 설계도, Player=미완성 설계도
void play(int pos) { /*내용생략*/ } //추상메서드 구현
void stop() { /*내용생략*/ } //추상메서드 구현
}
abstract class AbstractPlayer extends Player {
//클래스 앞에 abstract를 붙여줘서 추상메서드 하나만 구현 가능.
void play(int pos) { /*내용생략*/ } //추상메서드 구현
}
③ 추상클래스의 작성
: 추상클래스는 상속을 통해 완성해야 객체 생성이 가능하다.
- 추상클래스의 장점
: 여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속할 수도 있다. 그렇기 때문에 코드 관리가 쉽다.
class Marine {
int x, y;
void move(int x, int y) { //지정된 위치로 이동 }
void stop() {}
void stimPack() {}
}
class Tank {
int x, y;
void move(int x, int y) { //지정된 위치로 이동 }
void stop() {}
void changeMode() {}
}
class Dropship {
int x, y;
void move(int x, int y) { //지정된 위치로 이동 }
void stop() {}
void load() {}
void unload() {}
}
→ void move메서드와 void stop메서드와 같이 선언부는 일치하고 몸통{}이 불일치 할 때 추상 클래스와 추상 메서드를 이용하면 코드 관리가 쉬워진다.
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){}
void stimPack(){}
}
class Tank extends Unit{
void move(int x, int y){}
void changeMode(){}
}
class Dropship extends Unit{
void move(int x, int y){}
void load(){}
void unload(){}
}
→ 각 클래스의 공통부분을 뽑아내서 Unit클래스를 저어의하고 상속받도록 하였다. 이 Unit클래스는 다른 유닛을 위한 클래스를 작성하는데 재활용될 수 있을 것이다.
- 추상클래스 예제
public class JavaJungsuk_basic_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);
}
}
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 extendds 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_예외처리(1)_try-catch문 (0) | 2022.11.27 |
---|---|
Java_객체지향언어(9)_인터페이스 (0) | 2022.11.27 |
Java_객체지향언어(7)_instanceof연산자, 매개변수의 다형성, 객체배열 (0) | 2022.11.17 |
Java_객체지향언어(6)_다형성, 참조변수의 형변환 (0) | 2022.11.15 |
Java_객체지향언어(5)_참조변수 super, 생성자 super(), 제어자와 접근제어자 (0) | 2022.11.09 |