2016년 6월 20일 월요일

10day java

프로세스(Process)

  • 실행중인 프로그램을 프로세스
    • CPU할당
    • 메모리 할당
  • 멀티프로세스 ( 멀티 태스킹)
    • foreground process
      • 전면부(눈에보이는 창)에서 실행되는 프로세스
    • background process
      • 후면부에서 실행되는 프로세스
      • 서비스 (데몬)
        • ex) 아파치 서버
  • 프로세스 안에 작은 프로그램 : 스레드
    • 스레드 풀(runnable) > 실행 (일지정지 가능) > 소멸
  • 멀티스레드
CUI (character user interface)
  • 명령 프롬프트에서 실행
  • =TUI (text user interface)
GUI (graphic user interface)
  • window GUI 배경 모든 프로그램
  • 2D graphic 기준 : 2D를 처리하는 라이브러리 씀
  • GUI tool
    • AWT (abstract window toolkit) : 옛날에 자바 2D 처리
      • java.awt. ...
    • Swing : 배울만 함 (AWT기반)
      • javax.swing. ..
      • 각 (J)위젯
      • JFC(Java foundation class)
        • 각 Widget 이름을 익혀야함
        • 테스트용 소스를 얻어두면 다루기 편함
    • Java FX : 화려한데 복잡함
    • SWT (standard widget toolkit) : IBM에서 만듬
      • 이클립스가 SWT기반으로 만들어짐
컴포넌트(위젯)

  • 컨테이너
    • 종류
      • window
      • Frame
      • Dialog
      • Panel
    • 레이아웃 매니저 (작업영역을 분할하여 사용)
      • window /Frame /Dialog : BoarderLayout default
      • Panel : FlowLayout default
  • 위젯
    • 나머지 전부
GUI
  • 방식
    • 순차 처리
    • 이벤트 구동방식 - 이벤트 없으면 아무동작 안함
  • 구현순서
    1. Container : 프레임만듬
      • JFrame (JFrame이 가장 널리 사용됨)
    2. layoutManager: 화면분할
      • Absolute(=Null)
      • Flow
      • Grid
      • Card
      • Border
      • ...
    3. additional Container : 추가 프레임 넣음
      • JPanel
    4. Widget(=Component): 위젯 넣음
      • JPanel
      • JButton
      • JToggleButton
      • JTextField
      • JTextArea
    5. Event: 위젯에 이벤트 붙임
    6. Event coding: 이벤트시 실행할 코딩

GUI Tool program
  • WYSIWYG (What You See Is What You Get)
  • window builder - eclipse plug-in
    • www.eclipse.org/windowbuilder
    • 공개소프트웨어라 안정적이지 못함 (주기적으로 저장하면서 그릴 것)
    • 윈도우 빌더를 사용하면서 코딩을 직접 수정하면 윈도우 빌더가 인식 못할 수 있음, 작업을 마치고 추가작업을 하기를 권장함



1
package pack1;

public class Come {
    public void come(){
     for(int i=1; i<=10; i++){
            System.out.println("come : "+ i);
        }
    }
}

package pack1;

public class Go {
    public void go(){
        for(int i=1; i<=10; i++){
            System.out.println("go : "+ i);
        }
    }
}

package pack1;

public class Main1 {

 public static void main(String[] args) {
  // 차례대로 실행됨
  Go g = new Go();
  Come c = new Come();
  
  g.go();
  c.come();
 }

}


2
package pack2;

public class Come extends Thread {
     @Override
    public void run() {
        // run 안에 내용을 쓰거나 호출을 하면 쓰레드
         this.come();
    }
     
    public void come(){
        for(int i=1; i<=10; i++){
            System.out.println("come : "+ i);
        }
    }
}

package pack2;

public class Go extends Thread {
    @Override
    public void run() {
        // 쓰레드에서 실행해야될 작업을 기술
        for(int i=1; i<=10; i++){
            System.out.println("go : "+ i);
        }
    }
}

package pack2;

public class MainEx {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Go g = new Go();
  Come c = new Come();
  
  //g.run(); //쓰레드 실행은 메소드 명이 아니라start()
  //c.run();
  //start() Thread Pool : runnable 상태로 만듦.  실행은 cpu가 시킴
  //실행할 때 마다 다르게 출력됨 //CPU가 알아서 처리함 //우선적으로 무엇을 처리해야 한다는 개념은 thread에 없음
  g.start();
  c.start();
 }

}


3
package pack3;

public class Come implements Runnable {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i=1; i<=10; i++){
            System.out.println("come : "+ i);
        }
    }

}

package pack3;

public class Go implements Runnable {

    @Override
    public void run() {
        for(int i=1; i<=10; i++){
            System.out.println("go : "+ i);
        }
    }
    
}

package pack3;

public class MainEx {

 public static void main(String[] args) {
  // runnable 인터페이스를 통한 쓰레드 실행
  Go g =new Go();
  Come c = new Come();
  
  Thread t1 = new Thread(g);
  Thread t2 = new Thread(c);
  
  t1.start();
  t2.start();
 }

}


4
package pack3;

class Al implements Runnable{ //Runnable을 구현하는 클래스

    @Override
    public void run() {
        System.out.println("\nHere in myThread!!");
        for(int i=0;i<100;i++){
            for(char ch = 'A'; ch<='z';ch++){
                System.out.print(ch);
            }
        }
    }
    
}

public class Round15 {

    public static void main(String[] args) {
        System.out.println("Main Thread!!");
        Al mt = new Al(); //Runnable 객체 생성
        Thread myth = new Thread(mt); //Thread 객체 생성
        myth.start(); //Thread 실행
        for(int i =1; i<1000; i++){
            System.out.print(i);
            if(i%10 ==0) System.out.println();
            else System.out.print("\t");
        }
        System.out.println("\nMain Thread Destroy!!");
    }

}


5
package pack3;

class A2 extends Thread{  //스레드를 상속 받은 클래스
    @Override
    public void run() {
        System.out.println("\nHere in myThread!!");
        for(int i=0;i<100;i++){
            for(char ch = 'A'; ch<='z';ch++){
                System.out.print(ch);
            }
        }
    }
}

public class Round16 {

    public static void main(String[] args) {
        System.out.println("Main Thread!!");
        A2 mt = new A2(); //객체 생성
        mt.start(); //Thread 실행
        for(int i =1; i<1000; i++){
            System.out.print(i);
            if(i%10 ==0) System.out.println();
            else System.out.print("\t");
        }
        System.out.println("\nMain Thread Destroy!!");
    }

}


6
package pack4;

public class MainEx {

    public static void main(String[] args) { //main도 쓰레드의 일종이다
        // Thread 우선순위를 지정하면 높은 우선순위의 일을 많은시간을 할당하여 처리함
        // 우선순위가 높다고 먼저 실행되거나 빨리 끝난다는 의미는 아님
        // 1~10까지 높은숫자가 높은 우선순위
        System.out.println(Thread.currentThread().getName());
        System.out.println(Thread.currentThread().getPriority());
        
        System.out.println(Thread.MAX_PRIORITY);
        System.out.println(Thread.NORM_PRIORITY);
        System.out.println(Thread.MIN_PRIORITY);
    }

}


7
package pack4;

class A4 extends Thread{
 @Override
 public void run() {
  System.out.println("Here is a Class A4 !!");
 }
}
class B4 implements Runnable{

 @Override
 public void run() {
  System.out.println("Here is a Class B4 !!");
 }
 
}

public class Round15 {

 public static void main(String[] args) {
  A4 ap = new A4();
  Thread bp = new Thread(new B4());
  ap.setPriority(3); // Thread의 우선순위를 설정 1~10까지 높은숫자가 높은 우선순위
  bp.setPriority(8);
  ap.start();
  bp.start();
 }

}


8
package pack5;

public class Gugudan implements Runnable {
    private int dan;
    
    public Gugudan(int dan) {
        this.dan = dan;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "스레드 시작"); //쓰레드의 이름값: getName
        for(int i=1; i<=9; i++){
            System.out.println(dan + " X " + i + " = "+ (dan*i));
        }
        System.out.println(Thread.currentThread().getName() + "스레드 끝");
    }

}

package pack5;

public class MainEx05 {

 public static void main(String[] args) {
  Thread t1 = new Thread(new Gugudan(3));
  Thread t2 = new Thread(new Gugudan(6));
  
  System.out.println("프로그램시작");
  
  t1.setName("3단 "); //스레드의 이름 지정
  t2.setName("6단 ");
  
  t1.start();
  t2.start();
  System.out.println("프로그램 끝");
  //스레드가 진행
 }

}


9
package pack6;

public class Gugudan implements Runnable {
    private int dan;
    
    public Gugudan(int dan) {
        this.dan = dan;
    }

    @Override
    public void run() {
        long sleepTime = (long)(Math.random()*500); //sleep 프로그램을 랜덤 밀리세컨드 동안 멈춤
        System.out.println(dan + "단이" +sleepTime + "sleep .."); 
        
        try {
            Thread.sleep(sleepTime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        for(int i=1; i<=9; i++){
            System.out.println(dan + " X " + i + " = "+ (dan*i));
        }
    }

}

package pack6;

public class MainEx06 {

 public static void main(String[] args) {
  Thread t1 = new Thread(new Gugudan(2));
  Thread t2 = new Thread(new Gugudan(3));
  Thread t3 = new Thread(new Gugudan(4));
  
  System.out.println("프로그램시작");
  
  t1.setName("3단 "); //스레드의 이름 지정
  t2.setName("6단 ");
  
  t1.start();
  t2.start();
  t3.start();
  
  System.out.println("count = " +Thread.activeCount()); //현재 프로그램이 실행중인 상태에서 스레드의 총 개수를 알수있음
  
  System.out.println("프로그램 끝");
  //스레드가 진행됨
 }

}


10
package pack5;

public class round5 {

    public static void main(String[] args) {
        int count = Thread.activeCount();  //현재 프로그램이 실행중인 상태에서 스레드의 총 개수를 알수있음
        System.out.println("count = " + count);
        Thread cur = Thread.currentThread(); //실행중인 쓰레드를 객체로 담아 둘 수 있음
        System.out.println("cur = "+cur);
        System.out.println("cur name = "+ cur.getName()); //객체에 담아둔 스레드의 이름을 출력함
        try{
            Thread.sleep(2000); //클래스의 시간지연 메서드 : 모든 스레드를 2초간 멈춤, CPU유후상태가 됨
        }catch(InterruptedException ie){ //CPU유후상태 일때 외부스레드 침범이나, 명령에 스레드 종료되는 상태 확인위해 예외처리
            System.out.println("이거 실행된느 경우는 없음");
        }
        System.out.println("cur priority = " + cur.getPriority()); //스레드 우선순위 출력
        System.out.println("cur alive = " +cur.isAlive()); //객체가 아직 유효한지 출력
        System.out.println("cur deamon = " + cur.isDaemon()); //객체가 main스레드에 종속적인 스레드인지 확인
    }

}


11
package pack6;

public class Gugudan implements Runnable {
    private int dan;
    
    public Gugudan(int dan) {
        this.dan = dan;
    }

    @Override
    public void run() {
        for(int i=1; i<=9; i++){
            System.out.println(dan + " X " + i + " = "+ (dan*i));
        }
    }

}

package pack6;

public class MainEx06 {

 public static void main(String[] args) {
  Thread t1 = new Thread(new Gugudan(2));
  Thread t2 = new Thread(new Gugudan(3));
  Thread t3 = new Thread(new Gugudan(4));
  
  System.out.println("프로그램시작");
  
  
  t1.setDaemon(true); //독립스레드가 아니면 끝까지 실행을 보장하지 않음
  t2.setDaemon(true);
  
  t1.start();
  t2.start();
  t3.start();
  
  //System.out.println(t1.isDaemon());
  //System.out.println(t2.isDaemon());
  
  System.out.println("프로그램 끝");
  //스레드가 진행됨
 }

}


12
package pack8;

//통장
public class Account {
    //잔고
    int balance = 1000;
    
    //인출
    //공유자원문제를 해결함synchronized //메소드, { } 에 선언가능함
    public synchronized void withdraw(int money){ 
        //메소드에 synchronized 선언을 해주면 스레드가 순서대로 들어감
        if(balance >= money){ //잔고가 인출액보다 커야지 인출함
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            balance -= money;
        }
    }
}

package pack8;

public class User implements Runnable {
    Account account = null;
    
    public User(Account account) {
        this.account = account;
    }
    
    @Override
    public void run() {
        while(account.balance >0){
            //money 100, 200, 300을 랜덤으로 초기화
            int money = (int)(Math.random()*3+1)*100;
            account.withdraw(money);
            System.out.println("통장잔고 : " +account.balance);
        }
    }

}

package pack8;

public class MainEx08 {

 public static void main(String[] args) {
  // 공유자원 문제를 해결하지 않으면 -값이 출력됨
  Account acc = new Account();
  User user1 = new User(acc); //user1,2가 acc를 공유자원으로 가짐
  User user2 = new User(acc);
  
  Thread t1 = new Thread(user1);
  Thread t2 = new Thread(user2);
  
  t1.start();
  t2.start();
 }

}



13
자바에서 제공하는 API중에 SwingSet2를 보면 다양한 종류의 소스를 제공하고 있다
아래화면은 ButtonDemo소스를 실행시켰을 때 나오는 화면과
TreeDemo소스를 실행시켰을 때 나오는 화면


14
import javax.swing.JFrame;

public class JframeEx01 {

 public static void main(String[] args) {
  // 프레임
  //JFrame frame = new JFrame();
  JFrame frame = new JFrame("새로운창"); //프레임 제목
  
  //frame.setBounds(0, 0, 300, 300); //위치와 크기의 결합 /픽셀 단위
  frame.setLocation(0, 0);
  frame.setSize(300, 300);
  
  frame.setResizable(false); //프레임 크기변환 못하도록 옵션
  
  frame.setVisible(true);
 }

}


15
import java.awt.Dimension; //사각형 영역을 관리하기 편하도록 만들어지 클래스
import java.awt.Toolkit;

import javax.swing.JFrame;

public class JframeEx0101 {

 public static void main(String[] args) {
  // 프레임 화면중간에 띄우기
  JFrame frame = new JFrame();
  frame.setBounds(0, 0, 300, 300);
  
  Dimension dimen = Toolkit.getDefaultToolkit().getScreenSize(); //스크린넓이 측정해 Dimension객체생성
  Dimension dimen2 = frame.getSize(); //프레임 넓이로Dimemsion 객체생성
  int xpos = (int)(dimen.getWidth() / 2 -dimen2.getWidth()/2); //화면 중간까지 길이 - 프레임 중간까지 길이
  int ypos = (int)(dimen.getHeight() / 2 -dimen2.getHeight()/2);
  frame.setLocation(xpos, ypos);
  
  frame.setVisible(true);
 }

}


16
import javax.swing.JFrame;

public class UserFrame extends JFrame {
 //생성자로 디폴트값 변경
 public UserFrame() {
  this.setTitle("새로운 윈도우");
  this.setSize(600, 800);
 }
}


public class JframeEx02 {

 public static void main(String[] args) {
  // JFrame을 상속 받아서 재정의한 UserFrame으로 프레임을 만드는 것이 가능함
  UserFrame frame = new UserFrame();
  frame.setVisible(true);
 }

}


17
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;


public class BoarderLayoutEx01 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  JFrame frame = new JFrame();
  
  //JFrame default 는 BoarderLayout : 동,서,남,북,중앙 (5개)의 레이아웃 가짐
  JButton btn1 = new JButton("1");
  JButton btn2 = new JButton("2");
  JButton btn3 = new JButton("3");
  JButton btn4 = new JButton("4");
  JButton btn5 = new JButton("5");
  JButton btn6 = new JButton("6");
  
  frame.add(btn1, BorderLayout.NORTH);
  frame.add(btn6, BorderLayout.NORTH); //오버라이딩 됨 //레이아웃에 두개를 넣을 수 없음
  
  frame.add(btn2, BorderLayout.SOUTH);
  frame.add(btn3, BorderLayout.EAST);
  frame.add(btn4, BorderLayout.WEST);
  frame.add(btn5, BorderLayout.CENTER);
  
  frame.setBounds(100, 100, 300, 300);
  frame.setVisible(true);
 }

}


18
1. http://www.eclipse.org/windowbuilder/download.php 사이트에서 windowbuilder 소스를 복사한다

2. 이클립스에 windowBuilder 소프트웨어를 설치한다


3. 클래스를 만들 때 other을 이용하여서 만든다


4. 디자인탭을 클릭해서 디자인을 하면 자동으로 소스가 완성된다


댓글 없음:

댓글 쓰기