괴발나라

연관 관계와 의존 관계의 차이 본문

도서/JAVA 객체지향 디자인패턴

연관 관계와 의존 관계의 차이

괴발맨 2022. 2. 1. 14:00

객체 지향 시스템 안에서는 여러 클래스들이 서로 긴밀한 관계를 맺으며 기능을 수행한다.

클래스들은 다양한 방법으로 다른 클래스들과 관계를 맺는다.
이 관계들의 종류에는 여러가지가 있는데,
이번에는 비슷하면서도 다른 연관 관계의존 관계의 차이에 대해서 설명한다.

연관관계와 의존관계의 공통점


이 두 관계는 모두 한 클래스가 다른 클래스의 기능을 사용할 때를 나타낸다.
이해가 잘 되지 않는다면, 실세계의 예시를 통해 이해해보자!

당신은 친구에게 문자를 보내고 싶다.
친구에게 문자를 보내려면 핸드폰을 사용해야 한다.
구체적으로는 핸드폰의 문자 전송 기능을 사용해야 한다.
당신은 핸드폰과 연관관계 혹은 의존관계를 맺는 것이다.

당신이 친구에게 문자를 보내는 상황을 코드로 작성하면 다음과 같을 것이다.

// 당신
class Person {
    private Phone phone;

    public Person(Phone phone) {
        this.phone = phone;
    }

       public void sendMessage() {
        String to = "내 친구";
        String message = "야, 놀자";

        this.phone.sendMessage(to, message) // 핸드폰의 문자 전송 기능 사용
    }
}

// 핸드폰
class Phone {
    public void sendMessage(String to, String message) {
        // 문자 메시지 전송 기능...
    }
}

Person 클래스는 Phone 클래스의 기능을 이용하고 있다.
이쯤되면 충분히 이해가 될거라고 생각한다.
그러면 이번엔 연관관계에 대하여 알아보자.\

연관관계와 의존관계의 차이점


연관관계의존관계 의 차이점은 관계의 유지 기간에 있다.

무슨 말이냐면,
연관 관계는 오랫동안 지속되는 관계고,
의존 관계는 짧은 시간동만 만 지속되는 관계라는 것이다.

얼마동안 관계가 지속된다는 것이 무슨 개소리일까?
나도 처음엔 헷갈렸다.

위의 Person 클래스와 Phone 클래스의 코드를 다시 한번 살펴보자.
Person 클래스의 생성자를 통해 Phone 클래스의 객체를 전달하면,
phone 속성이 그 객체를 참조하게 된다.
그렇기 때문에 phone 속성을 의도적으로 null 로 바꾸지 않는 이상
Person 클래스의 객체는 참조하고 있는 Phone 객체의 기능을 언제든지 사용할 수 있다.

두 클래스의 관계가 오랫동안 유지되고 있는 것이다.
이를 연관관계라고 한다

당신이 어떤 핸드폰과 연관관계를 맺으면,
친구에게 문자메시지를 보낼 때, 매번 같은 핸드폰의 기능을 사용한다.


하지만 Person 클래스의 코드를 다음과 같이 바꾸면 어떨까?

class Person {
    public void sendMessage(Phone phone) {
        String to = "내 친구";
        String message = "야, 꺼져";

           phone.sendMessage(to, message)
    }
}

이전과 달리 생성자가 아닌 sendMessage 메서드에 Phone 클래스의 객체를 넘겨준다.
이렇게 되면 sendMessage 메서드가 실행되는 동안만 전달받은 Phone 객체와 관계가 맺어지는 것이다.
이를 의존관계라고 한다.

당신이 어떤 핸드폰과 의존관계를 맺으면,
다른 핸드폰으로 바꿔가며 문자메시지를 보낼 수 있다.


다시 정리하자면, 연관관계는 두 클래스의 관계가 오랫동안 유지되는 관계이고,
의존관계는 두 클래스의 관계가 짧은 시간동만 유지되는 관계이다.
\

클래스 다이어그램에서의 표기


연관관계

  • 표기 : 연관관계는 위와 같이 실선으로 표기한다, 관계가 양방향일 경우, 화살표를 생략한다.
  • 관계명 : 관계의 이름이 명확할 경우에 생략할 수 있다. ex) "문자를 전송한다."
  • 속성 혹은 역할 : 관계 안에서의 클래스의 역할을 표시한다. 이는 속성명이기도 하다. ex) "- phone"
  • 다중성 : 관계에 맺어져야 할 객체의 수를 나타낸다. ex) "1" : 엄밀히 한개, "1..* " : 하나 이상

의존관계

  • 표기 : 의존관계는 위와 같이 점선으로 표기한다, 관계가 양방향일 경우, 화살표를 생략한다.
  • 관계명 : 관계의 이름이 명확할 경우에 생략할 수 있다. ex) "문자를 전송한다."
  • 속성 혹은 역할 : 관계 안에서의 클래스의 역할을 표시한다. 이는 속성명이기도 하다. ex) "- phone"
  • 다중성 : 관계에 맺어져야 할 객체의 수를 나타낸다. ex) "1" : 엄밀히 한개, "1..* " : 하나 이상

결론


연관관계와 의존관계는 한 클래스가 다른 클래스의 기능을 사용하는 관계라는 면에서는 동일하나,
그 관계의 유지기간에서 차이가 있다.

연관관계는 두 클래스 간의 관계가 오랫동안 유지되고,
의존관계는 두 클래스 간의 관계가 비교적 짧은 기간 동안만 유지된다.