ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (JAVA) 자바 추상 클래스(abstract class)
    JAVA/컨셉 , 예제 2018. 8. 24. 13:53

    추상 : 어떤 사물이 직접 경험하거나 지각할 수 있는 일정한 형태와 성질을 갖추고 있지 않은, 또는 그런 것이다. 포인트는 일정한 형태이다. 자바에서는 일정한 형태를 갖추면 완벽하게 구현되어 있지 않더라도 메소드나 클래스의 선언을 허용해주겠다는 것이다. 이때 사용하는 키워드가 abstract이다. 특징을 정리하면

    1. 추상 메소드가 포함되어 있다. (abstract 키워드 사용)
    2. 객체를 생성할 수 없다. (구현부분이 없는 메소드가 있기 때문)
    3. 다른 클래스에서 상속받아 사용한다. (extends 키워드 사용)

    package blog.naver.com; public abstract class CoffeeMachine { protected int atm = 9; public void espresso(){ // 모든 커피머신이 할 수 있는 일 System.out.println(atm + "기압으로 에스프레소를 추출합니다."); } public abstract void latte(); // 라떼 머신만 할 수 있는 일 에러는 추상적인지 아닌지 모른다. 따라서 abstract 키워드 붙여줌 // ** 인스턴스화 시킬 수 없다! 따라서 상속받는 클래스 만들어 객체화 }

     espresso() 메소드와 달리 latte 메소드는 중괄호 {}가 없다. 함수의 구체적인 구현 부분이 누락되어있는 것이다. 하지만 abstract 키워드가 이를 추상 메소드로 인식해 주고, 일정한 형태를 갖추고 있기 때문에 문법적으로 허용해 준다. 구현된 누락 부분은 이를 상속받는 클래스에서 반드시 이루어져야 한다. 추상메소드가 하나라도 있으면 클래스 또한 추상적 부분이 있는 것이기 때문에 abstract 키워드를 붙여야 하고, 추상 클래스로 변하게 된다. 보통 클래스와 추상 클래스의 가장 큰 차이점은 추상 클래스는 객체를 생성할 수 없다는 점이다. 메소드의 구현이 누락되어 있기 때문에 CoffeeMachine 객체를 생성해서 사용하고 싶어도 latte()는 구현조차 되어있지 않기 때문에 사용할 수 없다. 따라서 객체의 생성을 허락하지 않는 것이다. 따라서 상속받는 클래스에서 오버라이딩을 해야 한다.

    package blog.naver.com; public class LatteMachine extends CoffeeMachine { public LatteMachine() { // TODO Auto-generated constructor stub super.atm = 15; } @Override public void latte() { // TODO Auto-generated method stub System.out.println(atm + " 기압으로 라떼를 추출합니다."); } }

    CoffeeMachine을 상속받은 LatteMachine에서 latte 메소드를 재정의해 야 LatteMachine을 객체화 해 사용할 수 있다. 


Designed by Tistory.