1. 공통 기본 클래스

오늘 우리는 흥미로운 주제의 뷔페를 즐길 것입니다. 체스 기물을 나타내는 모든 클래스를 단순화하기 위해 기본 클래스를 도입했을 때를 기억하십니까 ? 그러길 바랍니다 🙂ChessItem

draw()이제 각 조각에 화면에 그리는 작업을 처리하는 메서드가 있다고 상상해 보십시오 . 메서드 를 호출하면 draw()조각이 현재 좌표에 그려집니다. 이 메서드를 기본 클래스로 옮기는 것이 편리할 것입니다.

draw()메서드가 ChessItem 기본 클래스에 있는 경우 조각 클래스에서 재정의하고 다음과 같은 우아한 코드를 작성할 수 있습니다.

class ChessBoard
{
   public void drawAllChessItems()
   {
      // Add the pieces to the list
      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우리는 코드를 크게 단순화할 수 있었습니다. 각 클래스의 메서드를 별도로 호출할 필요가 없고 모든 개체를 단일 컬렉션에 쉽게 저장할 수 있습니다.

그러나 여기에 흥미로운 질문이 있습니다. 클래스 draw()에서 직접 선언된 메서드는 ChessItem화면에 무엇을 그려야 합니까? 결국 체스에는 그런 말이 없기 때문에 그릴 것이 없습니다.

맞습니다. 게다가 ChessItem객체를 직접 생성하는 것은 의미가 없습니다. 그것은 체스 조각이 아니라 우리의 편의를 위해 만든 클래스인 추상화 일 뿐입니다. 이것이 OOP 에서 추상화가 작동하는 방식 입니다. 중요한 데이터와 메서드(모든 부분이 공유하는 것)를 기본 클래스로 이동하고 차이점을 별도의 하위 클래스에 유지합니다.


2. 추상 클래스

추상 클래스

이러한 상황을 위해 Java에는 추상 클래스 라는 특별한 종류의 클래스가 있습니다 . 프로그래머가 유사한 클래스로 더 쉽게 작업하고 중복 코드의 양을 줄일 수 있도록 설계되었습니다.

다음은 추상 클래스에 대해 알아야 할 세 가지 사항입니다.

구현이 없는 방법

추상 클래스는 구현 없이 메소드 선언을 가질 수 있습니다. 이것이 바로 메서드를 추상화하는 것입니다. 메서드 본문은 단순히 세미콜론으로 대체됩니다. 그리고 메서드 이름 앞에 키워드를 씁니다 abstract. 예:

public abstract class ChessItem
{
   public int x, y; // Coordinates
   private int value; // The piece's value
   public int getValue() // Ordinary method that returns value field
   {
      return value;
   }

   public abstract void draw(); // Abstract method. The implementation is missing.
}

추상 클래스

구현이 없는 각 메서드는 abstract 키워드로 표시됩니다. 클래스에 추상 메서드가 하나라도 있으면 해당 클래스도 키워드로 표시됩니다 abstract.

객체 생성 금지

추상 클래스 의 개체를 만들 수 없습니다 . 이러한 코드는 단순히 컴파일되지 않습니다.

암호 설명
ChessItem item = new ChessItem();
item.draw();
이 코드는 컴파일되지 않습니다 .
ChessItem item = new Queen();
item.draw();
하지만 당신은 할 수 있습니다

추상 클래스 상속

클래스가 추상 클래스를 상속하는 경우 상속된 모든 추상 메서드를 재정의해야 합니다. 즉, 이에 대한 구현을 작성해야 합니다. 그렇지 않으면 클래스 자체도 추상으로 선언해야 합니다.

클래스 에 직접 선언되거나 부모 클래스에서 상속된 구현되지 않은 메서드가 하나라도 있는 경우 해당 클래스는 추상 클래스로 간주됩니다.

이 모든 것이 필요한 이유는 무엇입니까? 추상 클래스가 필요한 이유는 무엇입니까? 대신 일반 것을 사용할 수 없습니까? 그리고 추상 메서드 대신 메서드 본문으로 두 개의 빈 중괄호를 작성할 수 없습니까?

우리는 할 수 있습니다. 그러나 이러한 제한은 수정자와 유사합니다 private. 우리는 private 키워드를 사용하여 다른 프로그래머가 데이터에 직접 액세스하는 것을 의도적으로 방지하고 클래스를 작성할 때 공용 메서드만 사용하도록 합니다.

추상 클래스도 마찬가지입니다. 추상 클래스의 작성자는 클래스의 개체가 생성되는 것을 원하지 않습니다. 대신 작성자는 추상 메서드가 추상 클래스에서 상속된 다음 재정의되기를 기대합니다.

이 접근 방식의 이점은 대규모 프로젝트에서 쉽게 알 수 있습니다. 클래스가 많을수록 역할을 더 명확하게 설명해야 합니다. 가까운 장래에 이 접근 방식의 이점을 확인할 수 있습니다. 모든 일이 이것을 겪습니다.