주요글: 도커 시작하기
반응형

어제 이어 오늘도 사소하게 코드를 정리했다. 정리하기 전에 코드 형태는 다음과 같다.

if(obj.getData().equals("01") || obj.getData().equals("02") || obj.getData().equals("03")) {
    ....
}

문자열이 여러 값 중 하나인지 비교하는 코드이다. 이런 형태의 코드가 곳곳에 있어 어떻게 변경할까 고민하다가 SQL의 in 구문이 떠올라 다음과 같이 변경했다.

if ( Cond.str(obj.getData()).in("01", "02", "03") ) {
    ...
}

코틀린이었다면 확장 함수를 사용해서 더 간결하게 표현할 수 있었을텐데 하는 아쉬움이 살짝 들었지만 컴파일 속도를 생각하면 이것도 괜찮다.

다음처럼 여러 값이 모두 아닌지 비교하는 코드도 빈번하게 출현한다.

if( !obj.getData().contentEquals("01") && !obj.getData().contentEquals("02") ) {
    ....
}

이를 위해 notIn() 메서드도 추가했다.

if ( Cond.str(obj.getData()).notIn("01", "02") ) {
    ...
}

다음은 Str 클래스의 구현 코드다.

public class Cond {
    public static StrCond str(String s) {
        return new StrCond(s);
    }

    public static class StrCond {
        private String value;

        public StrCond(String value) {
            this.value = value;
        }

        public boolean in(String ... values) {
            for (String v : values) {
                if (v.equals(value)) return true;
            }
            return false;
        }

        public boolean notIn(String ... values) {
            for (String v : values) {
                if (v.equals(value)) return false;
            }
            return true;
        }
    }
}

 

  1. 김광수 2021.04.13 11:30

    구현코드를 변경해 보왔습니다. 그런데 Cond<T> 가 별로 의미 없어 보이긴 합니다 😅
    <code>
    public class CondTest {
    @Test
    void testStr() {
    assertThat(new Cond.Str("a").in("a", "b", "c")).isTrue();
    assertThat(new Cond.Str("d").in("a", "b", "c")).isFalse();
    assertThat(new Cond.Str("d").notIn("a", "b", "c")).isTrue();
    assertThat(new Cond.Str("a").notIn("a", "b", "c")).isFalse();
    }

    interface Cond<T> {
    boolean in(T... values);

    default boolean notIn(T... value) {
    return !in(value);
    }

    class Str implements Cond<String> {
    private final String value;

    public Str(String value) {
    this.value = value;
    }

    @Override
    public boolean in(String... values) {
    for (String v : values) {
    if (v.equals(value))
    return true;
    }
    return false;
    }
    }
    class Int implements Cond<Integer> {
    ...
    }
    }
    }
    </code>

+ Recent posts