2018. 11. 10. 07:00ㆍJAVA
상속(Inheritance)
상속에 대해 배운지 2~3주 정도 되었지만, 계속 사용하지 못했었다.
변명을 하자면 자바에 익숙치 못해 자바를 공부하면서 꼭 한번 사용하겠다 다짐했었던 상속을 얼마 전에 되어서야 처음 사용하게 되었다.
상속
상속 Inheritance는 우리가 아는 상속과 같다. 부모가 혹은 할아버지, 할머니가 아니면 가족이 나에게 돈, 혹은 집, 하다 못해 강아지라도 물려주는 것을 우리는 간단히 상속이라고 알고있다.
자바에서의 상속도 뭐 비슷하다.
부모클래스가 있고, 자식클래스가 있다. 부모 클래스는 집을 가지고 있고, 차를 가지고있다. 그렇다면 자식 클래스는 부모 클래스가 가지고 있는 집 과 차를 상속 받으며 더불어 오토바이를 가질 수 있다.
그렇다면 부모와 자식이 공통으로 갖고 있는 집과 차를 제외한 자식이 갖고 있는 오토바이를 부모가 가질 수 있는 것인가? 그것은 안된다. 부모 클래스에서 메소드를 자식 클래스가 갖고 올 수 있지만 자식클래스에서 부모 클래스로는 가지고 갈 수 없다.
is a, has a
사실 상속을 언제 사용해야 할지, 언제 사용하지 말아야 할지 등을 이해하기 힘들 수 도 있다.
is a 는 해석을 하자면 무엇은 a이다. has a 는 무엇은 a를 가지고 있다로 해석이 되겠다.
그렇다면 has a 는 조합을 뜻하고 is a는 상속을 뜻한다고 한다.
사실 우리가 알고 있는 상속을 여기에 대입한다면 당연히 has a 가 상속이라고 생각하겠지만, 그렇지 않고 is a가 상속에 해당한다고 한다...
여기서 조합과 상속이 뭐가 다른지 이해하지 못할 수도 있는데, 나의 설명이 부족하니 이해 바란다.
상속에 대해 먼저 설명 한다면 부모클래스를 동물 animal(동물)로 할 수 있다. 그렇다면 dog(개)는 animal인가?
dog is animal. 맞다 개는 동물이다. 이런 경우 상속을 사용하는 것이다. 다른 예를 들어볼까?
triangle(삼각형) is figure(도형). 삼각형은 도형이다. 이것 도 맞는 말이다. 이런식으로 상속을 이해하면 좋겠다.
그렇다면 반대로 조합은 무엇인가?
동물들은 달릴 수 있다. 잠을 잘 수도 있고, 또... 음식을 먹을 수도 있다.
이런 행위들을 조합이라고 생각하면 좋을 것 같다. 아직 인터페이스에 대해 많이 공부하지 않았고, 적지 않아서 이 조합에 대해서는 다시 한번 적을 예정이다.
추상클래스(Abstract Class)
extends
상속에 대해서 조금은 배웠다. 그런데 자식클래스는 부모 클래스에게 어떻게 상속을 받을까? 사실 위의 추상클래스를 소개 하려고 한 것은 아니었지만 이 extends를 소개 할겸 부모 클래스가 추상클래스여서 같이 소개 하게되었다.
설명에 필요없는 메소드도 많고 코드도 개판이지만... 일단 자세히 보지 말고 맨위 클래스 이름을 보자. 클래스 이름 뒤에 extends AbstractFigures가 보이는가?
extends를 사용하여 부모 클래스에서 갖고 올 수 있는 것이다. 그러니 class line 과 triangle은 자식클래스 AbstractFigures는 부모클래스가 되는 것이다.
오버라이딩
위의 부모클래스 AbstractFigures의 getValue 또는 exponent 메소드는 자식클래스들에서 모두 사용된다. 그렇기 때문에 부모 클래스에서 메소드들을 만들고 자식클래스에서는 그 것을 가져 올 수 있다.
그리고 부모의 메소드가 맘에 안들어서 재정의 하고 싶다면 line 또는 triangle의 메소드에 있는 @Overide를 정의 한다음 그다음 내용을 바꾸면 된다.
요약)
1. 상속에는 부모클래스와 자식클래스가 있으며, 자식클래스에서 부모클래스의 내용을 갖고 올 수 있지만, 부모클래스에서 자식 클래스로 갖고 올 수는 없다.
2. is a는 상속 이고 has a는 조합이다.
3. 자식클래스가 되고 싶다면 extends를 이용하라.
4. 부모클래스의 메소드를 자식클래스가 바꾸고 싶다면 오버라이딩을 이용해라.
'JAVA' 카테고리의 다른 글
추상클래스와 인터페이스의 차이? (0) | 2019.04.07 |
---|---|
리플렉션 (0) | 2019.01.18 |
StringBuilder와 StringBuffer (0) | 2018.11.09 |
String (0) | 2018.11.05 |
생성자(constructor) (0) | 2018.11.05 |