클래스 간의 관계
연관 관계 (Association)
: 클래스들 간에 요구하는 행위를 사용하는 관계
집합관계는 연관관계의 특별한 경우라고 볼 수 있다.
클래스들이 개념성 서로 연결되어 있음을 나타낸다. 실선이나 화살표로 표시하며 보통은 한 클래스가 다른 클래스에서 제공하는 기능을 사용하는 상황일때 표시한다.
- 자바에서 클래스들 간의 연관관계는 함수 호출 형태로 구현한다.
- 호출하는 클래스의 특정 행위에서 연관관계를 갖는 다른 클래스의 특정 행위를 호출할 경우를 의미한다.
의존 관계 (dependency)
연관 관계와 같이 한 클래스가 다른 클래스에서 제공하는 기능을 사용할 때를 나타낸다.
차이점은 두 클래스의 관계가 한 메서드를 실행하는 동안과 같은, 매우 짧은 시간만 유지된다는 점이다.
연관관계와 의존 관계 차이
- 연관관계
클래스의 속성으로 다른 클래스를 참조하고 => 더 지속적인 관계
역할 이름은 연관관계 클래스의 객체들이 서로를 참조할 수 있는 속성의 이름으로 활용한다.
- 의존관계
연산의 인자로 참조
메서드의 지역 개체로 참조
Car 객체는 GasPump 객체를 아주 일시적으로 사용한다.
집합관계
전체와 부분의 관계
1. 집합관계 - 합성관계 ( Composition)
라이프타임이 의존적이다. == 부품 객체의 생성과 소멸은 복합 객체의 생성과 소멸을 따름. 즉, 생명 주기가 동일하다.
B가 A클래스의 멤버 변수로 존재하고, A 클래스의 생성자 내에서 B클래스를 초기화 하여 이용한다.
<구현1 _ 복합객체의 생성자에서 부품객체를 초기화하는 경우>
<구현2 - Inner class>
특징 : Inner class 는 outer class의 멤버에 접근이 가능하고, 캡슐화 및 정보 은닉에 용이하다.
생명 주기 : 내부 클래스의 인스턴스는 외부 클래스의 인스턴스에 종속적입니다. 즉, 외부 클래스의 인스턴스가 메모리에서 제거되면, 내부 클래스의 인스턴스도 더 이상 해당 외부 클래스 인스턴스를 참조할 수 없게 됩니다. (그러나 내부 클래스의 인스턴스 자체가 가비지 컬렉션의 대상이 되려면, 그 인스턴스를 참조하는 다른 참조들도 모두 제거되어야 합니다.)
// 외부 클래스 정의 public class OuterClass { private String outerField = "외부 클래스 필드"; // 비정적 내부 클래스 정의 class InnerClass { void display() { // 외부 클래스의 private 필드에 접근 System.out.println(outerField); } } public void initiateInnerClass() { // 내부 클래스의 인스턴스 생성 InnerClass inner = new InnerClass(); inner.display(); } } public class Main { public static void main(String[] args) { // 외부 클래스의 인스턴스를 생성 OuterClass outer = new OuterClass(); // 외부 클래스를 통해 내부 클래스의 인스턴스를 생성 및 메소드 호출 OuterClass.InnerClass inner = outer.new InnerClass(); inner.display(); // 또는 외부 클래스의 메소드를 통해 내부 클래스를 사용 outer.initiateInnerClass(); } } |
2. 집합관계 - 집약 관계 (Aggregation)
라이프 타임이 독립적이다. == 복합객체와 부품객체의 생명 주기가 서로 다른 관계
A 클래스의 생성자 매개변수로 B클래스의 객체가 들어와 멤버 변수에 바인딩 된다. 따라서 A 인스턴스가 사라진다고 해서 B 인스턴스가 사라지지 않는다.
일반화 관계(generation)
객체 지향 개념에서는 상속 관계라고 한다.
세부적인 클래스에서 공통 기능을 추출하여 수퍼클래스를 생성했을때,
이 수퍼 클래스는 나머지 클래스를 포함하는 상위 개념이다. 이를 IS-A 관계라고 하고 추상화 관점에서 자식 IS-A 부모 관계는 성립하지만, 부모 IS-A 자식은 성립하지 않는다. 즉 자식 클래스가 부모 클래스를 대체할 수 있지만, 부모 클래스가 자식 클래스를 대체할 수 없다는 말이다.
실체화 관계 (realization)
책임들의 집합인 인터페이스와 이 책임들을 실제로 실현한 클래스들 사이의 관계를 나타낸다.
어떤 공통되는 능력이 있는 것을 대표하는 관점이다.
[출처] 정인상, 채흥석, "JAVA 객체지향 디자인 패턴" , 한빛미디어 2014