본문 바로가기

JAVA/Java2021-2

추상클래스(abstract class) 구현하기

추상(abstract) <-> 구체적(concrete)

 

추상클래스란?

: 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스

- 추상메서드가 포함된 추상클래스는 인스턴스 생성이 불가하다 new 생성 불가

(아래의 예시에서 Desktop클래스와 MyLaptop클래스만 인스턴스 생성이 가능하다)

- 구현부가 다 있는 클래스를 abstract 키워드를 이용하여 추상클래스로 만들면 이 클래스는 상속만을 위한 클래스로 사용된다. 

메서드 선언 : 변환타입, 메서드이름, 매개변수로 구성

메서드 정의 : 메서드 구현(implementation)과 동일한 의미 구현부 body를 가짐

 

왜 추상메서드를 만드는가? 

공통으로 쓸 메서드는 구현

어떻게 쓸지 모르는 메서드는 추상메서드로 지정하고 하위 클래스에게 책임을 위임한다(상속받는 클래스가 구현) 

 

ex)

int add(int x, int y); //선언<-추상메서드 (구현부가 없기 때문에 추상적이다) 

추상클래스 : 추상메서드를 가진 클래스

abstract 예약어를 사용  

 

package Basic_Grammar.chap3_OOP.ch06_abstract;

public abstract class Computer {
    public abstract void display();
    public abstract void typing();

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

}
package Basic_Grammar.chap3_OOP.ch06_abstract;

public class Desktop extends Computer{

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

    @Override
    public void typing() {
        System.out.println("Desktop Typing");
    }
}

abstract 메서드 말고도 overriding할 수 있다. (상속받은 거니까)

package Basic_Grammar.chap3_OOP.ch06_abstract;

public abstract class Laptop extends Computer{
    @Override
    public void display() {
        System.out.println("Laptop display");
    }

}

abstract클래스의 abstract매서드를 다 구현하지 않았을 때 다시 abstract처리할 수 있다

package Basic_Grammar.chap3_OOP.ch06_abstract;

public class MyLaptop extends Laptop{
    @Override
    public void typing() {
        System.out.println("MyLaptop typing...");
    }
}
package Basic_Grammar.chap3_OOP.ch06_abstract;

public class ComputerTest {
    public static void main(String[] args) {
        Desktop desktop=new Desktop();
        MyLaptop myLaptop=new MyLaptop();
        desktop.display();
        desktop.typing();
        desktop.turnOff();
        myLaptop.display();
        myLaptop.turnOn();
    }
}