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("접속 불가");
}
}
}
정규식을 이용했다는 자신이 기특해서 두 코드의 시간과 메모리를 비교해 보기로 하였다.
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
'Java' 카테고리의 다른 글
[Java] Maven 라이브러리 Dependency 충돌 해결하기 (0) | 2021.11.04 |
---|---|
[Java] 메서드 참조(Method Reference) (0) | 2021.05.21 |
[Java] javadoc 정리 (0) | 2021.05.04 |
[Java] StringBuffer / StringBuilder (0) | 2020.06.02 |
[Java] BufferedReader / BufferedWriter 사용법 (0) | 2020.06.01 |