- 실행중인 프로그램을 프로세스
- 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기반으로 만들어짐
컴포넌트(위젯)
1- 컨테이너
- 종류
- window
- Frame
- Dialog
- Panel
- 레이아웃 매니저 (작업영역을 분할하여 사용)
- window /Frame /Dialog : BoarderLayout default
- Panel : FlowLayout default
- 위젯
- 나머지 전부
- 방식
- 순차 처리
- 이벤트 구동방식 - 이벤트 없으면 아무동작 안함
- 구현순서
- Container : 프레임만듬
- JFrame (JFrame이 가장 널리 사용됨)
- layoutManager: 화면분할
- Absolute(=Null)
- Flow
- Grid
- Card
- Border
- ...
- additional Container : 추가 프레임 넣음
- JPanel
- Widget(=Component): 위젯 넣음
- JPanel
- JButton
- JToggleButton
- JTextField
- JTextArea
- Event: 위젯에 이벤트 붙임
- Event coding: 이벤트시 실행할 코딩
GUI Tool program
- WYSIWYG (What You See Is What You Get)
- window builder - eclipse plug-in
- www.eclipse.org/windowbuilder
- 공개소프트웨어라 안정적이지 못함 (주기적으로 저장하면서 그릴 것)
- 윈도우 빌더를 사용하면서 코딩을 직접 수정하면 윈도우 빌더가 인식 못할 수 있음, 작업을 마치고 추가작업을 하기를 권장함
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. 디자인탭을 클릭해서 디자인을 하면 자동으로 소스가 완성된다
댓글 없음:
댓글 쓰기