Java

[Java] 와일드 카드가 들어간 IP 검사하기!

메바동 2020. 7. 13. 20:01
728x90

문자열로 입력된 "123.45.67.89"와 같은 IP를 "123.45.67.*"과 같은 와일드 카드가 들어간 IP 형식과 비교하는 기능을 만들어야 했다.

처음 딱 든 생각은 3번째 자리까지 잘라서 비교하면 되겠네~ 하는 생각이었다.

비교 할 아이피들을 String 타입에서 지원하는 메서드인 substring 메서드를 이용해서 잘라낸 뒤 비교하면 어차피 마지막 자리의 *이 모든 범위를 뜻하므로 해결되는 일이었다.

 

public class IpValidTest {
    public static void main(String[] args) {
        String ip = "158.23.1.39";
        String validIp = "158.23.1.*";

        boolean check = ip.substring(0, ip.lastIndexOf('.')).equals(validIp.substring(0, validIp.lastIndexOf('.')));
        
        if (check) {
            System.out.println("접속 허용");
        } else {
            System.out.println("접속 불가");
        }
    }
}

문제를 보자마자 해결 방법을 생각해 내다니 흐뭇하다.

근데 뭔가 보면 볼 수록 너무 단순한 것 같고 마음에 들지 않았다.

좋은 방법이 없을까 고민하다가 좋은 방법이 하나 떠올랐다.

 

문자열의 비교니까 정규식을 이용하면 되겠네!!!

정규식을 이용하면 훨씬 있어보이고 깔끔할 것 같고 좋을 것 같았다.

 

되지도 않는 코딩 실력으로 코딩 중...

사실 JS로는 정규식을 많이 써봤지만 Java에서 정규식을 짜는건 처음이라 시간이 꽤 걸렸다. (사실 사용법 찾는 시간만 많이 걸렸다...)

 

import java.util.regex.*;

public class IpValidTestWithRegExp {
    public static void main(String[] args) {
        String ip = "158.23.1.199";
        String validIp = "158.23.1.*";

        boolean test = Pattern.matches(validIp.substring(0, validIp.lastIndexOf('.')) + ".([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])", ip);

        if (test) {
            System.out.println("접속 허용");
        } else {
            System.out.println("접속 불가");
        }
    }
}

별로 깔끔해진 것 같지도 않지만 정규식을 이용했고 마지막에 IP 범위까지 검사할 수 있다는게 뿌듯했다.

정규식을 이용했다는 자신이 기특해서 두 코드의 시간과 메모리를 비교해 보기로 하였다.

 

public class IpValidTest {
    public static void main(String[] args) {
        Runtime.getRuntime().gc();
        long startTime = System.nanoTime();

        String ip = "158.23.1.39";
        String validIp = "158.23.1.*";

        boolean check = ip.substring(0, ip.lastIndexOf('.')).equals(validIp.substring(0, validIp.lastIndexOf('.')));
        
        if (check) {
            System.out.println("접속 허용");
        } else {
            System.out.println("접속 불가");
        }

        long endTime = System.nanoTime();
        Double time = (endTime - startTime) / 1000000.0;
        System.out.println(time);

        long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println("첫번째 코드에서 사용한 메모리: " + usedMemory + " bytes");
    }
}
import java.util.regex.*;

public class IpValidTestWithRegExp {
    public static void main(String[] args) {
        Runtime.getRuntime().gc();
        long startTime = System.nanoTime();

        String ip = "158.23.1.199";
        String validIp = "158.23.1.*";

        boolean test = Pattern.matches(validIp.substring(0, validIp.lastIndexOf('.')) + ".([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])", ip);

        if (test) {
            System.out.println("접속 허용");
        } else {
            System.out.println("접속 불가");
        }

        long endTime = System.nanoTime();
        Double time = (endTime - startTime) / 1000000.0;
        System.out.println(time);
        
        long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println("두번째 코드에서 사용한 메모리: " + usedMemory + " bytes");
    }
}

기존 코드에 몇 줄만 추가해주면 된다.

음.....

흐음.....

 

 

원래는 비트 연산자로도 뭔가 해보고 싶었는데 생각해보니 더 복잡해지는 것 같았다.

그래서 그만 뒀다.

뭔가 생각해서 만드는건 참 뿌듯하고 재밌는 일인 것 같다.

 

- 포스팅 마침 -

728x90