If문은 실생활에서도 자주 사용되는 문법이다.
만약 네가 오후 4시에 온다면, 난 3시부터 행복해지기 시작할거야!
위와 같이 간단한 조건문도 있지만 현실에서는 좀 더 복잡한 경우가 많다.
하지만 네가 5시 이후에 온다면,
난 다른 일을 계획해야 할 것이고,
만약 네가 오지 않는다면,
난 혼자 영화를 보거나 책을 읽을 거야.
게다가, 만약 비가 온다면,
우리는 실내에서 만나야 할 것이고,
맑은 날씨라면 공원에서 만나 피크닉을 즐길 수 있을 거야.
...
이런 식으로 현실 세계에는 다양한 "if" 경우의 수가 있고, 이를 "~하면 ~하다"라는 문법으로 표현한다.
프로그래밍에서도 if문은 다양하고 그리고 유용하게 쓰인다.
String beverage;
if (season.equals("여름") && weather.equals("좋음")) {
beverage = "차가운 아메리카노";
} else if (weather.equals("비")) {
beverage = "따듯한 카푸치노";
} else if (!weather.equals("비") && sky.equals("흐림")) {
beverage = "요거트";
} else if (month.equals("7월") && temperature.equals("매우 더움")) {
beverage = "수박 쥬스";
} else {
beverage = "마시지 않습니다";
}
문제는 케이스가 늘어나는 것과 동일하게 if문도 계속 늘어나며, 그 결과 테스트 케이스에 비례하여 선형적으로 코드가 길어진다는 것이다. 아래와 같은 경우를 보자. 겨우 4개의 분기만을 했을 뿐인데도 코드의 길이가 벌써 11줄이 되었다.
public void processWeather(String weather) {
if (weather.equals("맑음")) {
System.out.println("날씨가 맑습니다."); // 날씨가 맑을 때 수행할 작업
} else if (weather.equals("흐림")) {
System.out.println("날씨가 흐립니다."); // 날씨가 흐릴 때 수행할 작업
} else if (weather.equals("비")) {
System.out.println("비가 내립니다."); // 비가 내릴 때 수행할 작업
} else {
System.out.println("날씨 정보를 알 수 없습니다."); // 날씨 정보를 알 수 없을 때 수행할 작업
}
}
한 메서드가 10줄 이상이 넘어가기 시작하면 단일 책임 원칙(SRP: Single Responsibility Principle)을 지키기 어려워진다. 여러가지 분기문이 한 메서드에 있을 경우 해당 분기별로 서로 다른 로직을 수행하게 되고, 그에 따르는 부수적인 의존관계 설정 및 메서드 호출이 잦아지면서 코드는 복잡해진다. 그 결과 가독성은 물론 유지보수성, 재사용성을 떨어뜨리는 좋지 않은 코드가 되어버린다.
그런데 if 분기문이 명백하게 필요할 것 같은 상황에서 직관적으로 다른 대안을 찾는 것이 쉽지는 않다.