먹고 기도하고 코딩하라

클래스 간 관계 : 연관 vs 의존 vs 집합 vs 구성 본문

번역

클래스 간 관계 : 연관 vs 의존 vs 집합 vs 구성

사과먹는사람 2022. 12. 4. 00:24
728x90
728x90

 

* 이 글은 Niraj Bhatt의 Assocation vs. Dependecy vs. Aggregation vs. Composition 글을 간단하게 한국어로 정리한 글입니다. 원본 전문은 링크를 참고해주세요.

 

 

(1) 연관(Association) 관계

두 클래스 간 레퍼런스에 기반한 관계. Player 클래스가 클래스 레벨에서 Asset 클래스를 레퍼런스로 잡고 있는 경우를 생각해보자. 연관 관계는 클래스 간 방향을 나타내는 화살표로 나타낼 수 있다. 화살표가 양방향이라면 연관 관계 역시 양방향인 것이다.

class Asset { ... }

class Player {
	Asset asset;
	public Player(Asset purchasedAsset) { ... } /*생성자나 setter를 통해 asset을 셋팅*/
}

 

(2) 의존(Dependency) 관계

연관 관계와 자주 혼동되는 관계이다. 의존은 주로 특정 오퍼레이션/메서드의 일부로서 클래스 레퍼런스를 전달받았을 때 형성되는 관계이다. 의존 관계는 매개변수로 전달된 클래스 레퍼런스의 API 중 일부를 호출할 수 있고, 매개변수로 전달된 클래스가 변경된다면 받은 클래스에도 영향을 끼칠 수 있음을 의미한다.

의존 관계는 점선 화살표로 표현되며, 다른 클래스를 의존하는 클래스에서 의존되는 클래스 방향으로 뻗어나간다. (그림을 보면 쉽게 이해할 수 있다) 대부분의 경우 의존 관계에서는 양방향이 말이 안 된다.

class Die { 
	public void Roll() { 
    	... 
    }
}

class Player {
	public void TakeTurn(Die die) { /*작업을 위해 난 지금 Die 클래스랑 Roll 메소드를 의존할 거야*/
    	die.Roll(); 
        ...
    }
}

(본인 주석: 연관과 의존 관계 사이 가장 큰 차이는 의존 관계는 의존하는 클래스가 의존당하는 객체를 클래스 내에 레퍼런스나 객체로서 갖고 있지 않고, 단지 메소드 매개변수로 그것을 받는다는 점이다.)

 

(3) 집합(Aggregation) 관계

집약 관계라고도 부르는데, 이건 연관 관계와 똑같고 불필요한 관계로 여겨질 때가 많다. 집합 관계는 1:N, N-N, 부분-전체 관계 등을 나타낸다고 보는 것이 상식인데, 이러한 관계들은 당연히 연관으로도 나타낼 수 있다(그래서 불필요하게 여겨짐). 소프트웨어 설계에 관해서는 집합 관계가 연관 관계보다 딱히 더 나을 것도 없기 때문에 UML 표현도 딱히 분리되어 있지 않다. (하지만 몇몇 개발자들은 빈 마름모를 써서 집합 관계를 나타내기도 한다) 뭔가 특별한 걸 나타내려고 사용할 게 아니라면 그냥 가볍게 지나가도 괜찮다.

class Asset { ... }

class Player {
	List assets;
	public void AddAsset(Asset newlyPurchasedAsset) { 
    	assets.Add(newlyPurchasedAssest); 
        ... 
    }
	...
}

 

(4) 구성(Composition) 관계

구성 관계는 객체 생성 책임에 연관되어 있다. B 클래스가 A 클래스에 의해 생성됐다면, A 클래스 객체는 B 클래스 객체의 생성이나 lifetime 통제권을 갖게 된다. 말할 것도 없이 A 클래스 인스턴스가 GC에 의해 사라진다면 B 클래스 인스턴스 역시 한 배를 타고 함께 사라지게 된다. 구성 관계는 주로 두 클래스 간의 실선으로 표현되는데, 이 때 생성 책임을 갖는 쪽에 꽉 찬 마름모를 붙인다.

public class Piece { ... }

public class Player {
	Piece piece = new Piece(); /*Player는 Piece 생성 책임이 있다*/
	...
}

(본인 주석: 구성 관계는 연관 관계에서 한 발 더 나가 레퍼런스를 갖고 있을 뿐만 아니라 아예 생성까지 하는 책임을 갖고 있다. 따라서, 이 경우 Player 객체를 생성하면 Piece 객체도 내부적으로 함께 생성하는 것이고, Player 객체가 사라지면 당연히 그 안의 Piece 객체도 함께 사라지게 된다.)

 

 

 

+

추가로 읽어보면 좋을 스택오버플로우 질문을 하나 더 링크한다.

 

 

 

728x90
반응형
Comments