예제를 통해 배워보는 추상클래스&추상메서드

코코·2023년 8월 21일
0

JAVA

목록 보기
3/4
post-thumbnail
abstract class Player {             // 추상 클래스(미완성 클래스)
    abstract void play(int pos);    // 추상 메서드
    abstract void stop();           // 추상 메서드
}

// 추상 클래스는 상속을 통해 완성해야 객체 생성가능
class AudioPlayer extends Player {
    void play(int pos) {
        System.out.println(pos + "위치부터 play합니다.");
    };

    void stop() {
        System.out.println("재생을 멈춥니다.");
    }
}

public class PlayerTest {
    public static void main(String[] args) {
        // Player p = new Player(); 
        // 추상클래스의 객체를 생성
        // -> 에러발생. why? Player 클래스는
        // 미완성 클래스이기에 객체생성 X

        AudioPlayer ap = new AudioPlayer(); 
        // AudioPlayer 클래스에서
		// 구현부가 없는 추상 메서드인 void play()와 
        // void stop()을 재정의(Override) 해주었기 때문에 
        // 객체 생성 가능!
        
        Player p = new AudioPlayer();  // 다형성
        // Player는 리모컨, AudioPlayer와 연결되어 있다.
        // Player는 추상 클래스이기 때문에 
        // play, stop 버튼만 있지 사용할 수는 없다.
        // 하지만 Player를 상속 받은 AudioPlyaer는 
        // 내용이 완성된 메서드를 가진 완전한 클래스이다.
        // 따라서 AudioPlayer 클래스 안에 있는 
        // 재정의된 play, stop 메서드를 통해 실행된다.

        ap.play(100);
        ap.stop();

    }
}
public class Ex7_10 {
	// 공통된 부분을 찾아 추상클래스를 만들어준다.
    // Marine, Tank, Dropship은 공통적으로 움직이는 기능을 가지고 있다.
    // Unit이라는 추상클래스에 void move()를 추상메서드로 만들어서 넣어주었다.
    public static void main(String[] args) {
        Unit[] group = { new Marine(), new Tank(), new Dropship() };
        // Unit[] group = new Unit[3];

        for (int i = 0; i < group.length; i++)
            group[i].move(100, 200);
            // 이제 반복문을 통해 Unit을 상속받는 자손 클래스인
            // Marine, Tank, Dropship에서 미완성 메서드인
            // move() 메서드를 구현하면
            // 메인 메서드를 실행시켰을 때 각각의 자손 클래스에
            // 공통으로 있는 move() 메서드가 실행된다.
            // 추상클래스 Unit의 추상 메서드 void move()가 아니라
            // 각 자손클래스에 있는 void move()가 실행되는 것임을
            // 꼭 기억하자!
    }
}

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() { /* 유닛을 내린다. */ }
}
profile
Just Do It

0개의 댓글