추상 클래스

김설영·2022년 4월 1일
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.
Player 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() { /* 내용 생략 */ }			// 추상메서드 구현
}

abstract class AbstractPlayer extends Player {
	void play(int pos) { /* 내용 생략 */ }	// 추상 메서드 1개만 구현
    // 조상으로부터 물려받은 추상메서드를 2개 다 구현을 해줘야 하는데, 
    // 1개만 구현했기 때문에 클래스에 abstract가 붙어야 함
}
  • 추상 메서드 호출 가능 (호출할 때에는 선언부만 필요)
abstract class Player {
	// iv
    boolean pause;
    int currentPos;
    
    Player() {	// 추상 클래스도 생성자가 있어야 한다.
    	pause = false;
        currentPos = 0;
    }
    
    /** 지정된 위치(pos)에서 재생을 시작하는 기능이 수행하도록 작성되어야 한다.*/
    abstract void play(int pos);	// 추상메서드
    /** 재생을 즉시 멈추는 기능을 수행하도록 작성되어야 한다. */
    abstract void stop();	// 추상메서드
   
    void play() {	// 상속을 통해, 클래스가 완성되어야 호출 가능
    	play(currentPos);	// 추상 메서드를 사용할 수 있다.
    }
}
  • 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성하거나, 기존 클래스의 공통 부분을 뽑아서 추상 클래스를 만든다.
// 공통 부분을 뽑아내서 추상클래스로 정의한다 -> 코드 중복 제거 및 간결화
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() { /*선택된 대상을 내린다*/ }
}
  • 추상화 클래스의 장점
    1. 코드의 관리가 용이
    2. 새로운 자손 클래스를 쉽게 작성
    3. 추상클래스를 단계별로 만들 경우, 추상클래스 구체화 가능 (상속 관계로 여러개)
    4. 추상클래스를 단계별로 만들 경우, 중간 단계의 클래스를 선택하는 등의 다양한 선택 가능

  • 추상화 <--> 구체화
    추상화된 코드는 구체화된 코드보다 유연하기 때문에, 변경에 유리하다.

profile
블로그 이동하였습니당! -> https://kimsy8979.tistory.com/

0개의 댓글