"안녕하세요, 아미고! 흥미로운 새 주제가 있습니다."

"오늘은 매혹적인 주제의 날입니다!"

"왜, 고마워!"

"천만에요."

" 체스 말에 대한 모든 클래스를 단순화하기 위해 ChessItem 기본 클래스를 도입했던 때를 기억하십니까?"

"예."

"이제 각 조각에 조각을 화면에 렌더링하는 메서드가 있다고 상상해 보십시오. 메서드를 호출하면 조각이 현재 좌표에서 자체적으로 그려집니다. 이 메서드를 기본 클래스로 이동하는 것이 도움이 될까요?"

"예." 다형성에 대해 배운 후에는 유형에 관계없이 모든 조각에 대해 렌더링 메서드를 호출할 수 있습니다. 이 같은:"

예를 들어:
class ChessBoard
{
  public void drawAllChessItems()
  {
  //draw them regardless of their type.
  ArrayList <ChessItem> items = new ArrayList<ChessItem>();
  items.add(new King());
  items.add(new Queen());
  items.add(new Bishop());

  //draw them regardless of their type.
  for (ChessItem item: items)
  {
   item.draw();
  }
 }
}

"잘 했어. 맞아. 그러면 ChessItem 클래스 자체의 그리기 메서드로 무엇을 할 수 있을까?"

"모르겠어요. 체스에는 그런 조각이 없어요. 그리고 그것은 시각적 표현이 없다는 뜻입니다."

"맞습니다. 그리고 ChessItem 객체를 생성하는 것은 이치에 맞지 않습니다. 그런 체스 말은 없습니다. 단지 추상화일 뿐입니다 . 편의를 위해 만든 클래스 입니다. 이것이 OOP에서 추상화가 작동하는 방식입니다. 모든 조각별로) 데이터 및 메서드를 기본 클래스 로 통합했지만 특정 체스 조각에 해당하는 클래스에서 차이점을 유지했습니다."

Java에는 이를 위한 특수 클래스 유형인 추상 클래스가 있습니다 . 다음은 추상 클래스에 대해 기억해야 할 세 가지 사항입니다.

1) 추상 클래스는 메서드를 구현하지 않고 선언할 수 있습니다. 이러한 메소드를 추상 메소드라고 합니다.

예를 들어:
public abstract class ChessItem
{
 public int x, y; //coordinates
 private int value; //the piece's "value"

 public int getValue() //an ordinary method, returns value
 {
   return value;
 }

 public abstract void draw(); //abstract method. There is no implementation.

}

2) 추상 메서드는 키워드 abstract 로 표시됩니다 .

클래스에 추상 메서드가 하나만 있으면 해당 클래스도 abstract 로 표시됩니다 .

3) 추상 클래스의 개체를 만들 수 없습니다. 그렇게 하려는 코드는 단순히 컴파일되지 않습니다.

자바 코드 설명
ChessItem item = new ChessItem();
item.draw();
이 코드는 컴파일되지 않습니다.
ChessItem item = new Queen();
item.draw();
그러나 당신은 이것을 할 수 있습니다.

4) 클래스가 추상 클래스를 상속하는 경우 상속된 모든 추상 메서드를 재정의해야 합니다. 즉, 구현해야 합니다. 그렇지 않으면 클래스도 추상으로 선언해야 합니다. 클래스에 직접 선언되거나 부모 클래스에서 상속된 구현되지 않은 메서드가 하나라도 있는 경우 해당 클래스는 추상 클래스로 간주됩니다.

"하지만 이 모든 것이 필요한 이유는 무엇입니까? 추상 클래스가 필요한 이유는 무엇입니까? 일반 클래스를 대신 사용할 수 있지 않습니까? 그리고 추상 메서드 대신 여는 중괄호와 닫는 중괄호로 구성된 빈 구현을 만들 수는 없습니까?"

"할 수 있습니다. 그러나 이러한 제한은 수정자와 같습니다 private. 우리는 private수정자를 사용하여 의도적으로 데이터에 대한 직접 액세스를 차단하므로 다른 프로그래머와 클래스가 우리 public방법을 사용합니다."

추상 클래스에도 동일하게 적용됩니다. 클래스를 작성한 사람은 누구나 클래스의 인스턴스를 생성하는 것을 원하지 않습니다. 반대로 작성자는 자신의 추상 클래스의 추상 메서드가 상속되고 재정의되기를 기대합니다.

"나는 아직도 우리가 왜 우리의 삶을 이런 식으로 복잡하게 만들고 싶어하는지 이해할 수 없습니다."

"이 기능의 장점은 대규모 프로젝트에서 분명합니다. 클래스가 많을수록 역할을 더 명확하게 설명해야 합니다. 이 기능의 이점을 곧 알게 될 것입니다. 모두가 이 과정을 거쳐야 합니다."