어제 우테코에서 폭포에게 Yoda condition에 대한 설명을 들었다. 어제 오후, 다른사람에게 2분 30초동안 자신이 알고있는것을 명확하게 설명하는 활동을 했다. 짧은 시간 동안 폭포에게 설명받은 내용을 나도 메이슨에게 설명했다. 그 뒤 메이슨과 보는사람마다 YC(Yoda condition을 있어보이게 앞글자만 땄음)를 아냐고 물어봤다. 이번 글은 2분 30초동안 말로 설명하듯이 빠르고 짧게 읽어볼 수 있게 설명해보겠다.
String name;
if (name.equals("Haiseong")) {
System.out.println("이름이 같다.");
}
위의 코드는 이름이 "Haiseong"인지 검사하고 같다면 "이름이 같다."를 출력한다. 이 코드는 대부분의 상황에서 잘돌아간다.
그러나 만약 name에 null 이 들어간다면 어떨까?
NullPointerException 이 발생한다. 그렇다면 name이 null인지 미리 확인해주자.
String name = null;
if (name == null) {
System.out.println(name + "이 null이다");
return;
}
if (name.equals("Haiseong")) {
System.out.println("이름이 같다.");
}
이제 name이 null인 경우도 해결이 됐다. 그러나 코드가 너무 길어졌다. 코드를 짧게 유지하면서 name이 null이여도 예외가 발생하지 않는 방법이 없을까? 이제 요다 컨디션을 알아보자.
String name = null;
if ("Haiseong".equals(name)) {
System.out.println("이름이 같다.");
}
순서를 바꿔주기만 하는것으로 코드줄을 늘리지 않고 NullPointerException을 방지할 수 있다. 이것을 Yoda condition이라고 부른다. 관계 연산자의 두 인자를 일반적으로 쓰는 순서가 아닌 순서를 바꿔 사용하는것이다. (나도 잘 몰랐는데 요다가 도치법을 쓴단다.)
이미 위에서 첫번째 장점인 NullPointerException을 방지를 말했다. 두번째 장점은 실수를 막아준다는 것이다.
int a = 10;
// normal
if (a = 9) {
System.out.println("a 는 9 입니다.");
}
// yoda condition
if (9 = a) {
System.out.println("a 는 9 입니다.");
}
실수로 위의 코드를 적는다면 a = 10
은 무조건 true를 리턴한다. Yoda condition을 사용한다면 10 = a
는 컴파일 에러를 발생시키기 때문에 실수를 막을 수 있다. (그러나 요즘 Intellij 같은 IDE가 이미 잘 잡아주기 때문에 더이상 장점이라고 말하기 힘들다.)
가장 큰 단점은 가독성이 떨어진다.
if (name.equals("Haiseong"))
은 만약 이름이 "Haiseong" 이라면 으로 읽어진다.
if ("Haiseong".equals(name))
은 만약 "Haiseong"이 이름 이라면 으로 읽어진다.
위의 코드가 읽기 훨신 좋다. Yoda condition은 가독성을 떨어뜨린다.
이 글을 쓰는 이유가 "Yoda condition을 써라!" 라고 말하기 위해서는 아니다. Yoda condition은 trade off가 있다. 팀에서 개발을 한다면 팀원과 상의해서 사용해야 할 부분인 것 같다. 내 주변 동료들은 가독성이 너무 좋지 않아 쓰는것을 선호하지 않는것 같다. 내가 보기에는 문자열을 비교할때는 사용한다면 웹개발을 할때 null로 들어오는 String을 잘 처리할 수 있어 사용해보는것도 좋을 것 같다.