코드를 작성하다 보면 수를 변수가 특정 숫자 범위에 있는지를 검사하는 경우가 있다. 예를 들어 변수 a가 0부터 10 사이에 있는지를 검사하려면 다음과 같이…

a := 5

a > 0 && a < 10

뭐 이런 식으로 할 수 있다. 사람마다 스타일은 다르겠지만 파이썬에서는 이런 비교가 0 < a < 10과 같이 rich comparions가 가능하기 떄문에 코드를 읽기도 쉽지만 다른 언어에서는 이런 식으로 편리하게 되진 않으므로 나는 주로 이런 식으로 코드를 작성하고 있다.

0 < a && a < 10

이렇게 하면 훨씬 직관적인데, go에서 이렇게 코드를 작성하면 linter에서 다음과 같은 경고가 뜬다.

yodaStyleExpr: consider to change order in expression to v >= 0 (gocritic)

보통 if문을 사용할 때 if (a == 4)와 같은 형태로 변수와 상수를 비교하는데, 만약 a = 4와 같은 형태로 작성하면 문제를 알아차리기 어려우므로 상수와 변수의 자리를 바꿔서 4 == a와 같은 형태로 작성하면 좋다고 대학교 때 들은 적이 있다. 이게 그냥 팁 정도로만 생각했는데 이런 스타일이 yoda condition이라고 불리는 이름이 따로 있다는 것을 처음 알았다. 그래서 위 경고의 의미는 논리 연산자 기준으로 왼쪽 비교가 yoda스럽기 때문에 저렇게 고려해보라고 알려주는 것.

이름이 왜 yoda인가 하면 나는 스타워즈를 안봐서 잘 모르겠지만 저 yoda라는 캐릭터가 어순에 맞지 않는 영어를 쓰는 캐릭터인가 보다.

아무튼 이런, 순서를 반대로 해서 비교하는 케이스의 장점으로는 단순히 ===로 실수할 수 있는 것을 막는다는 것에 의미가 있는 것은 아니다. 작게는 이런 실수를 했을 때, 이것이 런타임으로 넘어가서 에러가 발생하는 것이 아니라 컴파일 타임의 에러로 바꿀 수 있다는 것. 그리고 크게 봐서는 어떤 문장의 순서를 바꾸는 것이 바꾸지 않는 것보다 더 유리할 수 있다는 것이다.

String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java

이런 코드가 있을 경우 myStringnull이므로, null 오브젝트의 메소드에 접근하기 때문에 NullPointerException이 발생한다. 그러나 이 순서가 변경되는 경우 그러나 이 순서가 변경되면,

String myString = null;
if ("foobar".equals(myString)) { /* ... */ }
// This is false, as expected

이와 같은 케이스에서도 NullPointerException을 막을 수 있다는 것. 코드를 작성할 때 순서를 뒤집어 더 간단하게 해결할 수 있는지도 확인해봐야 하겠다.

일단 신기하게 php 프로젝트인 WordPress에서는 이런 방식을 Coding Standards로 소개하고 있으니까 한번 읽어보는 것도 나쁘진 않겠다.