<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=DelegationPattern</id>
	<title>DelegationPattern - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=DelegationPattern"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=DelegationPattern&amp;action=history"/>
	<updated>2026-05-14T13:09:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=DelegationPattern&amp;diff=84297&amp;oldid=prev</id>
		<title>Maintenance script: Repair batch-0001 pages from live compare</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=DelegationPattern&amp;diff=84297&amp;oldid=prev"/>
		<updated>2026-03-26T23:56:06Z</updated>

		<summary type="html">&lt;p&gt;Repair batch-0001 pages from live compare&lt;/p&gt;
&lt;a href=&quot;https://mediawiki.zeropage.org/index.php?title=DelegationPattern&amp;amp;diff=84297&amp;amp;oldid=31202&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=DelegationPattern&amp;diff=31202&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=DelegationPattern&amp;diff=31202&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;클래스에 대해 기능을 확장하는 두가지 방법중 하나이다. 하나는 상속이고 하나는 위임(Delegation) 이다. 상속을 하지 않아도 해당 클래스의 기능을 확장시킬 수 있는 방법이 된다.&lt;br /&gt;
&lt;br /&gt;
또한, 클래스 하나가 방대해질때, 적절하게 그 클래스의 책임을 다른 클래스들에게 위임해주는 것은 [[Refactoring]] 의 방법이 된다.&lt;br /&gt;
&lt;br /&gt;
ObjectOrientedProgramming 을 할때 자주 쓰이는 코딩 스타일. 아마 사람들이 무의식중에 자주 쓸 것이다. &lt;br /&gt;
&lt;br /&gt;
example) 예전에 VonNeumannAirport 을 JuNe 과 [[1002]] 가 Pair 하던중 JuNe 이 작성했던 Refactoring 으로서의 Delegation.&lt;br /&gt;
 public class Airport {&lt;br /&gt;
 	private int _traffic;&lt;br /&gt;
 	private int [] _arrivalGate;&lt;br /&gt;
 	private int [] _departureGate;&lt;br /&gt;
 	private PassengerSet psg;&lt;br /&gt;
 		&lt;br /&gt;
 	public int getTraffic() {&lt;br /&gt;
 		ListIterator iter = psg.passengers.listIterator();&lt;br /&gt;
 		int [] passenger;&lt;br /&gt;
 		&lt;br /&gt;
 		while (iter.hasNext()) {&lt;br /&gt;
 			passenger = (int [])iter.next();&lt;br /&gt;
 			movePassenger(passenger[0], &lt;br /&gt;
 						passenger[1],&lt;br /&gt;
 						passenger[2]);&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
 		return _traffic;&lt;br /&gt;
 	}	&lt;br /&gt;
 	&lt;br /&gt;
 	public void setArrivalGates(int [] aCity) {&lt;br /&gt;
 		_arrivalGate = aCity;&lt;br /&gt;
 	}&lt;br /&gt;
 	public void setDepartureGates(int [] aCity) {&lt;br /&gt;
 		_departureGate = aCity;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public int [] getArrivalGates() {&lt;br /&gt;
 		return _arrivalGate;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public int [] getDepartureGates() {&lt;br /&gt;
 		return _departureGate;&lt;br /&gt;
 	}&lt;br /&gt;
 	public int getDistance(int fromCity, int toCity){&lt;br /&gt;
 		int distance=java.lang.Math.abs(_getArrivalCityGate(fromCity)&lt;br /&gt;
 		                             -_getDepartureCityGate(toCity))+1;&lt;br /&gt;
 		return distance;&lt;br /&gt;
 	}	&lt;br /&gt;
 &lt;br /&gt;
 	private void movePassenger(int fromCity, int toCity, int aNumber) {&lt;br /&gt;
 		_traffic+=getDistance(fromCity,toCity)*aNumber;&lt;br /&gt;
 	}&lt;br /&gt;
 	public void setPassengers(PassengerSet psg) {&lt;br /&gt;
 		this.psg=psg;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
여기까지는 Airport 이다. 하지만 VonNeumannAirport 문제에서도 보듯, 실제 Input 에 대해서 Configuration 은 여러 Set 이 나온다.&lt;br /&gt;
&lt;br /&gt;
이 기능을 추가하기 위해 일단 Airport Code 를 Refactoring 하기로 했다. 이를 위해 Airport 의 기능중 Configuration 과 관련된 기능에 대해 Configuration 을 Extract 하고, 내부적으로는 Delegation 함으로서 외부적으로 보이는 기능에 대해서는 일관성을 유지한다. (Test Code 가 일종의 Guard 역할을 했었음)&lt;br /&gt;
&lt;br /&gt;
 import java.util.ListIterator;&lt;br /&gt;
 &lt;br /&gt;
 class Configuration {&lt;br /&gt;
 	private int [] _arrivalGate;&lt;br /&gt;
 	private int [] _departureGate;&lt;br /&gt;
 	private int id;&lt;br /&gt;
 	&lt;br /&gt;
 	public void setArrivalGates(int [] aCity) {&lt;br /&gt;
 		_arrivalGate=aCity;&lt;br /&gt;
 	}&lt;br /&gt;
 	public void setDepartureGates(int [] aCity) {&lt;br /&gt;
 		_departureGate=aCity;	&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public int [] getArrivalGates() {&lt;br /&gt;
 		return _arrivalGate;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public int [] getDepartureGates() {&lt;br /&gt;
 		return _departureGate;	&lt;br /&gt;
 	}&lt;br /&gt;
 	public int getDistance(int fromCity, int toCity){&lt;br /&gt;
 		int distance=java.lang.Math.abs(_getArrivalCityGate(fromCity)&lt;br /&gt;
 		                             -_getDepartureCityGate(toCity))+1;&lt;br /&gt;
 		return distance;&lt;br /&gt;
 	}	&lt;br /&gt;
 	public int _findInIntArray(int anInt,int [] anArray) {&lt;br /&gt;
 		for (int i=0;i&amp;amp;lt;anArray.length;i++) {&lt;br /&gt;
 			if (anArray[i] == anInt) return i+1;&lt;br /&gt;
 		}&lt;br /&gt;
 		return -1;&lt;br /&gt;
 	}&lt;br /&gt;
 			&lt;br /&gt;
 	public int _getArrivalCityGate(int aCity) {&lt;br /&gt;
 		return _findInIntArray(aCity,getArrivalGates());&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public int _getDepartureCityGate(int aCity) {&lt;br /&gt;
 		return _findInIntArray(aCity,getDepartureGates());&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public int getId() {&lt;br /&gt;
 		return id;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public void setId(int anId) {&lt;br /&gt;
 		id=anId;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 public class Airport {&lt;br /&gt;
 	private int _traffic;&lt;br /&gt;
 	private int [] _arrivalGate;&lt;br /&gt;
 	private int [] _departureGate;&lt;br /&gt;
 	private PassengerSet psg;&lt;br /&gt;
 	private Configuration conf=new Configuration();&lt;br /&gt;
 		&lt;br /&gt;
 	public int getTraffic() {&lt;br /&gt;
 		ListIterator iter = psg.passengers.listIterator();&lt;br /&gt;
 		int [] passenger;&lt;br /&gt;
 		&lt;br /&gt;
 		while (iter.hasNext()) {&lt;br /&gt;
 			passenger = (int [])iter.next();&lt;br /&gt;
 			movePassenger(passenger[0], &lt;br /&gt;
 						passenger[1],&lt;br /&gt;
 						passenger[2]);&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
 		return _traffic;&lt;br /&gt;
 	}	&lt;br /&gt;
 	&lt;br /&gt;
 	public void setArrivalGates(int [] aCity) {&lt;br /&gt;
 		conf.setArrivalGates(aCity);&lt;br /&gt;
 	}&lt;br /&gt;
 	public void setDepartureGates(int [] aCity) {&lt;br /&gt;
 		conf.setDepartureGates(aCity);&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public int [] getArrivalGates() {&lt;br /&gt;
 		return conf.getArrivalGates();&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public int [] getDepartureGates() {&lt;br /&gt;
 		return conf.getDepartureGates();&lt;br /&gt;
 	}&lt;br /&gt;
 	public int getDistance(int fromCity, int toCity){&lt;br /&gt;
 		return conf.getDistance(fromCity,toCity);&lt;br /&gt;
 	}	&lt;br /&gt;
 &lt;br /&gt;
 	private void movePassenger(int fromCity, int toCity, int aNumber) {&lt;br /&gt;
 		_traffic+=getDistance(fromCity,toCity)*aNumber;&lt;br /&gt;
 	}&lt;br /&gt;
 	public void setPassengers(PassengerSet psg) {&lt;br /&gt;
 		this.psg=psg;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
DelegationPattern을 쓸 때 중요한 점은, DelegationPattern을 사용하는 클래스의 클라이언트는 그 클래스가 Delegation을 쓰는지 안쓰는지 몰라야 한다는 것이다. 즉, 우리에게 있어 DelegationPattern이 사용된 클래스는 여느 클래스와 동일하게 인식되고 사용되어져야 한다. 게을러서 남에게 자신의 숙제를 위임하는 학생은 절대 남들에게 그 사실을 노출해선 안된다.&lt;br /&gt;
&lt;br /&gt;
[[ResponsibilityDrivenDesign]] , [[Refactoring]], [[DelegationPattern]] 을 꾸준히 지켜주면 좋은 코드가 나올 수 있다. ([[DesignPattern]] 이 유도되어짐)&lt;br /&gt;
&lt;br /&gt;
See Also Seminar:DelegationPattern&lt;br /&gt;
----&lt;br /&gt;
전에 SE 수업중에 컴포넌트모델의 필요성을 이야기하던중 &amp;#039;상속으로의 재사용이 어렵기 때문에&amp;#039; 이야기를 하셨는데, 왜 대안 중 하나로서의 [[Delegation]] 에 대한 언급이 전혀 없으셨는지 모르겠다. Delegation 만 잘 이해해도 준 컴포넌트 스타일의 모듈화 프로그래밍을 잘 진행할 수 있고, 사람들 간의 작업분담도 잘 이끌어 낼 수 있을건데.. --&amp;amp;#91;1002&amp;amp;#93;&lt;br /&gt;
----&lt;br /&gt;
[[패턴분류]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>