abstract 키워드 - 추상 메서드와 추상 클래스

turtle601·2021년 4월 8일
1

추상 메서드(Abstract Method)를 간단하게 설명하면 선언부는 있는데 구현부가 없는 메서드를 말한다. 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스(Abstract Class)로 선언해야한다. 물론 추상 메서드 없이도 추상 클래스를 선언할 수는 있다. 그럼 이런 추상 메서드는 왜 필요하고 어떻게 쓰일 것인가??? 한번 살펴보자.

Driver.java

package abstractMethod01;

public class Driver{
	public static void main(String args[]){
    	동물[] 동물들 = new 동물[3];
        
        동물들[0] = new();
        동물들[1] = new 고양이();
        동물들[2] = new 강아지();
        
        for (int i = 0; i< 동물들.length; i++){
        	동물들[i].울어보세요();
        }
    }
}

쥐.java

package abstractMethod01;

public classextends 동물{
	void 울어보세요(){
    	System.out.println("나는 쥐! 찍!찍!");
    }
}

고양이.java

package abstractMethod01;

public class 고양이 extends 동물{
	void 울어보세요(){
    	System.out.println("나는 고양이! 야옹!야옹!");
    }
}

강아지.java

package abstractMethod01;

public class 강아지 extends 동물{
	void 울어보세요(){
    	System.out.println("나는 강아지! 멍!멍!");
    }
}

동물.java

package abstractMethod01;

public class 동물{
	void 울어보세요(){
    	System.out.println("나는 동물, 어떻게 울어야 하나요?");
    }
}

동물 클래스 인스턴스는 어떻게 울어야 하는 걸까? 소리내어 울게 하는 것 자체가 논리에 맞지 않다. 그렇다고 동물 클래스의 객체 멤버 메서드인 울어보세요() 메서드의 몸체를 비워 두는 것도 이상하다. 동물 타입의 참조 변수를 통해 하위 클래스이 인스턴스가 가진 울어보세요() 메서드를 호출하고 있으니 상위 클래스인 동물의 울어보세요() 메서드는 반드시 존재해야 한다.

그런데 실수로 동물 클래스의 인스턴스를 만들고 그렇게 만들어진 동물 객체의 울어보세요() 메서드를 호출하면 남감해진다. 이런 경우 추상 메서드를 사용하게 된다.

예시)

동물.java

package abstractMethod02;

public abstract class 동물{
	abstract void 울어보세요();
}

Driver.java

package abstractMethod01;

public class Driver{
   public static void main(String args[]){
   	동물[] 동물들 = new 동물[3];
       
       동물들[0] = new();
       동물들[1] = new 고양이();
       동물들[2] = new 강아지();
       
       for (int i = 0; i< 동물들.length; i++){
       	동물들[i].울어보세요();
       }
       
   // 동물 짐승 = new 동물();    
   }
}

동물 객체를 생성하는 new 동물()이 있는 줄에 주석을 제외하면 오류가 발생한다.

그 이유는

  1. 동물 객체는 어떻게 울지 모른다는 사실
  2. 동물 참조 변수 배열로 모든 동물을 울게 하려면 하위 클래스에서 오버라이딩할 울어보세요() 메서드가 동물 클래스에 필요하다.

정리

  • 추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. 즉, new 생성자를 사용할 수 없다.

  • 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다. 오버라이딩

  • 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.

profile
Programmer

0개의 댓글