자바(JAVA)는 모든 클래스들이 서로 관계를 맺고 있다.


이런 관계는 Has ~a관계와 Is ~a 관계로 크게 2개로 구분할 수 있다.





#has ~a관계


has ~a관계는 '~는 ~을 가지고 있다'라는 것을 의미한다.




노트북을 예시로 들어서 설명하자면, 


내가 사용하고 있는 노트북에는 여러기능들이 존재한다.


노트북음향을 조절하는 기능, 노트북화면의 밝기를 조정하는 기능들이 존재하는데,


내가 음향을 조절하는 기능을 이용하지 않는다고 가정해보자.


그럼 내 입장에서는 노트북에 굳이 음향을 조절하는 기능을 넣을 필요가 없는 것이다.


나와 같은 사람들이 많이 존재한다면, 


노트북 만드는 회사에서는 음향조절기능을 뺀 노트북과 음향조절기능이 있는 노트북을 둘다 만들어야 할까?


아니면 음향조절기능이 있는 노트북만 만들어야 할까?


정답은 후자, 음향조절기능이 있는 노트북만 만들어야 한다는 것이다.


왜냐하면, 음향조절기능을 가진 노트북은 


음향조절이 필요치 않은 사람과 음향조절이 필요한 사람 모두를 만족시키기 때문이다.


필요하지 않은 사람이 있다고 해서 그 기능을 뺀 제품을 만들 필요는 없다.


필요한 사람은 사용하면 되고, 필요하지 않은 사람은 사용하지 않으면 된다.


즉, 노트북을 만드는 회사는 모두에게 보편적으로 이용가능한 노트북을 생산해야 한다는 것이다.




다시 has ~a관계로 돌아와서 이야기 하자면, 


has ~a는 한 클래스 내부에서 외부에 정의된 클래스를 이용하는 관계이다.


외부에서 가져오는 클래스는 앞에서 설명했던 노트북과 같이 


어느 누가 가져와서 사용하든 보편적이여야 하며, 독립적으로 이용가능하여야 한다.


이러한 클래스를 Data Class라고 한다.


데이터 클래스(Data Class)는 말 그대로 데이터들만 담겨 있는 클래스로서,


클래스 내부에는 데이터와 외부에서 데이터를 접근할 수 있는 메소드들이 존재한다.




외부에서 클래스를 가져와 데이터의 입출력만 한다면 그것은 데이터 클래스이나,


클래스 내부의 데이터를 가지고 연산을 하고, 값을 처리하거나 출력하는 기능을 하게 된다면,


이는 데이터 클래스가 아닌 데이터들을 관리하는 데이터 관리 클래스가 된다.




has ~a관계는 데이터클래스와 데이터관리클래스로 나타낼 수 있다. 


<사용예시>








#Is ~a관계


Is ~a관계는 '~는 ~이다'라는 것을 의미하며, JAVA에서 상속이라고도 불린다.


상속이란, 한 클래스가 가진 모든 것을 다른 클래스에 물려주는 것이다. 


상속을 하는 클래스를 우리는 부모클래스, Super Class라고 부르며, 


상속을 받은 클래스를 자식클래스, Sub Class라고 부른다. 


Java에서는 모든 클래스들이 상속구조를 이루고 있기 때문에, 


맨 위로 올라가게 되면 모든 클래스의 최종 부모클래스가 존재하는데,


이를 최상위클래스라고 한다. 





상속을 이용할 경우, 가장 중요한 것은 Class간의 연관성이 존재해야 한다는 것이다.


pen이라는 클래스를 생성하고 water이라는 클래스를 생성했다고 가정해보자.


pen클래스와 water클래스 관계내에는 연관성이 존재하지 않는다. 


그렇기 때문에, 개발자가 pen클래스에서 사용하는 함수(메소드)를 이용하기 위해


water클래스에 pen클래스를 상속할 경우, 이는 Is ~a관계에 어긋나게 된다.


water이 pen일 수는 없다.




상속은 클래스명 옆에 extends 클래스명을 적게 되면 적혀진 클래스를 상속받게 되는데,


우리가 처음 클래스를 만들 경우에는 extends가 존재하지 않는다.


그러면 상속을 받지 않는 것일까?



정답은 아니다. 


모든 클래스는 생성과 동시에, 최상위 클래스인 Object클래스를 상속받게 된다.



코드상에서 상속을 받지 않는 것처럼 보이지만, 


사실은 이미 클래스가 만들어질때 부터 상속은 이루어진 것이다. 




[상속의 특징]


상속은 최상위 클래스에서 최하위자식클래스로 갈수록 추상화가 이루어진다.


추상화란 추상적인 개념을 구체화하는 행위를 의미한다. 


예시를 들어 설명을 하자면, 동물을 생각하면 무엇이 떠오르른가?


토끼, 인간, 양서류 등의 몇몇 단어들이 떠오르게 될 것이다.


이러한 단어들은 모두 동물이란 단어과 연관성이 있으며,


동물들을 구체적으로 설명하였다고 할 수 있다.


또한 토끼, 인간과 같은 단어들 속에서 동물만이 가질 수 있는 공통점들을 찾을 수 있을 것이다.


숨을 쉬고, 귀가 있다는 공통점들은 토끼와 인간 뿐만 아니라,


모든 동물들에게 해당될 수 있는 공통점이다.


이러한 공통점을 우리는 토끼를 명시할때나, 혹은 인간을 명시할때,


일일히 명시할 필요가 있을까?



공통점들만을 모아 부모클래스로 구성하여 상속관계를 맺는다면,


자식클래스는 이러한 공통점들을 가질 수 있으며, 자신만의 다른 점을 추가할 수 있다. 


즉, 다르게 말하면, 자식클래스 입장에서는 부모클래스의 공통점만으로 


자신을 완벽하게 표현 할 수 없다고 생각할 수 있다는 의미이다.


그렇기 때문에, 부모클래스의 공통점을 받고, 자신만의 특징을 추가하는 자식 클래스는 


부모클래스가 자신을 나타내는 것 보다 , 자신을 보다 추상화하고 있다고 할 수 있다.



'JAVA' 카테고리의 다른 글

IntelliJ 설치  (0) 2018.10.26
final  (0) 2018.01.19
cmd로 클래스 실행  (0) 2018.01.19
접근 지정자  (0) 2018.01.19
Class의 기본구조  (0) 2018.01.18

+ Recent posts