본문 바로가기

프로그래밍/Java

Java_객체지향언어(8)_추상 클래스, 추상 메서드

① 추상 클래스

: 추상 클래스란 쉽게 말해 미완성 설계도이다. 그렇기 때문에 객체 생성이 불가능한 클래스이다. 

  추상 클래스는 미완성 메서드(추상 메서드)를 포함하고 있는 클래스라는 뜻이다. 

 

- 추상 클래스 선언방법

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]