Java

    달팽이 & 피보나치 수열 구현

    n개의 수를 받아서 달팽이 형태로 출력하는 방법. 문득 이전에 로직이 생각나지 않은게 기억나서 만들었다. 나는 컴퓨터 앞에서 해야 로직이 생각난다. 망할;; Source1은 달팽이, Source2는 피보나치 수열 재귀함수. 달팽이 피보나치같은 경우는 참 간단한데, 달팽이 같은 경우는 의외로 많이 시행착오를 겪었다. 수열 형태를 그려보고 x,y좌표에 따라서 계산해서 하려다가 점점 복잡해지고, 홀수, 짝수에 따른 오차까지 생각해야하나하고 머리가 복잡했는데 갑자기 간단히 풀려버렸다. 난 정말 시행착오 겪으면서 프로그래밍 하는게 제일 좋은것 같다. 1. 달팽이와 같은 형태로 배열을 이동하며 값을 입력한다. 2. 이동시 최대값이나 최소값을 넘기지 않으면서 다음값이 0이면 이동하고 아니면 방향을 바꾼다. publi..

    JNI(Java Native Interface) - 객체

    JNI(Java Native Interface) - 객체

    [1]에서 보고 해보았다. 이전에 쓴 JNI와 같은 방식으로 컴파일하고 실행해보면 됀다. 1. Java Source public class JniFuncMain { private static int staticIntField = 300; static {System.loadLibrary("jnifunc");} public static native JniTest createJniObject(); public static void main(String[] args) { System.out.println("[Java] createJniObject() 네이티브 메소드 호출"); JniTest jniObj = createJniObject(); jniObj.callTest(); } } class JniTest { p..

    두 개의 스택을 이용한 큐 구현

    한번 나에게 그런 문제가 주어진 적이 있었다. 스택(Stack)을 이용하여 큐(Queue)를 구현하라. 힌트는 두 개의 스택을 이용하라. 그런데 도무지 그날따라 머리속에 로직이 떠오르지가 않는 것이었다. 로직, 알고리즘이 떠오르지 않는 날은 최선책이 잘 떠오르지 않을 때가 있다. 그래서 나는 내가 문제를 푸는 과정이 조금 미숙할 때가 있지 않은가 싶다. 체계적으로 문제의 해법에 대해 접근해가야 하는데 그렇지 못한 점이 있는 것이다. 오늘 문득 그 문제를 생각하다보니 참 간단하다. * 두 개의 스택을 이용한 구현 중요한 점은 쌓아진 스택을 그대로 빼서 다시 스택에 쌓으면 큐의 형태로 빼낼 수 있게 됀다. 즉, 첫 번째 스택은 push()만을 담당하고, 두 번째 스택은 pop()만을 담당한다. - 첫 번째 ..

    JNI(Java Native Interface)

    JNI(Java Native Interface)

    프로젝트를 진행하면서 JNI에 대해 알게 되었었다. Java에서 C함수를 호출하거나 C에서 Java의 메소드를 호출할 때 사용하는 것인데, 안드로이드 공부를 하다가 조금 더 파고들게 되었다. * 안드로이드는 자바로 프로그래밍을 하는데 왜 JNI에 대해 알아야 할까? 우선 안드로이드 플랫폼은 순수하게 Java로만 구성되어진 것이 아닌 Java 레이어와 C/C++레이어가 서로 상호 작용하면서 동작한다. 이 두 레이어가 유기적으로 동작하게 만들려면 JNI에 대해 알아야 한다. 그리고 일반적으로 Java는 C/C++에 비해 느리다. 성능이 중요할 경우 C/C++로 작성하고 이를 JNI를 통해 Java에서 호출할 수 있다. * NDK(Native Development Kit) 안드로이드 애플리케이션에서 사용할 네..

    C와 Java의 컴파일 과정

    C와 Java의 컴파일 과정

    C와 Java의 컴파일 과정에 대해서 찾아보는 중에 좋은 책을 찾았다. 국내 웹에는 C의 컴파일 과정에 대한 내용밖에 없었다. Reverse Engineering Software[1]라는 책인데 2장에 컴파일 과정에 대한 내용이 나와 있었다. 1. C Compile 아래는 C의 컴파일 과정이다. Figure 1. 컴파일 과정(출처 : [1]) 1.1 Preprocessor C는 다른 언어의 컴파일러와 다르게 전처리 과정이 들어간다. 전처리([3] 참조)는 컴파일에 앞서 필요한 처리를 해주는 것이다. 전처리문에는 다음과 같은 것들이 있다. Table 1. 전처리문의 종류 전처리문 기능 #include 디스크상의 파일을 편입 #define 매크로를 정의 #undef 정의되어 있는 매크로를 취소 #if~#dn..

    단위테스트. JUnit

    단위테스트. JUnit

    오랜만에 포스팅이다. 자바 웹 관련 개발자들과 애기하다보면 JUnit에 대한 이야기가 늘 나온다. 사실 난 그동안 테스는 main()을 통해서만 테스트만 해왔었다. 업무적으로 JUnit을 써볼 기회가 많지도 않긴 했지만 전문가와 단위테스트에 대한 이야기가 나왔는데 내가 추상적으로 이야기했더니 무시를 당했다. 내가 화술이 부족해서(모르는 것도 아는 것처럼, 아는 것은 더 부풀려서 하는) 그럴수도 있지만, 사실 알고만 있을뿐 내가 개발에 직접 사용해보지 않았으니까 그러려니 했다. 그리고 오늘 웹에서 자료를 찾아가며 사용해보았는데, 이것은 신세계였다. 그동안 난 일부 기능들에 대한 테스트를 각 main()을 통해 하였는데 사실 지저분하고 매우 번거로운 작업이다. 각 테스트를 위한 코드를 작성했다가 주석처리를 ..

    [Linux, Window] JAVA로 로컬 IP 주소 얻어오는 방법

    이번 개발에 있어서 윈도우 이클립스에서 개발한 서버가 리눅스 환경에서 일부 기능에 문제가 있어서 찾다보니 같은 메소드지만 윈도우 환경에서 로컬 ip주소를 얻어오는 코드가 리눅스에서는 "127.0.0.1"을 가져와서 문제가 되었다. 구글에서 검색한 결과 코드가 좀 길고 지저분하지만 아래 코드를 써줘야 했다. * Windows try { System.out.println(InetAddress.getLocalHost().getHostAddress()); } catch (UnknownHostException e) { e.printStackTrace(); } * Linux try { String ip = null; boolean isLoopBack = true; Enumeration en; en = Network..

    try문 안에서 변수 값

    오늘 오랜만에 일이 있어서 jsp를 잠깐 만지게 되었는데 황당한 일을 겪었다. 내가 모르는 건지 모르겠지만. string str; try { str = "test"; } catch(){ ... } out.println(str); 라는 형태의 소스가 있다고 하면 맨 마지막에 출력을 할 때 계속 에러가 나는 것이었다. 자꾸 보다보니 NullPoint에러가 나는 거 같은데 try문 안에서 넣은 변수의 처리가 계속 안되는 것 같았다. 자바를 오랜만에 해서 다 까먹은건가? 계속 헤매다가 알 수 없는 이유를 알게 되었다. 처음 변수 선언시 str값에 null이나 ""를 넣어줘서 초기화를 해주면 제대로 "test"값을 출력한다. 자바는 1.4버전이다.

    자바 웹 스타트

    자바 웹 스타트 자바 웹 스타르를 사용하면 그 애플리케이션은 처음에는 웹 브라우저에서 실행되지만 그 이후로는 부라우저에 얽매이지 않고 독립형 애플리케이션처럼 실행됩니다. 자바 웹 스타트의 작동원리 1. 클라이언트에서 JWS애플리케이션(.jnlp파일)에 대한 웹 페이지 링크를 클릭 2. 웹 서버(HTTP)에서 그 요청을 받은 다음 .jnlp파일을 돌려보냅니다. 3. 브라우저에 의한 자바 웹 스타트가 시작. JWS보조 애플리케이션에서는 .jnlp파일을 읽은 다음 서버에 MyApp.jar파일 요구 4. 웹 서버에서 요청받은 .jar파일을 제공. 5. 자바 웹 스타트에서 JAR를 받아서 지정된 main()메소드를 호출하여 애플리케이션을 시작. .jnlp 자바 웹 스타트 애플리케이션을 만들 때는 그 애플리케이션에..

    스트링 토큰

    import java.util.StringTokenizer; String str = "aa/bb/cc/dd/ee"; StringTokenizer st = new StringTokenizer(str, "/"); while(st.hasMoreTokens()){ System.out.println(st.nextToken()); }