1. 페가수스

OOP 의 세 번째 원칙 인 상속 에 대해 자세히 살펴보겠습니다 . 이것은 당신이 자주 사용하게 될 매우 흥미로운 주제입니다. 초보자에게 프로그래밍은 마법과 구별할 수 없습니다. 흥미로운 비유부터 시작하겠습니다...;

당신이 날아다니는 말을 만들고 싶어하는 마법사라고 가정해 봅시다. 한편으로는 페가수스 요술을 시도할 수 있습니다. 그러나 페가시가 자연에 존재하지 않기 때문에 이것은 매우 어려울 것입니다. 당신은 스스로 많은 일을해야합니다. 말을 타고 날개를 만드는 것이 훨씬 쉽습니다.

프로그래밍에서는 이 프로세스를 "상속"이라고 합니다. 매우 복잡한 클래스를 작성해야 한다고 가정합니다. 처음부터 코드를 작성하고 오류를 찾기 위해 오랜 시간 동안 모든 것을 테스트하는 데 오랜 시간이 걸립니다. 왜 힘든 길을 가나? 그러한 클래스가 이미 존재하는지 확인하는 것이 좋습니다.

필요한 기능의 80%를 구현하는 메서드가 있는 클래스를 찾았다고 가정합니다. 다음에는 그것으로 무엇을 합니까? 코드를 클래스에 복사하기만 하면 됩니다. 그러나이 솔루션에는 몇 가지 단점이 있습니다.

  1. 찾은 클래스가 이미 바이트코드로 컴파일되어 소스 코드에 액세스하지 못할 수 있습니다.
  2. 클래스의 소스 코드가 공개되어 있지만, 당신은 다른 사람의 코드 6줄만 사용해도 20억 달러의 소송을 당할 수 있는 회사에서 일하고 있습니다. 그러면 고용주가 당신을 고소할 것입니다.
  3. 많은 양의 코드를 불필요하게 복제합니다. 또한 외부 클래스의 작성자가 버그를 찾아 수정하면 여전히 버그가 있습니다.

더 우아한 솔루션이 있으며 원래 클래스의 코드에 합법적으로 액세스할 필요가 없습니다. Java에서는 해당 클래스를 클래스의 부모로 간단히 선언할 수 있습니다. 이는 해당 클래스의 코드를 자신의 코드에 추가하는 것과 같습니다. 클래스는 부모 클래스의 모든 데이터와 모든 메서드를 볼 수 있습니다. 예를 들어 다음과 같이 할 수 있습니다. "말"을 상속한 다음 "날개"를 추가하여 "페가수스"를 얻습니다.


2. 공통 기본 클래스

상속은 다른 용도로도 사용할 수 있습니다. 매우 유사한 10개의 클래스가 있다고 가정해 보겠습니다. 그들은 동일한 데이터와 방법을 가지고 있습니다. 특수 기본 클래스를 만들고 데이터(및 관련 메서드)를 이 기본 클래스로 이동하고 이 10개의 클래스를 자손으로 선언할 수 있습니다. 즉, 각 클래스에서 상위 클래스가 이 기본 클래스임을 나타냅니다.

추상화의 이점이 측면 캡슐화를 통해서만 드러나는 것처럼 다형성을 사용할 때 상속의 이점도 훨씬 향상됩니다. 그러나 그것에 대해서는 조금 후에 배우게 될 것입니다. 오늘 우리는 상속을 사용하는 몇 가지 예를 살펴볼 것입니다.

체스 말

인간 사용자와 체스를 두는 프로그램을 작성한다고 가정합니다. 따라서 조각을 나타내는 클래스가 필요합니다. 어떤 수업이 될까요?

체스를 해본 적이 있다면 확실한 대답은 King, Queen, Bishop, Knight, Rook 및 Pawn입니다.

그러나 클래스 자체는 여전히 각 부분에 대한 정보를 저장해야 합니다. 예를 들어 x 및 y 좌표와 조각 값입니다. 결국 어떤 조각은 다른 조각보다 더 가치가 있습니다.

또한 조각이 다르게 이동하므로 클래스가 다른 동작을 구현합니다. 클래스로 정의하는 방법은 다음과 같습니다.

class King
{
   int x;
   int y;
   int worth;

   void kingMove()
   {
     // Code that decides
     // how to move
     // the king
   }
}
class Queen
{
   int x;
   int y;
   int worth;

   void queenMove()
   {
     // Code that decides
     // how to move
     // the queen
   }
}
class Rook
{
   int x;
   int y;
   int worth;

   void rookMove()
   {
     // Code that decides
     // how to move
     // the rook
   }
}
class Knight
{
   int x;
   int y;
   int worth;

   void knightMove()
   {
     // Code that decides
     // how to move
     // the knight
   }
}
class Bishop
{
   int x;
   int y;
   int worth;

   void bishopMove()
   {
     // Code that decides
     // how to move
     // the bishop
   }
}
class Pawn
{
   int x;
   int y;
   int worth;

   void pawnMove()
   {
     // Code that decides
     // how to move
     // the pawn
   }
}

이것은 체스 말에 대한 매우 원시적인 설명입니다.

공통 기본 클래스

다음은 상속을 사용하여 코드 양을 줄이는 방법입니다. 공통 메서드와 데이터를 공통 클래스로 가져올 수 있습니다. 우리는 그것을 부를 것입니다 ChessItem. 클래스가 어떤 체스 말에도 해당하지 않기 때문에 의 개체를ChessItem class 만드는 데 아무런 의미가 없습니다 . 즉, 이 수업은 매우 유용할 것입니다.

class King extends ChessItem
{
   void kingMove()
   {
     // Code that decides
     // how to move the king
   }
}
class Queen extends ChessItem
{
   void queenMove()
   {
     // Code that decides
     // how to move the queen
   }
}
class Rook extends ChessItem
{
   void rookMove()
   {
     // Code that decides
     // how to move the rook
   }
}
class ChessItem
{
   int x;
   int y;
   int worth;
}
class Knight extends ChessItem
{
   void knightMove()
   {
     // Code that decides
     // how to move the knight
   }
}
class Bishop extends ChessItem
{
   void bishopMove()
   {
     // Code that decides
     // how to move the bishop
   }
}
class Pawn extends ChessItem
{
   void pawnMove()
   {
     // Code that decides
     // how to move the pawn
   }
}

이는 유사한 개체에 대한 코드를 단순화하는 좋은 방법입니다. 이점은 프로젝트에 수천 개의 서로 다른 개체와 수백 개의 클래스가 있을 때 특히 두드러집니다. 따라서 적절하게 선택된 상위(기본) 클래스를 사용하면 논리를 크게 단순화할 뿐만 아니라 코드를 10배로 줄일 수 있습니다.


3. 클래스 상속 —extends

클래스를 상속하려면 무엇이 필요합니까? extends한 클래스가 다른 클래스를 상속받기 위해서는 자식 클래스 선언 뒤에 키워드를 쓰고 부모 클래스의 이름을 적어야 합니다 . 일반적으로 다음과 같이 보입니다.

class Descendant extends Parent

이것은 Descendant 클래스를 선언할 때 작성해야 하는 것입니다. 그런데 클래스는 하나의 클래스만 상속할 수 있습니다.

그림에서 우리는 돼지를 물려받은 소, 닭을 물려받은 닭, 알을 물려받은 것을 봅니다. 오직 한 부모! 이러한 상속이 항상 논리적인 것은 아닙니다. 그러나 당신이 가진 것이라고는 돼지뿐이고 정말로 소가 필요할 때 프로그래머들은 종종 돼지로 소를 만들고 싶은 충동을 억제할 수 없습니다.

Java에는 다중 상속이 없습니다. 클래스는 두 클래스를 상속할 수 없습니다. 각 클래스에는 하나의 상위 클래스만 있을 수 있습니다. 상위 클래스가 지정되지 않은 경우 상위 클래스는 입니다 Object.

즉, Java에는 인터페이스의 다중 상속이 있습니다. 이렇게 하면 문제가 약간 완화됩니다. 나중에 인터페이스에 대해 이야기하겠지만 지금은 상속에 대해 계속 살펴보겠습니다.