아 이게 뭐임!

[객체지향] 의존성이 뭐임!!

마로가마따 2021. 7. 21. 08:11

프로그래밍에서 말하는

의존성 dependency은 무엇인가...!

 

 

일단 프로젝트를 설계한다는 것은  코드를 어떻게 배치할 것인가에 대한 의사결정과정이다.

 

어떤 클래스에 어떤 코드를 넣을 것이고 어떤 패키지에 어떤 코드를 넣을 것인지 설계 한다고 보면된다.

 

설계의 초점은 코드들을 변경에 의해 서로 같이 변경되는 것들을 모아두는 것이다.

 

 

 

이러한 변경의 핵심이 바로 의존성이다...! (그렇다...!!)

 

의존성이라는 것은 무엇인가! (이번엔 진짜임...!)

 

B가 바뀔때 A도 바뀔 수도 있을때 의존성이 있다고 표현한다. 즉, 변경에 의해 영향을 받는 것이 의존성이다.

 

여기서 A도 바뀔 수 있다고 표현했다. B에 대한 내부구현이 변경되더라도 A에 변경이 없을 수 있다는 뜻이다.

(변경에 영향을 받을 수도 있는 가능성...!)

 

의존성에는 여러가지 형태가 존재한다.

 

 

 

예시를 한번 봐보자!!

 

 

클래스 사이의 의존성 (A -> B)

- 연관관계

class A {
	private B b;
}

 

- 의존관계

class A {
	public B method(B b){
    	return new B();
    }
}

 

- 상속관계

class A extends B {
}

 

- 실체화 관계

class A implements B {
}

실체화 관계는 인터페이스를 implements하는 관계라고 이해하면 된다.

 

 

 

+ 여기서 상속관계와 실체화 관계의 차이는 

 

상속관계구현이 바꼈을때 영향을 받을 수 있는 것

 

실체화 관계인터페이스의 오퍼레이션 시그니처가 바꼈을때 영향을 받는 것 이다.

 

 

패키지 의존성

어떤 패키지 안에 있는 클래스가 다른 패키지 안에 있는 클래스에 무엇이 되었든 의존성이 있으면(위의  4가지 경우가 존재한다면) 두 패키지 간의 의존성이 있다.

 

쉽고 빠르게 패키지 의존성을 확인하는 방법은 클래스를 열어봤을때 다른 패키지가 import 되어있으면 의존성이 존재하는 것이다.

 

 

 

그리고 이러한 의존성을 관리하기 위한 권장되는 규칙이 있다.

 

 

의존성을 관리하기 위한 규칙

 

1. 양방향 의존성을 피해라

* 양방향 의존성이 있는 경우

class A {
	private B b;

	public void setA(B b){
		this.b = b;
		this.b.setA(this);
	}
}

class B {
	private A a;

	public void setA(A a){
		this.a = a;
	}
}

위의 코드를 보면 b가 바뀔때 a도 바뀌고 a가 바뀔때 b 도 바뀐다.

 

= 하나의 클래스인데 억지로 찢어놓은 것과 같다

 

 

* 단방향 의존성인 경우

class A{
	private B b;

	public void setA(B b){
		this.b = b;
	}
}

class B{
}

 

 

2. 다중성이 적은 방향을 선택해라

* 일대다 예제

class A{
	private Collection<B> bs;
}

class B{
}

 

list나 컬랙션, 셋 같은 것들을 인스턴스 변수로 가지면 다양한 이슈가 발생한다. (성능이슈라던가..)

 

 

* 다대일 예제

class A {
}

class B{
	private A a;
}

 

 

3. 의존성이 필요없다면  제거하라

* 단방향  의존성

class A {
	private B b;
}

class B {

}

 

 

* 의존성 없음

class A{

}

class B{

}

 

4. 패키지 사이의 의존성 사이클을 제거하라

 

패키지 사이에서는 양방향 의존성이 있으면 안된다.

 

양방향 의존성은 사이클로  표현될 수 있다.

 

양방향 의존성 사이클은 패키지 사이의 의존성을 따라갔을때 다시 원래 지점으로 돌아오는 경우를 말한다.


의존성 사이클이 생긴다는 것은 패키지들이 같이 바뀐다는 뜻이고 이는 바뀌는 패키지들이 하나의 패키지라는 뜻이다.

그래서 패키지 사이의 의존성 사이클이 생기는 상황을 피해야한다.

 

 

 

 

 

 

 

 

 

반응형

'아 이게 뭐임!' 카테고리의 다른 글

세션이 뭐임!!  (2) 2021.07.23
쿠키가 뭐임!!  (0) 2021.07.22
Globals Are Evil이 뭐임!!  (0) 2021.07.16
Gradle이 뭐임!  (0) 2021.07.15
CI/CD가 뭐임!  (0) 2021.07.14