추상클래스
추상클래스란, 미완성 설계도에 비유할 수 있다. 이는 단지, 미완성 메소드(추상메소드)를 포함하고 있다는 의미이다. 추상클래스 자체는 클래스로서 역할은 못한다. 하지만, 새로운 클래스를 만들때 바탕이 되는 클래스이다. 기본적인 형태는 이와같이 abstract를 붙여 클래스를 선언해 주면 된다..
abstract class test1{
}
추상클래스는 일반 클래스와 다르지 않다 생성자도 있으며, 멤버변수, 메소드도 가질 수 있다.
추상 메소드
추상 메소드는 선언부만 작성하고, 구현부는 작성하지 않은채로 남겨둔 것이다. 실제 수행할 내용을 작성한게 아니기 때문에 미완성 메소드인것이다. 이를 만든 이유는, 상속받는 클래스에서 내용이 달라질 수 있기 때문이다. 선언부만 작성하고, 주석으로 어떤부분을 구현해야하는지 알려주는 것이다. 추상메소드도 동일하게 abstract키워드를 사용하여 메소드를 선언해준다. 그리고 선언부는 없으므로, ; 로 바로 선언부를 끝내준다. 추상클래스로부터 상속받는 자손클래스는 조상 클래스의 추상 메소드를 '모두' 구현해야한다. 하나라도 구현이 되지 않는다면, 해당 클래스 또한 추상 클래스로 지정해 주어야한다.
abstract class test1{
//재생하는 부분 구현
abstract void play();
//정지하는 부분 구현
abstract void pause();
}
추상 클래스 작성해보기.
우선 추상이라는 용어는 사전적으로 공통된 성질을 뽑아 이를 일반적인 개념으로 파악하는 정신작용이라는 뜻이 있다. 추상화라는 단어는, 클래스간 공통점을 찾아 공통의 조상을 만드는 작업이다. 추상화와 반대되는 용어로는 구체화가 있는데, 이는 상속을 통해 클래스를 구현, 확장하는 작업이라는 의미이다. 한번 추상 클래스를 작성해보자.
abstract class test1{
// 정지여부
private boolean pause;
//최근 위치
private int currentPos;
boolean getpause(){
return pause;
}
int getCurrentPos(){
return currentPos;
}
void setPause(){
this.pause = !this.pause;
}
void setCurrentPos(int currentPos){
this.currentPos = currentPos;
}
//생성자
test1(){
pause = false;
currentPos = 0;
}
//지정된 위치에서 재생하는 기능
abstract void play(int pos);
//재생을 멈추는 기능
abstract void stop();
void play(){
this.play(this.getCurrentPos());
}
void pause(){
if(pause){
this.setPause();
play(this.getCurrentPos());
}
else{
this.setPause();
stop();
}
}
}
이제 이 추상메소드를 조상으로 하는 CD플레이어를 작성해보자.
class CDPlayer extends test1{
void play(int pos){
// ++ 는 선언식 변수에만 적용이 되므로 ++ 대신 +1을 해주었다.
this.play();
System.out.println("Now playing");
}
void stop(){
this.pause();
System.out.println("Stopped");
}
}
또다른 추상 클래스와 추상클래스를 상속한 클래스들을 작성해 보자
abstract class Unit{
private int x;
private int y;
public void setX(int x){
this.x = x;
}
public void setY(int Y){
this.y = y;
}
abstract void move(int x, int y);
void stop(){
System.out.println("Stop");
}
}
class Marine extends Unit{
void move(int x, int y){
this.setX(x);
this.setY(y);
//other content
}
void steampack(){
System.out.println("Steampack");
}
}
class Tank extends Unit{
void move(int x, int y){
this.setX(x);
this.setY(y);
//other content
}
void changemode(){
System.out.println("Change Mode");
}
}
class Dropship extends Unit{
@Override
void move(int x, int y) {
this.setX(x);
this.setY(y);
//other content
}
void load(){
System.out.println("Load");
}
void unload(){
System.out.println("Unload");
}
}
마린, 탱크, 드랍쉽은 모두 이동하는 커맨드와 멈추는 커맨드,x,y좌표에 대해서는 공통적인 성질을 가지고 있어야한다. 그렇기 때문에 추상화를 통해 Unit이라는 추상클래스를 만들고 move라는 추상메소드를 상속받에 각 유닛에 대해, 알맞게끔 구현을 해주면 되는것이다. 그리고 이외 유닛별 특성에 따른 메소드는 각 클래스별로 구현을 해주는 것이다.
'Language > Java' 카테고리의 다른 글
[Java] 내부클래스 (0) | 2022.01.07 |
---|---|
[Java]인터페이스 (0) | 2022.01.07 |
[Java] 다형성(polymorphism) (0) | 2022.01.04 |
[Java]제어자 (0) | 2021.12.29 |
[Java]super (1) | 2021.12.28 |