자바의 정석 - 추상 클래스, 추상 메서드

Yohan·2024년 1월 23일
0

추상 클래스

  • 미완성 설계도, 미완성 메서드를 갖고 있는 클래스
abstract class Player { // 추상클래스(미완성 클래스)
	abstract void play(int pos); // 추상메서드(몸통{}이 없는 미완성 메서드)
    abstract void stop(); // 추상메서드
}
  • 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가.
Player p = new Player(); // 에러. 추상 클래스의 인스턴스 생성불가
  • 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
class AudioPlayer extends Player {
	void play(int pos) {} // 추상메서드 구현
    void stop {} // 추상메서드 구현
}
  • 완성된 설계도 (추상메서드를 구현하게 된 이후)
AudioPlayer ap = new AudioPlayer(); // 인스턴스 생성 ok

추상 메서드

  • 미완성 메서드, 구현부(몸통 {}가 없는 메서드)가 없는 메서드
    -> 상속을 통해 구현
abstract 리턴타입 메서드이름();
  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
abstract class Player { // 추상클래스
	abstract void play(int pos); // 추상메서드
    abstract void stop(); // 추상메서드
}

class AudioPlayer extends Player { 
	void play(int pos) { } // 자손을 통해 추상메서드 구현
    void stop() { } // 자손을 통해 추상메서드 구현
}

// 2개중 1개만 구현했기 때문에 여전히 미완성 설계도 이므로 abstract가 들어가야함 (abstract가 없을 시 에러 발생)
abstract class AbstractPlayer extends Player {
	void play(int pos) { } // 추상메서드 구현
}
  • 추상 메서드 호출 가능 (호출할 때는 선언부만 필요, 구현부 필요 X)
abstract class Player { // 추상 클래스
	boolean pause;	// 일시정지 상태를 저장하기 위한 변수
    int currentPos; // 현재 Play되고 있는 위치를 저장하기 위한 변수
    
    Player() {		// 추상 클래스도 생성자가 있어야 한다.
    	pause = false;
        currentPos = 0;
    }
    
    abstract void play(int pos); // 추상메서드
    abstract void stop(); // 추상메서드
    
    void Play() {   // 인스턴스 메서드 (상속을 통해 추상메서드를 모두 구현하면 인스턴스 생성이 가능 -> 인스턴스 메서드 사용가능)
    	play(currentPos); // 추상 메서드 사용 가능
    }
}
  • 추상클래스는 상속을 통해 추상메서드를 구현해야 인스턴스 생성가능

abstract class Player { // 추상 클래스 (미완성 설계도)
    abstract void play(int pos); // 추상 메서드 (미완성 메서드)
    abstract void stop(); // 추상 메서드 (선언부만 있고 구현부{}가 없는 메서드)
}

// 추상 클래스는 상속을 통해 완성해야 객체 생성가능
// 추상메서드가 2개면 2개다 구현 해야됨
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(); // 추상 클래스의 객체를 생성
        // AudioPlayer ap = new AudioPlayer();
        Player ap = new AudioPlayer(); // 다형성, 위 코드와 동일한 결과
        ap.play(100);
        ap.stop();
    }
}

정리

  • 추상클래스
    • 미완성 설계도, 미완성 메서드를 갖고 있는 클래스
    • 다른 클래스에 도움을 주기 위한 것, 인스턴스 생성 불가
      -> 단, 상속을 통해 추상 메서드를 구현하면 인스턴스 생성가능 (가지고 있는 모든 추상메서드를 구현해야 완성된 설계도, 일부만 구현하게 되면 미완성 설계도이므로 abstract를 붙여야함)
  • 추상 메서드
    • 미완성 메서드, 구현부(몸통 {}가 없는 메서드)가 없는 메서드
      -> 상속을 통해 구현
    • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우 사용
      -> 예를 들어 hp,mp는 몬스터마다 다르기 때문에 다르게 구현
    • 추상 메서드 호출 가능 (호출은 구현부 필요 x)
profile
백엔드 개발자

0개의 댓글