3. 상속 (부모님께 물려받기)
처음부터 다 짜지 말고 부모님의 코드를 그대로 물려받아 재활용해 볼까요?
비슷한 클래스를 또 만들어야 할 땐 처음부터 다시 쓰지 말고, 부모님의 기능을 그대로 물려받으세요! (상속)
이때는 [부모]를 바탕으로를 사용하고, 부모님의 코드를 가져올 땐 부모 키워드를 씁니다.
[동물]을 설계하자:
'이름'을 [문자열]인 "이름없음"으로 정하자
처음 만들어질 때 ([문자열]인 '새이름') 다음과 같이 하자:
'나'의 '이름'을 '새이름'으로 정하자
<울기>를 만들자 ():
"동물이 웁니다."를 출력하자
(참고) 동물을 바탕으로 강아지를 설계해요!
[동물]을 바탕으로 [강아지]를 설계하자:
처음 만들어질 때 ([문자열]인 '새이름') 다음과 같이 하자:
부모의 <처음 만들어질 때>('새이름')을 실행하자
<울기>를 만들자 ():
틀"{'나'의 '이름'}: 멍멍!"을 출력하자
'바둑이'를 [강아지]인 새로운 [강아지]("바둑이")로 정하자
'바둑이'의 <울기>()를 실행하자
보시다시피 부모의 <울기> 대신 강아지만의 <울기>가 실행되었죠? 이를 **덮어쓰기(Overriding)**라고 한답니다.
부모의 기능은 그대로 두면서 내 입맛에 맞게 고쳐 쓸 수 있어요!
누구의 자식인지 확인하기
어떤 객체가 특정 클래스에서 만들어졌는지, 혹은 그 부모의 자식인지 궁금할 땐 일종이다를 사용해 보세요.
[동물]을 설계하자:
'이름'을 [문자열]인 "이름없음"으로 정하자
처음 만들어질 때 ([문자열]인 '새이름') 다음과 같이 하자:
'나'의 '이름'을 '새이름'으로 정하자
<울기>를 만들자 ():
"동물이 웁니다."를 출력하자
[동물]을 바탕으로 [강아지]를 설계하자:
처음 만들어질 때 ([문자열]인 '새이름') 다음과 같이 하자:
부모의 <처음 만들어질 때>('새이름')을 실행하자
<울기>를 만들자 ():
틀"{'나'의 '이름'}: 멍멍!"을 출력하자
'테스트'를 [강아지]인 새로운 [강아지]("멍멍이")로 정하자
만약 ('테스트'가 [강아지]의 일종이다) 라면:
"이 객체는 강아지입니다!"를 출력하자
만약 ('테스트'가 [동물]의 일종이다) 라면:
"강아지는 동물이기도 하죠!"를 출력하자
강아지는 동물을 바탕으로 만들어졌기 때문에, [강아지]의 일종이기도 하고 [동물]의 일종이기도 해요!
추상 클래스 (뼈대만 먼저 밑설계하기)
자식들이 공통으로 쓸 기능은 미리 만들어두고, **“이 기능은 자식들이 각자 알아서 꼭 만들어야 해!”**라고 강제하고 싶을 때가 있죠?
그럴 땐 설계하자 대신 밑설계하자를 써서 추상 클래스를 만들어 보세요. 추상 클래스는 직접 객체로 만들 수 없고, 오직 다른 클래스의 바탕이 되기 위해서만 존재한답니다. 자식이 꼭 만들어야 하는 기능은 있어야 한다로 규칙만 정해줘요!
[모양]을 밑설계하자:
'색상'을 [문자열]인 "파랑"으로 정하자
(참고: 구현부가 없는 추상 메서드는 '있어야 한다'로 선언해요)
<면적구하기>가 있어야 한다 ()
[모양]을 바탕으로 [네모]를 설계하자:
'가로'를 [숫자]인 0으로 정하자
'세로'를 [숫자]인 0으로 정하자
처음 만들어질 때 ([숫자]인 '초기가로', [숫자]인 '초기세로') 다음과 같이 하자:
'나'의 '가로'를 '초기가로'로 정하자
'나'의 '세로'를 '초기세로'로 정하자
(참고: 부모가 지시한 메서드를 꼭 만들어야 해요!)
[숫자]를 돌려주는 <면적구하기>를 만들자 ():
('나'의 '가로' * '나'의 '세로')를 돌려주자
'내네모'를 [네모]인 새로운 [네모](10, 20)으로 정하자
틀"네모의 면적은 {'내네모'의 <면적구하기>()}입니다."를 출력하자
만약 자식 클래스에서 <면적구하기>를 만들지 않으면, 하리가 깐깐하게 에러를 내며 알려줄 거예요!