📚 참고
자바의 정석 기초편 (객체지향개념만)

 

 

 

 

 

 

 

 

 

 

추상 클래스 

 

  • 미완성 설계도 (미완성 메서드를 갖고 있는 클래스)

 

// 추상 클래스 (미완성 클래스)
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 리턴타입 메서드명();

 

 

 

 

 

  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 추상 메서드를 사용한다.
  • 자손 클래스가 추상 클래스를 상속 받을 때, 추상 메서드는 필수 기능이므로 반드시 구현해야하는 강제성이 있다. (추상 메서드를 구현하지 않으면 미완성 설계도임)
  • AbstractPlayer 클래스는 조상 클래스인 Player의 play 메서드 1개만 구현했으므로 미완성 설계도이다. 그러므로 abstract 키워드를 붙여준다.

 

class AudioPlayer extends Player {
    void play(int pos) { /* 내용 생략 */ }
    void stop() { /* 내용 생략 */ }
}

abstract class AbstractPlayer extends Player {
    void play(int pos) { /* 내용 생략 */ }
}

 

 

 

 

 

  • 추상 메서드호출이 가능하다. (메서드는 선언부만 알면 호출 가능이므로 추상 메서드도 호출 가능)

 

  1. 상속을 통해 자손이 추상 메서드를 완성
  2. 자손 클래스 타입의 객체 생성
  3. 객체 생성 후, 인스턴스 메서드 호출 가능

 

abstract class Player {
    // iv
    boolean pause;
    int currentPos;
    
    // 생성자
    Player() {
    	pause = false;
        currentPos = 0;
    }
    
    // 추상 메서드
    abstract void play(int pos);
    abstract void stop();
    
    // 인스턴스 메서드
    void play() {
        // 추상 메서드를 사용할 수 있다.
    	play(currentPos);
    }
}

 

 

 

 

 

 

 

추상 클래스 작성

 

  • 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 작성
  • 기존 클래스의 공통 부분을 뽑아서 추상 클래스를 만든다.
  • 추상화 (애매) 구체화 (명확)
    • 추상화된 코드는 구체화된 코드보다 유연 (변경에 유리)

 

// 구체적
GregorianCalendar cal = new GregorianCalendar();
// 추상적
// getInstance()는 Calendar의 자손 객체를 반환
Calendar cal = Calendar.getInstance();
public static Calendar getInstance(Locale aLocale) {
    return createCalendar(TimeZone.getDefault(), aLocale);
}

private static Calendar createCalendar(TimeZone zone, Locale aLocale) {
    // ...
    if (caltype != null) {
    	switch (caltype) {
        case "buddihist":	// 불교력
        	cal = new BuddhistCalendar(zone, aLocale);
            break;
        case "japanese":	// 일본력
        	cal = new JapaneseImperialCalendar(zone, aLocale);
            break;
        case "gregory":		// 서양력
        	cal = new GregorianCalendar(zone, aLocale);
            break;
        }
    }
}

 

 

 

 

 

 

 

 

 

 

'JAVA > 객체지향개념' 카테고리의 다른 글

인터페이스 (Interface)  (0) 2021.03.20
다형성 (Polymorphism)  (0) 2021.03.19
캡슐화💊  (0) 2021.03.19
접근 제어자 (Access Modifier)  (0) 2021.03.18
import문, static import문  (0) 2021.03.18