클래스는 객체지향 프로그래밍에서 중요한 개념이다.
클래스의 Has-a, Is-a 관계에 대해 알아보자.
1. HAS-A (포함) 관계
HAS-A는 포함관계를 의미한다. ( ~는 ~을 가지고 있다.)
다른 클래스의 기능(변수 혹은 메서드)을 받아들여 사용한다. (ex강사님이 펜을 사용해 칠판을 적는 것)
- 받아들인 객체의 자원(메소드/변수)을 사용할 수 있다.
- 어떤 클래스 A가 또 다른 클래스인 B가 가진 기능을 사용하고 싶을때 B 클래스를 포함하면 B 클래스의
기능을 사용할 수 있다.
2. IS-A (상속) 관계
IS-A는 말 그대로 'A는 B이다' 와 같다.
클래스의 상속은 IS-A관계에서 사용하는 것이 가장 효율적이다.
ex) 경찰차는 차다.
트럭은 차다.
버스는 차다.
즉, 추상화한 클래스를 구체화하는 상황에서 상속을 사용한다.
상속을 사용하면 많은 장점이 있지만, 하위 클래스가 상위 클래스에 종속되기 때문에 IS-A관계가 아닌 클래스에서는 상속을 사용하지 않는 것이 좋다.
상속을 사용하면 클래스간 결합도가 높아져 상위 클래스를 수정해야 할 때 하위 클래스에 미치는 영향이 크다. 단순히 코드를 줄이기 위해 서로 관련 없는 클래스를 상속 관계로 사용하는 것은 좋지 않다.
3. HAS-A vs IS-A ?
IS-A 관계를 통해 생성된 클래스 및 객체는 상속 관계에서 둘은 밀접하게 결합되므로 부모 또는 기저 클래스의 명세에 변경이 발생하면 코드가 손상될 위험이 있습니다. 대신에 이러한 밀접한 관계는 클래스 계층구조에서 좀 더 안정적인 기반을 마련한다는 의미이기도 합니다. 게다가 상위 클래스의 기능을 하위 클래스가 물려받아 사용할 수 있는 장점도 있습니다.
반면 HAS-A 방식으로 생성된 클래스 및 객체는 느슨하게 결합됩니다. 이는 상속에 비해서 명세에 변경이 발생하더라도 구성 요소를 쉽게 변경할 수 있다는 의미입니다(코드의 손상이 적거나 없다는 의미입니다). 이러한 점에서 더 많은 유연성을 제공합니다. 하지만, HAS-A 방식은 상속보다 항상 낫다고 말할 정도로 단순한 문제가 아니며 실상은 더 복잡합니다.
결론 : 객체의 결합도와 응집도를 고려하여 클래스의 관계를 설계한다.
모듈의 독립성은 모듈의 결합도(Coupling)과 응집도(Cohesion)로 측정한다.
결론적으로는 모듈의 독립성을 높이기 위해서는 모듈 간의 상호 의존 정도를 나타내는 결합도를 낮추고 모듈이
독립적으로 자체 기능만을 수행하도록 응집도를 높여야 한다.
* 객체를 만들 때 쓸 사람을 정해놓고 쓰는 것은 안좋은 코딩이다.
* 객체를 만들 때는 항상 독립적으로 만들어야 한다. (=결합도가 낮아야한다.)
* 객체를 쓰는 사람은 다 쓸 수 있게 만들어야 한다.
* 항상 데이터 클래스를 독립적으로 만들고 데이터 관리클래스에서 관리한다.
참고 블로그 :
'Java > 자바 이론' 카테고리의 다른 글
[Java] 자바 super 키워드 & super() 메서드 (0) | 2022.06.30 |
---|---|
[Java] 자바 클래스 상속의 장점과 특징 (2) | 2022.06.30 |
[Java] 클래스 내부 구성 요소 3가지 (필드, 생성자, 메서드 + This) (0) | 2022.06.27 |
[Java] String 객체 특징 ( ==와 equals의 차이점 ) (1) | 2022.06.23 |
[Java] 자바 메모리 영역 Static, Stack, Heap (4) | 2022.06.23 |