카테고리 없음

객체지향 프로그래밍 13. 추상클래스

코딩펭귄 2023. 12. 15. 02:29

 

추상클래스

 

  • 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스
  • 추상클래스 = 상속을 하기위해 만든 클래스
  • 메서드 선언(declaration) : 반환타입, 메서드 이름, 매개변수로 구성
  • 메서드 정의(definition) : 메서드 구현(implementation)과 동일한 의미 구현부(body) 를 가짐 ({ })
  • 예) int add(int x, int y); // 구현부{}가 없음-선언 : 추상메서드
       int add(int x, int y){ } // 구현부가 있음, 추상 메서드 아님
  • abstract 예약어를 사용
  • 추상 클래스는 new 할 수 없음 ( 인스턴스화 할 수 없음 )

 

 

추상클래스 구현

 

  • 메서드에 구현 코드가 없으면 abstract 로 선언
  • 도식도에 이텔릭체로 표현됨
  • abstract로 선언된 메서드를 가진 클래스는 abstract로 선언
  • 모든 메서드가 구현 된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없음
  • 추상 클래스의 추상 메서드는 하위 클래스가 상속 하여 구현
  • 추상 클래스 내의 추상 메서드 : 하위 클래스가 구현해야 하는 메서드
  • 추상 클래스 내의 구현 된 메서드 : 하위 클래스가 공통으로 사용하는 메서드 ( 필요에 따라 하위 클래스에서 재정의 함 )

예제

package ch2_9;

// 이 클래스는 상속을 위한 abstract(추상)클래스이다!
public abstract class  Computer {

    //display, typing은 추상클래스.
    // 이 클래스에서 구현하지 않을것이므로 public 이 아닌, abstract로 씀
    // 공통메소드가 아닌 , 구현하지 못한 이 부분은 추상메소드로 놓고,
    // 하위클래스에 책임을 위임한다 = 나는 구현하지 않을테니, 상속받는 애들이 알아서 구현해라!
    abstract void display();
    abstract void typing();


    // 컴퓨터는 공통으로 쓸 아래 두개의 메소드만 구현해 놓음
    public void turnOn() {
        System.out.println("전원을 켭니다.");
    }

    public void turnOff() {
        System.out.println("전원을 끕니다.");
    }
}
package ch2_9;

//Computer의 상속을 받음
public class DeskTop extends Computer{

    @Override
    void display() {
        System.out.println("DeskTop display");
    }

    @Override
    void typing() {
        System.out.println("DeskTop typing");
    }

    @Override
    public void turnOff() { //상위클래스에서 구현해놨지만, 하위클래스에서 기능 재정의 할 수 있음
        System.out.println("Desktop turnoff");
    }
}
package ch2_9;

public abstract class NoteBook extends Computer{ //2개 구현해야하지만 하나만 구현했으므로 abstract
    @Override
    public void display() {
        System.out.println("NoteBook display");
    }
}
package ch2_9;

public class MyNoteBook extends NoteBook {
    @Override
    public void typing() {
        System.out.println("NoteBook typing");
    }
}
package ch2_9;

public class ComputerTest {

    public static void main(String[] args) {
        Computer desktop = new DeskTop();
        desktop.display();
//        Computer computer = new Computer(); - 오류남. Computer가 추상클래스이기 때문
//        computer.turnOff();

        NoteBook myNote = new MyNoteBook();
    }
}