오랜만에 객체 지향이 무엇인가 리마인드해볼 수 있는 기회가 있어 해당 포스트를 작성하게 되었다.
IS-A와 HAS-A에 대하여 설명하기 앞서 객체 지향에 대하여 간단히 짚어볼 필요가 있다. 객체 지향이 무엇일까?
객체를 다루는 프로그래밍, 객체에 역할을 부여하고 객체간의 관계를 통한 상호작용하는 프로그래핑, 등등 다양하게 말하지만 객체라는 용어 자체가 생소한 사람들에게 객체 지향을 보통 이렇게 설명한다.
실세계를 표현하기 위한 프로그래밍 기법
실세계를 모델링하는 만큼 실세계에서의 존재, 즉, 객체간의 관계를 정의하는데 그 것이 IS-A와 HAS-A 관계이다.
IS-A는 “~는 ~이다” 라는 것이고 HAS-A는 “~는 ~을 가지고 있다”는 것이다. 객체 지향 언어에서 이것을 표현하기 위하여 상속이라는 개념과 멤버라는 개념을 도입하여 구현하였다.
IS-A는 상속으로 표현한다. 고양이 객체가 동물 객체를 상속한다면, “고양이 IS-A 동물”이라 표현하는 것이다. 사람 객체가 동물 객체를 상속한다면 “사람 IS-A 동물”이라 표현하는 것이다.
그리고 멤버라는 개념을 통하여 객체는 무엇인가 가질 수 있다. 자동차 객체가 타이어 객체를 멤버로 들고 있으면 “자동차 HAS-A 타이어”라 표현하는 것이다. 사람 객체가 핸드폰 객체를 멤버로 가지고 있으면 “사람 HAS-A 핸드폰”이라 표현하는 것이다.
요약하자면 IS-A는 상속이고 HAS-A는 조합, 합성이다.
객체 지향에서 실세게를 모델링한다고는 하지만 실제 유형물만 모델링하는 것은 아니다. 개념적인 무형의 것도 객체로서 다루게 되는데, 그러면서 상속의 경계가 모호할 때가 있다. 그러면 객체 설계시 개념적인 객체 상속의 모호함을 핑계로 코드 재사용성과 편의를 위하여 상속을 사용하는 경우가 있다. 하지만 이것은 지양해야 하는데, 상속은 강한 결합을 유발하기 때문이다. 즉, 하나를 고치면 나비효과마냥 여기저기 고쳐야할 데가 많아진다는 이야기이다.
객체지향의 사실과 오해
https://zangzangs.tistory.com/44