프로그래밍을 하다보면 if문으로 상황에 따른 조건을 지정해주는 경우가 있다. 가령 다음과 같은 경우이다.
public fun example(item: List<Item>): Int{
var sum = 0
for(i in 0..item.size()){
if(item[i] == 1){
sum += 1
}
else if(item[i]%2 == 0){
sum += 2
}
else{
sum -= 1
}
}
return sum
}
이때, 조건이 다양해 질 수록 if문이 복잡해지기 마련이다.
그래서 해당 조건에 따른 행동을 interface로 지정하고 상황에 따라서 interface를 implement한 객체를 지정해준다.
코드로 확인해보자.
public class Example{
private var strategy = Strategy()
public Example(strategy: Strategy){
this.strategy = strategy
}
public fun example(items: List<Item>): Int{
var sum = 0;
for(item in items){
sum +=strategy.sumFunc(item)
}
return sum
}
}
위처럼 코드를 줄일 수 있으며 조건이 늘어난다고해도 위의 코드는 수정하지 않아도 된다.
그렇다면 인터페이스를 어떻게 선언하고 구현하는지 확인해보자.
interface Strategy{
fun sumFunc()
}
원하는 상태만큼 위의 interface를 상속 받은 클래스를 선언해주고 각 전략에 맞는 함수 구현을 해주면된다.
전략 변화가 필요할 때에(button 눌렸을 때 등) Example 클래스에 startegy 객체만 원하는 클래스로 변경만 해주면된다. 해당 방법을 구현하는 것은 Example에 strategy setter를 이용하여 구현할 수 있을 것이다.
public class Example{
private var strategy = Strategy()
public Example(strategy: Strategy){
this.strategy = strategy
}
public fun example(items: List<Item>): Int{
var sum = 0;
for(item in items){
sum +=strategy.sumFunc(item)
}
return sum
}
public fun onFirstButton(){
strategy = FirstStrategy()
}
public fun onAfterButton(){
strategy = AfterStrategy()
}
}
-끝-
댓글