계승

All lectures for KO purposes
레벨 1 , 레슨 1102
사용 가능

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에는 인터페이스의 다중 상속이 있습니다. 이렇게 하면 문제가 약간 완화됩니다. 나중에 인터페이스에 대해 이야기하겠지만 지금은 상속에 대해 계속 살펴보겠습니다.


코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION