JAVA Programming for Beginners...

JAVA, 초보

추상클래스와 상속

 

추상클래스라는 abstract class 라는 선언 때문에 많이~ 당황하셨죠?

게다가 이 클래스는 인스턴스화 시킬수도 없다고 했으므로 더욱 당황스럽죠?

CardDeck hwaToo = new CardDeck(); 이렇게 쓸 수 없다는 말입니다.

이게 머죠? 도대체 어디에다가 쓰죠? 라는 궁금증이 생길 것입니다.

좋은 궁금증입니다.

바로 이 클래스는 일반적인 클래스입니다.

잘 생각해 봅시다.. 그냥 카드덱. 그냥 카드덱... 이것의 정체는 뭐죠? 그냥 카드덱...말입니다.

정체가 잘 떠오르지 않죠?

이 클래스는 그냥 형태만 갖추고 있는 클래스입니다.

일반적인 형태와 기능들 이죠...

이 클래스를 구체적으로 만드는 클래스를 새로 만듭니다. 여기에서 바로 상속의 개념이 등장합니다....

아주 중요합니다.

상속은 바로 is a관계를 나타냅니다..(더 좋은 설명이 있으면 좋겠는데...)

뭐뭐는 뭐뭐 이다 관계가 성립해야 합니다.

강아지는 개다..’ 되죠? ‘개는 동물이다되죠?

그런데 동물은 고양이다안되죠?

 ‘이름은 개다안되죠.... 이건 개는 이름을 가지고 있다가 되는거죠... 요런건 멤버변수로....(has a관계)

강아지는 개를 상속받고, 개는 동물을 상속받는다... 이건 됩니다. (확장한다..)

Puppy is a Dog, Dog is a Animal...

Puppy extends Dog, Dog extends Animal... 이 되는 거죠....

동물 그러면 일반적이지요?

개 그러면 조금 구체적이 됩니다...

강아지 그러면 아주 구체적이지요...

동물에는 개, 고양이, 독수리, 지렁이, 해파리 등등이 있습니다...

그러면 동물을 확장하는(상속받는) 여러 가지 개체가 등장하는 겁니다.

개에는 강아지, 로봇개, 투견, 사냥개 등등이 있습니다..

동물에는 동물의 일반적인 특성(가진것과 하는 것)을 넣고,

그 일반적인 동물의 속성을 물려받아 개라는 클래스를 만들어 개가 가진 특성을 넣고,

그 개를 물려받아 강아지 클래스를 만든다면,

강아지 클래스는 스스로 가진 것 외에도 개의 특성, 동물의 특성들을 사용할 수 있게 되는 겁니다...

~ 복잡하죠? 미뤄놨던 숙제를 이제야 하는 기분이네요... 미뤄놨던 이유를 알겠죠??

왜 이런게 필요할 까요..? 바로 객체가 가진 기능을 가장 독립적으로 만들어서 재사용 및 확장을 하기 위해서입니다.

하위 클래스는 상위 클래스의 기능을 모두 물려받는다..

물론 지난번에 언급했던 final이라는게 붙어있는 것은 못 물려받습니다..

이거 뭐~ 혼자서만 떠들고 있는 느낌인데요... 직접 해 봅시다...

화투20장을 가진 섯다카드는 일반적은 카드덱을 물려 받습니다...

  1. public class SutDaCard extends CardDeck{
  2. // 추상클래스인 CardDeck을 extends(확장) 상속 받아 SutDaCard라는 클래스를 만들었습니다...
  3. // 내용은 아무것도 없네요..
  4. }

 자 이렇게만 해도 SutDaCard클래스는 CardDeck의 기능을 모두 사용할 수 있습니다.

SutDaCard whatoo = new SutDaCard(); -> 생성자가 없으므로 기본 생성자를 생성해 준다고 얘기했었죠?

System.out.println(whatoo.size()); -> 당연하게도 0이 출력됩니다.

화투가 한 장도 없으니까요... SutDaCard클래스에는 아무것도 없습니다..

그런데도 .size()를 쓸 수 있네요...(CardDeck클래스에 정의되어 있기 때문입니다..)

SutDaCard를 구체화 시켜야 하겠죠....

물론 Card클래스와 CardDeck클래스도 조금씩 손볼 얘정입니다...

오늘은 여기까지!!! !! 모든 클래스는 기본적으로 Object클래스를 상속합니다.

! JavaAPI에서 Object클래스를 찾아보세요!! !!!

蛇足 : CardDeck클래스의 메소드를 살펴보면

public boolean add(Card one)

public void add(int index, Card one)

이렇게 같은 이름의 메소드가 존재합니다.

이렇게 인자의 형태나 개수, 혹은 리턴형이 다른 메소드가 같은이름으로 존재할 수 있습니다.

이런것을 메소드 오버로딩이라고 합니다.

무언가를 추가 하는 메소드별로 이름이 다르다면 헷갈리겠죠? 그냥 직관적으로 사용할 수 있도록 한 것입니다.

오버라이딩은 다음시간에... 천천히 갑시다!!!

댓글

댓글 본문