카테고리 없음

클래스 간의 관계

kimphoby 2024. 4. 21. 02:06

 

연관 관계 (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