객체지향 방식으로 하나의 프로그램을 개발할 때 보통 여러개의 클래스를 정의하게 되는데 이들 클래스와 객체는 상호 독립적으로 존재하지 않는다. 클래스 관계는 상속(inheritance, is-a)관계와 구체화(realization)관계 두 가지로 구분되며, 객체 간 관계는 크게 사용(use-a)관계와 포함(has-a)관계로 구분된다.
객체지향에서 상속은 계층적 분류 개념을 지원해준다. 예를 들어 진돗개는 개의 한 종류이고, 개는 애완동물의 한종류이다. 이처럼 기존 클래스를 이용하여 is-a 관계가 성립하는 특수화(specialization)된 새 클래스를 정의할 수 있으며, 이때 새 클래스는 기존 클래스를 상속 받는다고 말한다. 즉, 학생은 사람을 상속받아 정의할 수 있다. 이때 학생은 사람의 자식 클래스가 되며, 사람은 학생의 부모 클래스가 된다.
구체화 : 한 클래스가 특정 interface를 구현한 경우를 말한다.
interface는 메소드만 선언되어 있음으로 코드 재사용 없이 그룹핑하는 역할만 해준다.
앞서 클래스 간 관계를 상속과 구체화로 구분하였지만 이 구분은 자바에 적용되는 개념이고, 실제 객체지향에서는 클래스 간 관계를 subclassing과 subtyping으로 구분한다.
한 클래스의 상태와 행위의 구현을 재사용하는 것
외부 모습만 재사용하는 것을 말한다
특히, B가 A의 subtype이면 A 타입을 기대하는 어느 곳이나 B 타입의 객체를 안전하게 사용할 수 있어야 한다. 이것을 대체가능성(substitutability)이라 한다.
Subclassing을 하면 subtyping의 효과를 얻을 수 있지만 언어마다 subclassing과 subtyping을 제공하는 방법에 따라 subclassing을 하면서 subtyping을 얻을 수 없는 경우도 많다. 특히 subclassing을 하였지만 논리적으로 subtyping이 성립하지 않는 경우가 많다. 자바의 상속은 명백하게 subclassing이며, 구체화는 subtyping에 해당한다. 또 자바에서 상속을 하면 물리적 subtyping도 제공된다. 즉, B 클래스가 A 클래스의 자식 클래스이면 B 클래스 객체를 A 클래스의 객체를 요구하는 위치에 언제든지 문법적 오류 없이 사용할 수 있다. 하지만 앞서 언급한 바와 같이 논리적으로는 그렇게 사용하는 것이 적절하지 않을 수 있다.
한 객체가 그것의 행위를 수행하기 위해 다른 객체를 사용하는 경우를 사용 관계
포함 관계는 객체가 다른 객체를 멤버 변수로 유지하는 경우를 말한다.