안경잡이개발자

728x90
반응형

▶ 순열 소스코드 예제

 

  n개에서 순서를 고려하여 r개를 뽑아 나열하는 모든 순열을 구하는 소스코드는 다음과 같습니다.

 

import java.util.*;

class Permutation {
    private int n;
    private int r;
    private int[] now; // 현재 순열
    private ArrayList<ArrayList<Integer>> result; // 모든 순열

    public ArrayList<ArrayList<Integer>> getResult() {
        return result;
    }

    public Permutation(int n, int r) {
        this.n = n;
        this.r = r;
        this.now = new int[r];
        this.result = new ArrayList<ArrayList<Integer>>();
    }

    public void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public void permutation(int[] arr, int depth) {
        // 현재 순열의 길이가 r일 때 결과 저장
        if (depth == r) {
            ArrayList<Integer> temp = new ArrayList<>();
            for (int i = 0; i < now.length; i++) {
                temp.add(now[i]);
            }
            result.add(temp);
            return;
        }
        for (int i = depth; i < n; i++) {
            swap(arr, i, depth);
            now[depth] = arr[depth];
            permutation(arr, depth + 1);
            swap(arr, i, depth);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9};
        int r = 3;

        Permutation perm = new Permutation(arr.length, r);
        perm.permutation(arr, 0);
        ArrayList<ArrayList<Integer>> result = perm.getResult();

        System.out.println("모든 순열의 수: " + result.size());
        for (int i = 0; i < result.size(); i++) {
            for (int j = 0; j < result.get(i).size(); j++) {
                System.out.print(result.get(i).get(j) + " ");
            }
            System.out.println();
        }
    }
}

 

  {1, 3, 5, 7, 9}에서 3개를 뽑는 모든 순열은 다음과 같습니다.

 

 

 

▶ 조합 소스코드 예제

 

  n개에서 순서를 고려하지 않고 r개를 뽑아 나열하는 모든 조합을 구하는 소스코드는 다음과 같습니다.

 

import java.util.*;

class Combination {
    private int n;
    private int r;
    private int[] now; // 현재 조합
    private ArrayList<ArrayList<Integer>> result; // 모든 조합

    public ArrayList<ArrayList<Integer>> getResult() {
        return result;
    }

    public Combination(int n, int r) {
        this.n = n;
        this.r = r;
        this.now = new int[r];
        this.result = new ArrayList<ArrayList<Integer>>();
    }

    public void combination(int[] arr, int depth, int index, int target) {
        if (depth == r) {
            ArrayList<Integer> temp = new ArrayList<>();
            for (int i = 0; i < now.length; i++) {
                temp.add(arr[now[i]]);
            }
            result.add(temp);
            return;
        }
        if (target == n) return;
        now[index] = target;
        combination(arr, depth + 1, index + 1, target + 1);
        combination(arr, depth, index, target + 1);
    }
}

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9};
        int r = 3;

        Combination comb = new Combination(arr.length, r);
        comb.combination(arr, 0, 0, 0);
        ArrayList<ArrayList<Integer>> result = comb.getResult();

        System.out.println("모든 조합의 수: " + result.size());
        for (int i = 0; i < result.size(); i++) {
            for (int j = 0; j < result.get(i).size(); j++) {
                System.out.print(result.get(i).get(j) + " ");
            }
            System.out.println();
        }
    }
}

 

  {1, 3, 5, 7, 9}에서 3개를 뽑는 모든 조합은 다음과 같습니다.

 

728x90
반응형

728x90
반응형

  이번 시간에도 지난 시간에 이어서 자바 FX(Java FX)를 이용한 서버 및 클라이언트 채팅 프로그램을 개발하도록 합시다. 이번 시간이 마지막 시간입니다. 클라이언트 프로그램의 GUI를 작업하도록 할 것입니다. 서버로 메시지를 전송하고, 서버로부터 메시지를 받는 전반적인 과정이 모두 그래픽 환경에서 출력될 것입니다. 클라이언트 프로그램 또한 프로그램 자체가 작고 디자인 구성요소가 별로 없다는 점에서 자바 소스코드로 간단하게 작성할 수 있을 것입니다.


  바로 클라이언트 프로그램을 실질적으로 작동시키는 start() 함수를 작업해보도록 하겠습니다.

 


  소스코드가 조금 긴 감이 있는데요. 클라이언트의 경우에는 UI 요소가 많기 때문에 어쩔 수 없습니다. 보시면 접속을 할 때 clientStart() 메소드를 실행해서 서버에 연결한 이후에 메시지를 전송하게 되면 서버로 send() 메소드를 이용해 통신하게 되는 것을 알 수 있습니다. 실행 결과는 다음과 같습니다.



  실제로 상용화를 위해서는 갖가지 예외 처리를 더욱 자세하게 해주어야 합니다. 일단 전반적인 작동이 원활히 이루어지는 것을 확인했으므로 프로젝트를 완료하겠습니다.

728x90
반응형

728x90
반응형

  이번 시간은 자바 FX(Java FX)를 이용한 서버 및 클라이언트 채팅 프로그램 개발하기의 네 번째 시간입니다. 바로 클라이언트 기능 모듈을 개발하는 것입니다. 일단 클라이언트 프로그램이라고 할 수 있는 Chat Client 프로젝트를 생성해주도록 합시다. 기본적으로 GUI 멀티 채팅 시스템에서 채팅 클라이언트(Chat Client) 프로그램은 서버로 접속하여 서버와 통신하는 구조를 가집니다. 바로 한 번 이클립스에서 JavaFX 프로젝트를 새롭게 생성하여 이름을 Chat Client라고 설정해줍시다. 서버 프로그램을 만들었을 때와 비슷하죠.



  바로 프로젝트를 생성해주겠습니다. JavaFX로요.



  위와 같이 이름을 Chat Client라고 설정해줍시다.



  이제 위와 같이 Main.java 클래스를 살펴보도록 합시다. 다음과 같이 틀을 잡아주세요.



  이제 바로 세부 메소드들을 작업해주도록 하겠습니다. 클라이언트 프로그램에서는 쓰레드 풀을 사용할 필요가 없기 때문에 기본적으로 Thread 클래스를 이용해서 쓰레드 모듈을 처리합니다.



  먼저 위와 같이 startClient() 메소드를 작업합니다. 클라이언트 프로그램을 동작하게 해주는 메소드입니다.



  이후에 서버로부터 메시지를 받거나 보내는 receive() 함수와 send() 함수를 작업해줍니다. 단순하게 InputStream과 OutputStream을 이용해서 서버와 통신하는 모듈이 작성된 것을 알 수 있습니다.



  이제 위와 같이 stopClient()를 작업해주시면 끝입니다.

728x90
반응형

728x90
반응형

  이번에 진행해 볼 미니 프로젝트는 자바 FX(Java FX)를 이용한 서버 및 클라이언트 채팅 프로그램 개발하기입니다. 자바 FX로 개발 된 프로그램으로는 무엇이 있을까요? 바로 대표적인 것이 이클립스(Eclipse) 개발환경입니다. 우리가 흔히 자바 프로그래밍을 연습하기 위해 사용하는 개발 도구인 이클립스 또한 사실은 자바로 개발되었다는 거죠. 알 바 아니라고요? 바로 시작해보도록 하겠습니다.


  기본적으로 서버와 클라이언트를 포함하는 프로그램이 있다면, 응당 서버와 클라이언트는 서로 다른 컴퓨터 환경에서 작동을 한다고 보시면 됩니다. 실제로 프로그램을 구현한 이후에는 서버 프로그램은 실제 서버(Server)에서 작동시키고, 클라이언트는 해당 서버에 접속을 하는 식으로 개발을 해야 하는 겁니다.


  또한 하나의 서버 프로그램은 여러 개의 서버를 구동시킬 수 있습니다. 하나의 서버 단위마다 쓰레드를 이용해서 작동시킬 수 있습니다. 이 때는 연결을 받아야 하는 것이므로 특정한 포트 번호를 설정시켜줘야 할 것입니다. 이후에 특정한 서버로 클라이언트가 접속하면 어떻게 처리할 수 있을까요? 바로 다음과 같이 해당 서버 쓰레드에서 단위 쓰레드를 클라이언트의 갯수만큼 만들어주어 클라이언트가 접속할 때마다 쓰레드를 실행하여 작동시킬 수 있습니다.



  다만 여기에서 단순하게 쓰레드만 돌리면 상당히 프로그램이 위험한 상태에 처할 수 있습니다. 그래서 일반적으로 쓰레드 풀(Thread Pool) 기법을 사용하여 쓰레드를 관리할 수 있습니다. 다음 시간부터 제대로 개발을 해 볼 건데요. 전체적인 구성은 바로 위와 같습니다. 우리는 서버 프로그램과 클라이언트 프로그램을 모두 개발할 것입니다. 실제로 만약에 이 프로그램을 배포한다면 개발자의 컴퓨터에서는 서버 프로그램을 돌릴 수 있고 다른 컴퓨터에서는 클라이언트 프로그램을 돌리면 됩니다.


  필요한 개발 도구는 다음과 같습니다.


  ▶ 이클립스 개발 환경: http://www.eclipse.org/



  ▶ JavaFX Scene Builder: http://www.oracle.com/technetwork/java/javafxscenebuilder-1x-archive-2199384.html



  ▶ 이클립스 JavaFX 플러그 인


728x90
반응형