Category Archives: JAVA

[Java] 현재 시스템의 IPv4기반의 IP주소 가져오기

Java에서 IP주소를 가져오는 방법은 매우 쉽고 간단합니다. 일반적으로 사용되는 간단한 방법으로는 다음과 같은 방법이 있습니다.
[code]InetAddress.getLocalHost().getAddress()[/code]
위의 단 한줄로 현재 시스템의 IP를 읽어올 수 있습니다. 그런데 개발시에는 문제가 없었는데 리눅스 서버에서 구동해 보니 127.0.0.1과 같이 loopback 주소가 나오는 경우가 있더군요. 찾아보다 다음과 같은 방법으로 깔끔하게 해결할 수 있었습니다.
[code]/**
 * 현재 서버의 IP 주소를 가져옵니다.
 *
 * @return IP 주소
 */
private String getLocalServerIp()
{
try
{
   for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
   {
       NetworkInterface intf = en.nextElement();
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();)
       {
           InetAddress inetAddress = enumIpAddr.nextElement();
           if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress())
           {
            return inetAddress.getHostAddress().toString();
           }
       }
   }
}
catch (SocketException ex) {}
return null;
}[/code]
현재 시스템의 모든 네트워크 인터페이스를 읽어와서 loopback장치인지 랜선에 연결된 장치인지 여부를 확인하여 실제 사용중인 인터페이스의 IP주소를 읽어오게 됩니다. 위와 같이 사용해서 실무에 적용해본 결과 어느 OS, 장치에 상관없이 IP가 정상적으로 출력되는것을 확인하였습니다.

소스코드가 좀 길고 더럽네요; 그냥 보관용으로 적어두는데 의미를 부여하겠습니다;;

[Java] 리스트 순환중에 특정 객체 삭제하기

List<String> list = new ArrayList<String>();

list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
list.add("DDDD");
list.add("EEEE");
list.add("FFFF");
list.add("GGGG");

for(String value : list) {
  if(value.startsWith("D")) {
    list.remove(value);
  }
}

System.out.println("Result: " + list);

위와 같은 소스코드가 있다고 가정을 해보겠습니다. 위의 코드는 단순히 리스트 전체를 순환중에  값이 D로  시작하는 경우 그 객체(현재 순환중인 자기자신)를 삭제하고자 하는 의도를 가지고 있는 코드입니다.

하지만 위의 코드는 다음과 같은 오류를 만나게 됩니다.

Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
  at java.util.AbstractList$Itr.next(Unknown Source)
  at RemoveInLoop.main(RemoveInLoop.java:20)

기본적으로 리스트는 순환중에 리스트의 추가, 삭제, 변경등 자기 자신을 수정할 수 없게 되어있습니다. 하지만 다음과 같이 Iterator를 활용하면 가능합니다.

List<String> list = new ArrayList<String>();

list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
list.add("DDDD");
list.add("EEEE");
list.add("FFFF");
list.add("GGGG");

for(Iterator<String> it = list.iterator() ; it.hasNext() ; ) {
  String value = it.next();
  if(value.startsWith("C")) {
    it.remove();
  }
}

System.out.println("Result: " + list);

이번에는 C로 시작하는 값을 지워보려는 목적으로 가지고 실행을 해보았습니다. 오류 없이 다음과 같은 결과를 보여줍니다.

Result: [AAAA, BBBB, DDDD, EEEE, FFFF, GGGG]

[RemoveLoop 예제코드 다운로드]