오늘 학습 키워드

디자인 패턴, 전략패턴

오늘 학습 한 내용을 나만의 언어로 정리하기

디자인 원칙

애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분과 분리한다.

오리를 만들 때, 각 오리마다 나는 모습이 다를 수 있다.
따라서 오리의 나는 행동을 별도로 분리한다.

class Duck {
	void Fly(); // 달라짐
	void Quack();
	void Swim();
	void Display(); // 달라지지 않음
}

구현보다는 인터페이스에 맞춰서 프로그래밍한다.

나는 모습이 다를 수는 있지만 그럼에도 여전히 오리는 난다. (또는 오리에 따라 날지 않을 수도 있다.)
이를 편하게 하기 위해서는 클래스 내에서 미리 구현하는게 아니고, 인터페이스로 만들어두면 추후에 동적으로 넣을 수 있다.

// 구현의 예시
class Duck {
	void Fly() {
		// 직접 구현. 이러면 Duck을 상속한 다른 객체에서 직접 수정해줘야됨.
	}
}
 
// 인터페이스의 예시
interface FlyBehavior {
	void Fly();
}
 
class FlyWithWings : Flybehavior {
	void Fly() {
		// 날기
	}
}
 
class FlyNoWay : Flybehavior {
	void Fly() {
		// 안날기
	}
}
 
class Duck {
	FlyBehavior flyBehavior;
	void PerformFly() {
		flyBehavior.Fly(); // 이러면 다양한 날기 방식을 지정할 수 있음
	}
}
 

상속보다는 구성을 활용한다.

오리들의 행동을 직접 상속하는 것 대신에, 행동을 클래스화 해서 합치는 구성 방법을 이용하면 나중에 더 쉽게 바꿀 수 있음.

// 상속의 예시
interface FlyBehavior {
	void Fly();
}
class Duck : FlyBehavior {
	void Fly() {
		// 나는걸 직접 상속해서 만듬
	}
	...
}
 
// 구성의 예시
class Duck {
	FlyBehavior flyBehavior; // 행동 클래스 객체를 가지고 있음.
	...
}
 

전략 패턴

알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해줌.