"안녕하세요, 아미고! 이제 많이 사용하시게 될 주제입니다. 상속에 대해 이야기하고 있습니다. "

초보자에게 프로그래밍은 마법과도 같습니다. 비유부터 시작하겠습니다…

당신이 날아다니는 말을 만들고 싶어하는 마술사라고 가정해 봅시다. 페가수스 요술을 시도할 수 있습니다. 하지만 날아다니는 말은 자연적으로 발생하는 것이 아니기 때문에 정말 힘든 시간을 보내게 될 것입니다. 당신은 할 일이 많을 것입니다. 말로 시작하고 날개를 소환하는 것이 훨씬 쉬울 것입니다.

계승.  상속의 장점 - 1

프로그래밍에서는 이 프로세스를 «상속»이라고 합니다 . 매우 복잡한 클래스를 작성해야 한다고 가정합니다. 처음부터 코드를 작성하는 데 오랜 시간을 할애한 다음 긴 테스트를 수행하여 버그를 찾을 수 있습니다. 하지만 왜 어려운 방법으로합니까? 찾고 있는 클래스가 이미 존재하는지 둘러보고 확인하는 것이 더 낫겠죠?

필요한 기능의 80%를 구현하는 클래스를 찾았다고 가정해 보겠습니다. 해당 코드를 클래스에 복사하기만 하면 됩니다. 그러나 다음과 같은 몇 가지 단점이 있습니다.

1) 찾은 클래스가 이미 바이트코드로 컴파일되었을 수 있습니다. 소스 코드에 대한 액세스 권한이 없을 수 있습니다.

2) 수업용 소스코드를 가지고 있을 수도 있지만 남의 코드 6줄만 써도 몇십억씩 소송당할 수 있는 회사에 다니고 있을 수도 있습니다. 그리고 그들은 당신을 고소할 것입니다.

3) 이로 인해 많은 코드가 불필요하게 중복됩니다. 그리고 다른 클래스의 작성자가 버그를 찾아 수정하면 여전히 버그가 있습니다.

원래 클래스의 코드에 대한 법적 권한을 얻을 필요가 없는 보다 우아한 솔루션이 있습니다. Java에서는 단순히 다른 클래스를 클래스의 부모로 선언할 수 있습니다. 이는 해당 클래스의 코드를 자신의 클래스에 추가하는 것과 같습니다. 부모 클래스의 모든 데이터와 메서드가 클래스에 나타납니다. 예를 들어 «말»을 상속하고 «날개»를 추가하여 «페가수스»를 얻을 수 있습니다.

계승.  상속의 장점 - 2

"아주 흥미롭군. 계속해."

"상속에는 다른 용도도 있습니다. 매우 유사한 10개의 클래스가 있다고 가정합니다. 일치하는 데이터와 메서드가 있습니다. 특수 기본 클래스를 생성 하고 데이터(및 관련 메서드)를 기본 클래스 로 이동 하고 해당 10개의 클래스를 가질 수 있습니다. 즉, 각 클래스에 대해 기본 클래스라고도 하는 상위 클래스가 있음을 나타냅니다."

"추상화의 이점이 캡슐화와 관련하여 진정으로 드러나는 것처럼 상속의 이점은 다형성에 의해 확대됩니다. 하지만 그것에 대해서는 내일 말씀드리겠습니다. 오늘은 상속의 몇 가지 예를 살펴보겠습니다."

"체스 프로그램을 작성한다고 가정해 봅시다. 체스 조각에 대한 클래스가 필요합니다. 어떤 클래스를 제안하시겠습니까, 아미고?"

"킹, 퀸, 비숍, 나이트, 룩, 폰."

"아주 좋아. 하나도 빠뜨리지 않았어."

"그러면 이 클래스에 어떤 데이터를 저장할 것을 제안하시겠습니까?"

"각 조각의 보드 위치(x 및 y) 및 가치. 결국 일부 조각은 다른 조각보다 더 가치가 있습니다."

"그러면 이 두 클래스의 차이점은 무엇입니까?"

"그들은 조각을 움직이는 방법이 다릅니다. 행동이 다릅니다."

"예. 다음과 같이 클래스로 정의할 수 있습니다."

class King
{
int x;
int y;
int worth;
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen
{
int x;
int y;
int worth;
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook
{
int x;
int y;
int worth;
void rookMove()
{
//code that defines,
//how the rook moves
}
}
class Knight
{
int x;
int y;
int worth;
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop
{
int x;
int y;
int worth;
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn
{
int x;
int y;
int worth;
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

"예, 정확히 그렇게 쓸 것입니다."

"하지만 상속을 사용하여 더 적은 코드를 작성할 수 있는 방법을 살펴보십시오. 동일한 메서드와 데이터를 공통 클래스로 이동할 수 있습니다. ChessItem이라고 부르겠습니다. ChessItem 개체를 만드는 것은 이치에 맞지 않습니다. 체스 조각. 하지만 수업이 매우 도움이 될 것입니다."

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

"얼마나 흥미로운가!"

"물론이죠! 수천 개의 서로 다른 개체와 수백 개의 클래스가 포함된 프로젝트에서 이점이 특히 큽니다. 이 경우 적절하게 선택된 클래스는 논리를 상당히 단순화할 수 있을 뿐만 아니라 필요한 코드를 10분의 1로 줄일 수 있습니다."

"그래서 클래스를 상속하려면 어떻게 해야 합니까?"

"클래스를 선언한 후 키워드 ' extends '를 사용하고 그 뒤에 부모 클래스의 이름을 사용합니다. 하나의 클래스에서만 상속할 수 있습니다. "

계승.  상속의 장점 - 3

그림은 «돼지»에서 물려받은 "소"를 보여줍니다. «돼지»는 «닭»에서 상속되고 «닭»은 «계란»에서 상속됩니다. 각 클래스에는 부모가 한 명뿐입니다! 이러한 상속이 항상 논리적인 것은 아닙니다. 돼지만 있는데 정말로 소가 필요한 경우 프로그래머는 종종 «돼지»에서 «소»를 만들고자 하는 욕구를 억제할 수 없습니다.

"그런데 두 개의 클래스를 상속받고 싶다면 어떻게 해야 할까요? 제가 할 수 있는 일이 있을까요?!"

"그렇지 않습니다. Java 클래스는 구현의 다중 상속을 지원하지 않습니다. 클래스는 단일 상위 클래스만 가질 수 있습니다. 그러나 유형의 다중 상속이 있으므로 클래스가 둘 이상의 인터페이스를 구현할 수 있습니다. 이것은 문제를 약간 완화합니다. "

"알겠습니다. 그러면 인터페이스가 무엇입니까?"

"내일 인터페이스에 대해 말씀드리겠습니다. 지금은 계속해서 상속에 대해 알아보겠습니다."