Power JJava
제16장 스레드
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•스레드의 개요 •스레드의 생성과 실행 •스레드 상태 •스레드의 스케줄링 •스레드간의 조정
© 2009 인피니티북스 All rights reserved
스레드는 동시에 여러 개의 프로그램을 실행하는 효과를 냅니다.
병렬 처리
© 2009 인피니티북스 All rights reserved
스레드란? • 다중 스레딩(multi-threading)은 하나의 프로그램이 동시에 여러 가 지 작업을 할 수 있도록 하는 것 • 각각의 작업은 스레드(thread)라고 불린다.
© 2009 인피니티북스 All rights reserved
프로세스와 스레드 • 프로세스(process): 자신만의 데이터를 가진다. • 스레드(thread): 동일한 데이터를 공유한다.
© 2009 인피니티북스 All rights reserved
스레드를 사용하는 이유 • 웹 브라우저에서 웹 페이지를 보면서 동시에 파일을 다운로드할 수 있도록 한다. • 워드 프로세서에서 문서를 편집하면서 동시에 인쇄한다. • 게임 프로그램에서는 응답성을 높이기 위하여 많은 스레드를 사용한 다. • GUI에서는 마우스와 키보드 입력을 다른 스레드를 생성하여 처리한 다.
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 스레드와 프로세스의 결정적인 차이점은 무엇인가? 2. 스레드를 사용해야만 하는 프로그램을 생각하여 보자. 3. 다중 스레딩에서 발생할 수 있는 문제에는 어떤 것들이 있을까? 추측 하여 보라.
© 2009 인피니티북스 All rights reserved
스레드 생성과 실행 • 스레드는 Thread 클래스가 담당한다.
© 2009 인피니티북스 All rights reserved
스레드를 생성하는 방법
Thread 클래스를 상속하는 방법
스레드 생성 방법
R Runnable bl 인터페이스를 구현하는 방법
© 2009 인피니티북스 All rights reserved
Thread 클래스를 상속하는 방법
© 2009 인피니티북스 All rights reserved
Runnable 인터페이스를 구현하는 방법
Thread 객체 = 일꾼
Runnable 객체 = 작업의 내용
© 2009 인피니티북스 All rights reserved
Runnable 인터페이스를 구현하는 방법
© 2009 인피니티북스 All rights reserved
어떤 방법이 좋은가? • 자바에서 다중 상속이 불가능한 것을 감안한다면 Runnable 인터페이 스를 사용하는 것이 좋다. • Runnable 인터페이스를 사용하면 고수준의 스레드 관리 API도 사용 할 수 있다. Runnable 구현 Thread 상속
© 2009 인피니티북스 All rights reserved
예제
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 스레딩을 담당하는 클래스의 이름은? 2. Thread를 상속받는 방법의 문제점은 무엇인가?
© 2009 인피니티북스 All rights reserved
스레드 상태
© 2009 인피니티북스 All rights reserved
생성 상태와 실행 가능 상태 • 생성 상태 • Thread 클래스를 이용하여 새로운 스레드를 생성 • start()는 생성된 스레드를 시작 • stop()은 t ()은 생성된 스레드를 멈추게 한다. 한다 • 실행 가능 상태 • 스레드가 스케줄링 큐에 넣어지고 스케줄러에 의해 우선순위에 따라 실행
© 2009 인피니티북스 All rights reserved
실행 중지 상태 • 실행 가능한 상태에서 다음의 이벤트가 발생하면 실행 중지 상태로 된다. • 스레드나 다른 스레드가 suspend()를 호출하는 경우 • 스레드가 wait()를 호출하는 경우 • 스레드가 sleep()을 호출하는 경우 • 스레드가 입출력 작업을 하기 위해 대기하는 경우
© 2009 인피니티북스 All rights reserved
강제적인 종료
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. Thread의 run() 메소드의 역할은? 2. Thread의 start(), stop() 메소드의 역할은? 3. 어떤 일이 발생하면 스레드가 실행 중지 상태로 가는가?
© 2009 인피니티북스 All rights reserved
스레드 스케줄링
© 2009 인피니티북스 All rights reserved
동기화 • 동기화(synchronization): 한 번에 하나의 스레드 만이 공유 데이터를 접근할 수 있도록 제어하는 것이 필요 • 예제:
공유되는 데이터
© 2009 인피니티북스 All rights reserved
은행 계좌
© 2009 인피니티북스 All rights reserved
사용자
© 2009 인피니티북스 All rights reserved
BankTest 클래스
© 2009 인피니티북스 All rights reserved
오류가 발생하는 원인 • 오류가 발생하는 여러 가지의 경우가 있지만 그 중의 하나는 다음과 같다.
스레드 one의 저금은 없어진다.
© 2009 인피니티북스 All rights reserved
동기화 문제
하나의 스레드가 공유 데이터를 용 다른 사용하면 스레드가 사용하지 못하게 해야 합니다.
© 2009 인피니티북스 All rights reserved
동기화 메소드 • 자바가 제공하는 동기화 방법
한순간에 하나의 스레드만을 허용 © 2009 인피니티북스 All rights reserved
스레드간의 조정 • 만약 두개의 스레드가 데이터를 주고 받는 경우에 발생
© 2009 인피니티북스 All rights reserved
Buffer 클래스 • 생산자와 소비자가 공유
© 2009 인피니티북스 All rights reserved
생산자 클래스
© 2009 인피니티북스 All rights reserved
소비자 클래스
© 2009 인피니티북스 All rights reserved
테스트 클래스
생산이 너무 빠름 !!
소비가 너무 빠름!!
© 2009 인피니티북스 All rights reserved
wait()와 () notify() y()
© 2009 인피니티북스 All rights reserved
생산자/소비자 문제에 적용
© 2009 인피니티북스 All rights reserved
생산자/소비자 문제 해결
© 2009 인피니티북스 All rights reserved
생산자/소비자 문제 해결
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. wait()와 notify() 메소드는 왜 필요한가? 2. wait()는 어떤 역할을 하는가? 3. notify()는 어떤 역할을 하는가?
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제17장 그래픽 사용자 인터페이스
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•그래픽 사용자 인터페이스 •스윙의 소개 •컨테이너 •GUI 작성 절차 •기초 컴포넌트
© 2009 인피니티북스 All rights reserved
그래픽을 사용하여서 사용자 인터페이스를 만들어봅시다.
그래픽 사용자 인터페이스 • 그래픽 사용자 인터페이스(Graphical User Interface, 간단히 GUI) • 컴포넌트들로 구성
© 2009 인피니티북스 All rights reserved
자바에서 GUI의 종류
GUI
AWT(Abatract Windows Toolkit) AWT는 운영 체제가 제공하는 자원을 이용하여서 컴포넌트를 생성
SWING
© 2009 인피니티북스 All rights reserved
컴포넌트가 자바로 작성되어 있기 때문에 어떤 플랫폼에서도 일관된 화면을 보여줄 수 있다. 있다
AWT와 스윙
© 2009 인피니티북스 All rights reserved
AWT와 SWING의 비교
© 2009 인피니티북스 All rights reserved
AWT와 스윙
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 그래픽 사용자 인터페이스를 구성하는 요소들을 무엇이라고 하는가? 2. AWT와 스윙의 차이점은 무엇인가?
© 2009 인피니티북스 All rights reserved
스윙
© 2009 인피니티북스 All rights reserved
스윙의 특징 • 스윙 GUI 컴포넌트 • 형식화된 텍스트 입력이나 패스워드 필드 동작과 같은 복잡한 기 능들이 제공된다. • 자바 2D API • 그림이나 이미지, 애니메이션 기능을 제공한다. • 교체가능한 룩앤필(Look-and-Feel) 지원 • 데이터 전송 • 자르기, 복사, 붙이기, 드래그앤 드롭 등의 데이터 전송 기능 제 공 ( ) 되풀이(redo) ( ) 기능을 손쉽게 제공 • 되돌리기(undo)와
© 2009 인피니티북스 All rights reserved
스윙 패키지
© 2009 인피니티북스 All rights reserved
스윙의 클래스 구조 Object Object
Component Component
Container Container
Window Window Frame Frame JFrame JFrame
© 2009 인피니티북스 All rights reserved
JComponent JComponent JPanel JPanel
JLabel JLabel
… …
컨테이너와 컴포넌트 • 기본 컴포넌트 • JButton, JLabel, JCheckbox, JChoice, JList, JMenu, JTextField, JScrollbar, JTextArea, JCanvas 등이 여기에 속한다. • 컨테이너 컴포넌트 • 다른 컴포넌트를 안에 포함할 수 있는 컴포넌트로서 JFrame, JDialog, JApplet, JPanel, JScrollPane 등이 여기에 속한다.
© 2009 인피니티북스 All rights reserved
컨테이너의 종류
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 컨테이너는 어떤 기능을 하는가? 2. 최상위 컨테이너의 특징은? 최상위 컨테이너에 속하는 클래스들을 나열하라.
© 2009 인피니티북스 All rights reserved
GUI 작성 절차
© 2009 인피니티북스 All rights reserved
프레임 생성 #1 JFrame의 객체 생성
© 2009 인피니티북스 All rights reserved
프레임 생성 #2 Jframe을 상속하여서 MyFrame을 정의
MyFrame의 객체 생성
© 2009 인피니티북스 All rights reserved
프레임 생성 #3 Jframe을 상속하여서 MyFrame을 정의
main()이 MyFrame 안으로 이동
© 2009 인피니티북스 All rights reserved
컴포넌트 생성과 추가 컴포넌트 생성 및 추가
© 2009 인피니티북스 All rights reserved
컴포넌트 생성과 추가 배치 관리자 설정!
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 버튼이 있는 프레임을 생성하는 절차를 설명하라. 2. 프레임에 버튼을 두 개 추가하려면 어떻게 해야 하는가?
© 2009 인피니티북스 All rights reserved
기초 컴포넌트 • • • • •
프레임(frame) 패널(panel) 레이블(label) 버튼(b tt ) 버튼(button) 텍스트 필드(text field)
© 2009 인피니티북스 All rights reserved
프레임 • 메뉴를 불일 수 있는 윈도우
© 2009 인피니티북스 All rights reserved
패널 • 패널(panel)은 컴포넌트들을 가질 수 있는 컨테이너
© 2009 인피니티북스 All rights reserved
패널의 메소드
© 2009 인피니티북스 All rights reserved
레이블 • 레이블은 편집이 불가능한 텍스트를 표시. • (예) JLabel label = new JLabel(“안녕하세요?”);
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
버튼 • 버튼은 사용자가 클릭했을 경우, 이벤트를 발생하여 원하는 동작을 하게 하는데 이용된다
© 2009 인피니티북스 All rights reserved
예제
© 2009 인피니티북스 All rights reserved
텍스트 필드 • 텍스트 필드(text field)는 입력이 가능한 한 줄의 텍스트 필드를 만 드는 데 사용
© 2009 인피니티북스 All rights reserved
예제
텍스트 필드 생성
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제18장 이벤트 처리
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•이벤트 처리의 개요 •이벤트 •액션 이벤트 •Key, Mouse, MouseMotion •어댑터 클래스
© 2009 인피니티북스 All rights reserved
버튼을 누르면 반응하도록 만들어 봅시다.
이번 장의 목표 • 버튼을 누르면 버튼의 텍스트가 변경되게 한다.
© 2009 인피니티북스 All rights reserved
이벤트 처리 과정
© 2009 인피니티북스 All rights reserved
이벤트 처리 과정 (1) 이벤트를 발생하는 컴포넌트를 생성하여야 한다.
© 2009 인피니티북스 All rights reserved
이벤트 처리 과정 (2) 이벤트 리스너 클래스를 작성한다.
© 2009 인피니티북스 All rights reserved
이벤트 처리 과정 (3) 이벤트 리스너를 이벤트 소스에 등록한다.
이벤트 리스너를 컴포넌트에 붙인다.
© 2009 인피니티북스 All rights reserved
프로그램 결과
© 2009 인피니티북스 All rights reserved
이벤트 처리기를 어디에… (1) 별도의 클래스로 이벤트 처리기를 작성: 앞의 예제
이벤트 처리기 의 위치
(2) 내부 클래스로 이벤트 처리기를 작성
((3)) 프레임 레임 클래 클래스가 가 이벤 이벤트 처리기 처리기도 함께 구현
© 2009 인피니티북스 All rights reserved
내부 클래스 사용 방법 • 만약 MyListener라는 클래스를 별도의 클래스로 하면 MyFrame 안의 멤버 변수들을 쉽게 사용할 수 없다. • 일반적으로 MyListener 클래스를 내부 클래스로 만든다. 만든다
© 2009 인피니티북스 All rights reserved
내부 클래스를 사용하는 버전 import javax.swing.*; import java.awt.event.*; public class MyFrame extends JFrame { private JButton button; public MyFrame() { this.setSize(300, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("이벤트 예제"); JPanel panel = new JPanel(); button = new JButton("버튼을 누르시오"); button.addActionListener(new MyListener()); panel.add(button); this.add(panel); this.setVisible(true); ( ); } © 2009 인피니티북스 All rights reserved
내부 클래스를 사용하는 버전 private class MyListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getSource() == button) { button.setText("버튼이 눌려졌습니다"); } } } } public class MyFrameTest { public static void main(String[] args) { MyFrame t = new MyFrame(); } }
© 2009 인피니티북스 All rights reserved
내부 클래스
MyFrame에서 y 이벤트도 처리하는 방법 • 더 많이 사용되는 방법은 MyFrame 클래스가 JFrame을 상속받으면 서 동시에 ActionListener 인터페이스도 구현하는 경우이다.
© 2009 인피니티북스 All rights reserved
MyFrame이 y 이벤트도 처리 import javax.swing.*; import java.awt.event.*; class MyFrame extends JFrame implements ActionListener { private JButton button; public MyFrame() { this.setSize(300, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("이벤트 예제"); JPanel panel = new JPanel(); button = new JButton("버튼을 누르시오"); button.addActionListener(this); panel.add(button); this.add(panel); this.setVisible(true); ( ); } © 2009 인피니티북스 All rights reserved
이벤트도 처리
MyFrame이 y 이벤트도 처리 public void actionPerformed(ActionEvent e) { if (e.getSource() == button) { button.setText("버튼이 눌려졌습니다"); } } } public class MyFrameTest1 { public static void main(String[] args) { MyFrame t = new MyFrame(); } }
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 사용자가 버튼을 누르면 무엇이 발생하는가? 2. 이벤트를 처리하는 클래스를 무엇이라고 하는가? 3. 내부 클래스를 사용하는 장점은 무엇인가?
© 2009 인피니티북스 All rights reserved
이벤트의 분류 #1
© 2009 인피니티북스 All rights reserved
이벤트의 분류 #2 • 스윙 컴포넌트에 의하여 지원되는 이벤트는 크게 두 가지의 카테고 리로 나누어진다.
모든 컴포넌트가 지원하는 이벤트 이벤트
일부 컴포넌트가 지원하는 이벤트
© 2009 인피니티북스 All rights reserved
모든 컴포넌트가 지원하는 이벤트
© 2009 인피니티북스 All rights reserved
일부 컴포넌트가 지원하는 이벤트
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
Action 이벤트 • 사용자가 버튼을 클릭하는 경우 • 사용자가 메뉴 항목을 선택하는 경우 • 사용자가 텍스트 필드에서 엔터키를 누르는 경우
© 2009 인피니티북스 All rights reserved
액션 이벤트 예제 import javax.swing.*; import java.awt.Color; import java.awt.event. java awt event *;; class MyFrame extends JFrame { private JButton button1; private JButton button2; private JPanel panel; public bli MyFrame() M F () { this.setSize(300, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("이벤트 this.setTitle( 이벤트 예제 예제"); ); panel = new JPanel(); button1 = new JButton("노란색"); button1.addActionListener(new MyListener()); panel.add(button1); button2 = new JButton("핑크색"); button2.addActionListener(new MyListener()); panel.add(button2); l dd(b tt 2) this.add(panel); this.setVisible(true); © 2009 인피니티북스 All rights reserved }
액션 이벤트 예제 private class MyListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getSource() == button1) { panel.setBackground(Color.YELLOW); } else if (e.getSource() == button2) { panel.setBackground(Color.PINK); } } } } public class MyFrameTest2 { public static void main(String[] args) { MyFrame t = new MyFrame(); } }
© 2009 인피니티북스 All rights reserved
결과 화면
© 2009 인피니티북스 All rights reserved
이벤트 발생원의 식별 •
getSource()메소드를 이용하여 이벤트를 발생시킨 객체를 식별한다.
•
getId() 메소드를 이용하여 이벤트의 타입을 식별한다.
•
getActionCommand()메소드를 이용하여 이벤트를 발생시킨 컴포넌트 이름 을 식별한다.
public void actionPerformed(ActionEvent e) { if (e.getSource () == button1){ … } }
© 2009 인피니티북스 All rights reserved
Keyy 이벤트 • KeyListener 인터페이스 구현
KeyListener 인터페이스 메소드
설명
k keyTyped(KeyEvent d( e))
사용자가 글자를 입력했을 경우에 호출
keyPressed(KeyEvent e)
사용자가 키를 눌렀을 경우에 호출
keyReleased(KeyEvent y ( y e))
사용자가 키에서 손을 떼었을 경우에 호 출
© 2009 인피니티북스 All rights reserved
키보드 이벤트 예제 import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyFrame extends JFrame implements KeyListener { // (1) public MyFrame() { setTitle("이벤트 예제"); setSize(300, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField tf = new JTextField(20); tf.addKeyListener(this); // (2) add(tf); setVisible(true); } © 2009 인피니티북스 All rights reserved
키보드 이벤트 처리기를 붙인다.
액션 이벤트 예제 public void keyTyped(KeyEvent e) { // (3) display(e, "KeyTyped "); } public void keyPressed(KeyEvent e) { display(e "KeyPressed display(e, KeyPressed "); ); } public void keyReleased(KeyEvent e) { display(e, "Key Pressed "); } protected t t d void id display(KeyEvent di l (K E t e, String St i s)) { char c = e.getKeyChar(); int keyCode = e.getKeyCode(); String modifiers = e.isAltDown() + " " + e.isControlDown() + " " + e.isShiftDown(); System.out.println(s + " " + c + " " + keyCode + " " + modifiers); } } © 2009 인피니티북스 All rights reserved
실행 결과
© 2009 인피니티북스 All rights reserved
Mouse 이벤트
MouseListener 인터페이스 메소드
설명
mouseClicked(MouseEvent e)
사용자가 컴포넌트를 마우스로 클릭한 경우 에 호출된다.
mouseEntered(MouseEvent e)
마우스 커서가 컴포넌트의 경계안으로 커서 가 들어가면 호출된다.
mouseExited(MouseEvent e)
마우스 커서가 컴포넌트의 경계밖으로 커서 가 나가면 호출된다. 호출된다
mousePressed(MouseEvent e)
마우스가 컴포넌트위에서 눌려지면 호출된 다.
mouseReleased(MouseEvent R l d(M E t e))
마우스가 컴포넌트위에서 떼어지면 호출된 다.
© 2009 인피니티북스 All rights reserved
MouseMotion 이벤트 메소드
설명
mouseDragged(MouseEvent e)
마우스 버튼을 누른 채로 마우스를 이동 하는 경우에 호출된다.
mouseMoved(MouseEvent M d(M E e))
마우스 버튼을 누르지 않고 마우스를 이 동하는 경우에 호출된다.
© 2009 인피니티북스 All rights reserved
마우스 이벤트 예제 import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyFrame extends JFrame implements MouseListener, MouseMotionListener { public MyFrame() { setTitle("Mouse Event"); setSize(300, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.addMouseListener(this); p panel.addMouseMotionListener(this); ( ); add(panel); setVisible(true);
마우스 이벤트 처리기를 붙인다.
} © 2009 인피니티북스 All rights reserved
마우스 이벤트 예제 public void mousePressed(MouseEvent e) { displa ("Mo display( Mouse se pressed (# of clicks: " + e.getClickCount() e getClickCo nt() + ")" ) , e); } public void mouseReleased(MouseEvent e) { display("Mouse released (# of clicks: " + e.getClickCount() + ")", e); } public void mouseEntered(MouseEvent e) { display("Mouse entered", e); } public void mouseExited(MouseEvent e) { display("Mouse exited", e); } public void mouseClicked(MouseEvent e) { display("Mouse clicked (# of clicks: " + e.getClickCount() + ")", e); } © 2009 인피니티북스 All rights reserved
마우스 이벤트 예제 protected void display(String s, MouseEvent e) { S stem o t println(s + " X= System.out.println(s X " + e.getX() e getX() + " Y= Y " + e.getY()); e getY()); } public void mouseDragged(MouseEvent e) { display("Mouse dragged", e); } public void mouseMoved(MouseEvent e) { display("Mouse moved", e); } } public class MyFrameTest5 p y { public static void main(String[] args) { MyFrame f=new MyFrame(); } } © 2009 인피니티북스 All rights reserved
실행 결과
© 2009 인피니티북스 All rights reserved
마우스의 좌표를 얻으려면? (x, y) MouseEvent 클래스 메소드
설명
int getClickCount()
빠른 연속적인 클릭의 횟수를 반환한다. 예를 들어 2이면 더 블 클릭을 의미한다.
int getX() i t getY() int tY() Point getPoint()
이벤트가 발생했을 당시의 (x,y) 위치를 반환한다. 위치는 컴포넌트에 상대적이다.
int getXOnScreen() int g getYOnScreen() () int getLocationOnScreen()
절대 좌표 값 (x,y)을 반환한다. 이들 좌표값은 가상 화면에 상대적이다 상대적이다.
int getButton()
어떤 마우스 버튼의 상태가 변경되었는지를 반환한다. NOBUTTON, BUTTON1, BUTTON2, BUTTON3 중의 하나 이다. 이다
boolean isPopupTrigger()
마우스 이벤트가 팝업 메뉴를 나타나게 하면 true를 반환한 다.
String getMouseModifiersText(int)
이벤트 도중의 수식키와 마우스 버튼을 기술하는 설명문을 반환한다.
© 2009 인피니티북스 All rights reserved
어댑터 클래스 • 인터페이스의 경우, 모든 메소드를 구현하여야 한다. • 어댑터 클래스(Adaptor Class)를 사용하면 원하는 메소드 만을 구현 하는 것이 가능해진다 인터페이스
어댑터 클래스
ComponentListener
ComponentAdapter
ContainerListener
ContainerAdapter
FocusListener
FocusAdater
KeyListener
KeyAdapter
MouseListener
MouseAdapter
MouseMotionListener
MouseMotionAdapter
WindowListener
WindowAdapter
© 2009 인피니티북스 All rights reserved
리스너를 사용하는 경우
© 2009 인피니티북스 All rights reserved
어댑터를 사용하는 경우
© 2009 인피니티북스 All rights reserved
마우스 이벤트 예제 import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; class MyFrame extends JFrame { public MyFrame() { setSize(300, 200); setTitle("My Frame"); addWindowListener(new MyWindowAdaptor()); setVisible(true); }
내부 클래스 정의
class MyWindowAdaptor extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } }
© 2009 인피니티북스 All rights reserved
마우스 이벤트 예제 public class MyFrameTest6 { public static void main(String args[]) { MyFrame w = new MyFrame(); } }
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제19장 배치 관리자
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•배치 관리자의 개요 •배치 관리자의 사용 •FlowLayout •BorderLayout •GridLayout •BoxLayout •CardLayout •절대 절대 위치로 위치 배치
© 2009 인피니티북스 All rights reserved
컨테이너 안에서 컴포넌트를 배치하는 방법에 대하여 살펴봅시다.
배치 관리자(layout ( y manager) g ) • 컨테이너 안의 각 컴포넌트의 위치와 크기를 결정하는 작업
© 2009 인피니티북스 All rights reserved
[3/70]
상당히 다르게 보인다. • 배치 관리자에 따라서 상당히 다르게 보인다.
© 2009 인피니티북스 All rights reserved
[4/70]
배치 관리자의 종류 BorderLayout
BoxLayout
CardLayout
© 2009 인피니티북스 All rights reserved
배치 관리자의 종류 FlowLayout
GridBagLayout
G idL GridLayout t
© 2009 인피니티북스 All rights reserved
배치 관리자의 설정 1.
생성자를 이용하는 방법 JPanel panel = new JPanel(new BorderLayout());
2 2.
setLayout() 메소드 이용 panel.setLayout(new FlowLayout());
© 2009 인피니티북스 All rights reserved
크기와 정렬 힌트 • 프로그래머가 컴포넌트의 크기와 힌트를 배치 관리자에게 주고 싶은 경우에는 setMinimumSize(), setPreferredSize(), setMaximumSize() 메소드를 사용 • (예) component.setMaximumSize(new Dimension(Integer.MAX_VALUE,Integer.MAX_VALUE));
© 2009 인피니티북스 All rights reserved
FlowLayout y • 컴포넌트들을 왼쪽에서 오른쪽으로 버튼을 배치한다. • 패널과 애플릿의 디폴트 배치 관리자이다.
© 2009 인피니티북스 All rights reserved
FlowLayout y 예제 import java.awt.*; import javax.swing.*; class MyFrame extends JFrame { public MyFrame() { setTitle("FlowLayoutTest"); tTitl ("Fl L tT t") setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel; p ; // 패널을 생성하고 배치 관리자를 FlowLayout으로 설정 panel = new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.CENTER)); // 패널에 버튼을 생성하여 추가 panel.add(new JButton("Button1")); panel.add(new JButton("Button2")); panel.add(new p ( JButton("Button3")); ( )); panel.add(new JButton("B4")); panel.add(new JButton("Long Button5")); add(panel); pack(); setVisible(true); © 2009 인피니티북스 All rights reserved }
BorderLayout y • BorderLayout은 5개의 영역으로 구분하고 각각의 영역에 컴포넌트 를 배치
•PAGE_START PAGE START (또는 NORTH) •PAGE_END (또는 SOUTH) •LINE_START (또는 WEST) •LINE END (또는 EAST) •LINE_END •CENTER
© 2009 인피니티북스 All rights reserved
BorderLayout y 예제 import java.awt.*; import javax.swing.*; class MyFrame extends JFrame { public MyFrame() { setTitle("BorderLayoutTest"); tTitl ("B d L tT t") setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 프레임은 레임은 디폴 디폴트로 BorderLayout y 이므로 사실은 불필 이 불필요 setLayout(new BorderLayout()); // 버튼을 추가한다. add(new dd( JB tt ("C t ") B JButton("Center"), BorderLayout.CENTER); d L t CENTER) add(new JButton("Line Start"), BorderLayout.LINE_START); add(new JButton("Line End"), BorderLayout.LINE_END); add(new ( JButton("Page ( g Start"), ), BorderLayout.PAGE_START); y _ ); add(new JButton("Page End"), BorderLayout.PAGE_END); pack(); setVisible(true); } }
© 2009 인피니티북스 All rights reserved
GridLayout y • GridLayout은 컴포넌트들을 격자 모양으로 배치한다.
© 2009 인피니티북스 All rights reserved
GridLayout y 예제 import java.awt.*; import javax.swing.*; class MyFrame extends JFrame { public MyFrame() { setTitle("GridLayoutTest"); tTitl ("G idL tT t") setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new y ( GridLayout(0, y ( , 3)); )); add(new JButton("Button1")); add(new JButton("Button2")); add(new dd( JB tt ("B tt 3")) JButton("Button3")); add(new JButton("B4")); add(new JButton("Long Button5")); pack(); setVisible(true); } } © 2009 인피니티북스 All rights reserved
// 3개의 개의 열과 필 필요한 한 만큼의 행
BoxLayout y • BoxLayout은 컴포넌트를 다른 컴포넌트 위에 쌓거나 컴포넌트를 하 나의 행에 배치할 수 있다. • BoxLayout은 FlowLayout의 하나의 버전으로 간주할 수 있으나 좀 더 기능이 많다.
© 2009 인피니티북스 All rights reserved
BoxLayout y 예제 import java.awt.*; import java.awt.event.*; import javax.swing. javax.swing.*;; class MyFrame extends JFrame { public bli MyFrame() M F () { setTitle("BoxLayoutTest"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel = new JPanel(); (); JPanel p // Y축 방향으로 컴포넌트를 쌓는다. panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); makeButton(panel, "Button1"); makeButton(panel, "Button2"); (p , "Button3"); ); makeButton(panel, makeButton(panel, "B4"); makeButton(panel, "Long Button5"); add(panel); pack(); setVisible(true); } 인피니티북스 All rights reserved © 2009
GridLayout y 예제 private void makeButton(JPanel panel, String text) { JButton button = new JButton(text); button.setAlignmentX(Component.CENTER ALIGNMENT); button.setAlignmentX(Component.CENTER_ALIGNMENT); panel.add(button); } }
© 2009 인피니티북스 All rights reserved
CardLayout y • CardLayout 클래스는 여러 개의 카드가 쌓여 있는 형태로 컴포넌트 를 배치
© 2009 인피니티북스 All rights reserved
CardLayout y 예제 import java.awt.*; import java.awt.event.*; import javax.swing. javax.swing.*;; class MyFrame extends JFrame implements ActionListener { JPanel panel; C d cards; Cards d public MyFrame() { setTitle("CardLayoutTest"); ( y ); setSize(400, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel = new JPanel(new GridLayout(0, 5, 10, 0)); addButton("<<", ddB tt (" " panel); l) addButton("<", panel); addButton(">", panel); addButton(">>", ( ,p panel); ); addButton("종료", panel); add(panel, "North"); cards = new Cards(); add(cards "Center"); add(cards, Center ); setVisible(true); } 인피니티북스 All rights reserved © 2009
CardLayout y 예제 void addButton(String str, Container target) { JButton button = new JButton(str); button.addActionListener(this); target.add(button); } private i t class l C d extends Cards t d JPanel JP l{ CardLayout layout; public Cards() p () { layout = new CardLayout(); setLayout(layout); for (int i = 1; i <= 10; i++) { add(new dd( JB tt ("현재 카드의 번호는 " + i + "입니다"), JButton("현재 "입니다") "Center"); "C t ") } } }
© 2009 인피니티북스 All rights reserved
CardLayout y 예제 public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("종료")) { System.exit(0); } else if (e.getActionCommand().equals("<<")) { cards.layout.first(cards); } else if (e.getActionCommand().equals("<")) { cards.layout.previous(cards); d l t i ( d ) } else if (e.getActionCommand().equals(">")) { cards.layout.next(cards); } else if ((e.getActionCommand().equals(">>")) g () q ( )) { cards.layout.last(cards); } } } public class CardTest { public static void main(String p ( g args[]) g []) { MyFrame f=new MyFrame(); } }
© 2009 인피니티북스 All rights reserved
GridLayout y 예제
© 2009 인피니티북스 All rights reserved
어떤 배치 관리자를 선택할 것인가? • 컴포넌트를 가능한 크게 나타내고 싶은 경우 • GridLayout이나 BorderLayout을 사용 • 몇개의 컴포넌트를 자연스러운 크기로 한줄로 나타내고 싶은 경우 • FlowLayout을 사용하던지 BoxLayout을 사용한다. • 몇개의 컴포넌트를 행과 열로 동일한 크기로 나타내고 싶은 경우 • GridLayout을 사용하여야 한다. • 몇개의 컴포넌트를 행과 열로 나타내는데 각 컴포넌트의 크기가 다 르거나 간격, 정렬 방식을 다르게 내고 싶은 경우 • BoxLayout을 사용하면 된다. 된다
© 2009 인피니티북스 All rights reserved
절대 위치로 배치하기 1. 배치 관리자를 null로 설정한다. • setlayout(null null); 2. add() 메소드를 사용하여 컴포넌트를 컨테이너에 추가한다. • Button b = Button("Absolute Position Button"); • add(b); 3. setBounds() 메소드를 사용하여 절대 위치와 크기를 지정한다. • b.setBounds(x, ( , y, w,, h); ); 4. 컴포넌트의 repaint() 메소드를 호출한다. • b.repaint(); b i t()
© 2009 인피니티북스 All rights reserved
CardLayout y 예제 import java.awt.*; import java.awt.event.*; import javax.swing. javax.swing.*;; class MyFrame extends JFrame { JButton b1; private i t JButton JB tt b2, b2 b3; b3 public MyFrame() { setTitle("Absolute ( Position Test"); ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 200); JPanel p = new JPanel(); p.setLayout(null); tL t( ll) b1 = new JButton("Button #1"); p.add(b1); p ( ); b2 = new JButton("Button #2"); p.add(b2); b3 = new JButton("Button #3"); p add(b3); p.add(b3); © 2009 인피니티북스 All rights reserved
CardLayout y 예제 b1.setBounds(20, 5, 95, 30); b2.setBounds(55, 45, 105, 70); b3.setBounds(180, 15, 105, 90); add(p); setVisible(true); } } public class AbsoluteTest { p public static void main(String args[]) { MyFrame f=new MyFrame(); } }
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제20장 스윙 컴포넌트 1
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•텍스트 컴포넌트 •텍스트 필드 •텍스트 영역 •스크롤 페인 •체크 박스 •라디오 버튼
© 2009 인피니티북스 All rights reserved
스윙에서 제공하는 기초적인 컴포넌트들을 살펴봅시다.
스윙 텍스트 컴포넌트들 종류
텍스트 컴포넌트
텍스트 필드
JTextField JPasswordField JFormattedTextField
일반 텍 텍스트 영역
JTextArea
스타일 텍스트 영역
JEditorPane JEdit P JTextPane
그림
© 2009 인피니티북스 All rights reserved
스윙 텍스트 컴포넌트들
© 2009 인피니티북스 All rights reserved
상속 계층 구조 JTextComponent JTextComponent
JTextField JTextField
JTextArea JTextArea
JFormattedTextField JF JFormattedTextField dT Fi ld
JEditorPane JEditorPane JTextPane JT P JTextPane
JPasswordField JPasswordField 텍스트 필드
일반 텍스트 영역
스타일 텍스트 영역
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 폰트를 하나만 사용할 수 있는 메모장을 생성하려면 어떤 클래스를 사용하여야 하는가? 2 사용자가 이미지나 사운드 파일을 포함하고 있는 텍스트를 생성하게 2. 하려면 어떤 클래스를 사용하여야 하는가?
© 2009 인피니티북스 All rights reserved
JTextComponent p 클래스 • 컴포넌트가 가진 데이터는 document라고 하는 이름의 인스턴스에 저장된다 document는 저장된다. d t는 MVC에서 모델(Model)에 모델(M d l)에 해당한다. 해당한다 • “오려두기”,, “복사하기”,, “붙이기”,, “삽입하기”와 같은 기본적인 텍 스트 편집 기능을 제공한다. 이들 기능들은 메뉴와 버튼들과 연결될 수 있다. • 단축키 기능을 제공한다. • 무제한의 되돌림 기능(undo)과 기능( d )과 다시하기 기능(redo)을 기능( d )을 제공한다. 제공한다 • 교체가능한 카렛과 카렛 변경 리스터와 내비게이션 필터를 제공한다. • 문서 필터를 제공한다.
© 2009 인피니티북스 All rights reserved
JTextComponent p 클래스 이러한 기능들을 제공하는 클래스입니다.
© 2009 인피니티북스 All rights reserved
JTextComponent p 메소드
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
텍스트 필드
© 2009 인피니티북스 All rights reserved
예제 import javax.swing.*; import java.awt.event.*; class l M F MyFrame extends t d JFrame JF { private JButton button; private JTextField text, result; public MyFrame() { setSize(300, 130); setTitle("제곱 계산하기"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); tD f ltCl O ti (JF EXIT ON CLOSE) ButtonListener listener = new ButtonListener(); JPanel panel = new JPanel(); panel.add(new JLabel("숫자 입력: ")); text = new JTextField(15); text addActionListener(listener); text.addActionListener(listener); panel.add(text);
// 리스너 객체 생성
// 레이블 생성 // 컬럼수가 15인 텍스트 필드 생성 // 텍스트 필드에 리스너 연결
p panel.add(new ( JLabel("제곱한 ( 값: ")); )); result = new JTextField(15); // 결과를 나타낼 텍스트 필드 result.setEditable(false); // 편집 불가 설정 © 2009 인피니티북스 All rights reserved panel.add(result);
예제 button = new JButton("OK"); button.addActionListener(listener); panel.add(button); add(panel); setVisible(true); } // 텍스트 필드와 버튼의 액션 이벤트 처리 private class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { if ((e.getSource() g () == button || e.getSource() g () == text)) { String name = text.getText(); int value = Integer.parseInt(name); result.setText(" " + value * value); t t text.requestFocus(); tF () } } } } public class TextFieldTest extends JFrame { public static void main(String[] args) { new MyFrame(); } } 인피니티북스 All rights reserved © 2009
예제
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 텍스트 필드에서 엔터키나 리턴키를 치면 발생하는 이벤트는 무엇인 가? 2 패스워드를 입력받을 때 사용하는 클래스는? 2. 3. 텍스트 필드에서 g getText()로 () 받은 텍스트를 정수로 변환하려면 어떤 방법을 써야 하는가?
© 2009 인피니티북스 All rights reserved
텍스트 영역 • 텍스트 영역(TextArea): 여러 줄의 텍스트가 들어 갈 수 있는 컴포넌 트
© 2009 인피니티북스 All rights reserved
예제 import java.awt.*; import java.awt.event.*; import javax.swing.*; class MyFrame extends JFrame implements ActionListener { protected JTextField textField; protected JTextArea textArea;; p public MyFrame() { setTitle("Text Area Test"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); tD f ltCl O ti (JF EXIT ON CLOSE) textField = new JTextField(30); ( ); textField.addActionListener(this); textArea = new JTextArea(10, 30); textArea.setEditable(false); add(textField, BorderLayout.NORTH); add(textArea, BorderLayout.CENTER); pack(); setVisible(true); }
© 2009 인피니티북스 All rights reserved
예제 public void actionPerformed(ActionEvent evt) { String text = textField.getText(); t tA textArea.append(text d(t t + "\n"); "\ ") textField.selectAll(); textArea.setCaretPosition(textArea.getDocument().getLength()); } } public class TextAreaTest extends JFrame { public bli static t ti void id main(String[] i (St i g[] args) g ){ new MyFrame(); } }
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 버튼을 누르면 “I've clicked"라는 문자열을 텍스트 영역에 추가하는 프로그램을 설계하고 작성하여 보라. 2 텍스트 영역에다 텍스트를 추가하는 메소드는? 2.
© 2009 인피니티북스 All rights reserved
스크롤 페인 • 텍스트 영역에 스크롤바를 만들려면 스크롤 페인에 텍스트 영역을 넣어야 한다. textArea = new JTextArea(10, ( , 30); ); // 텍스트 영역을 생성한다. JScrollPane scrollPane = new JScrollPane(textArea); // ①
© 2009 인피니티북스 All rights reserved
체크 박스
© 2009 인피니티북스 All rights reserved
JCheckBox의 메소드
© 2009 인피니티북스 All rights reserved
예제 import import import import
java.awt.*; java.awt.event.ActionEvent; java awt event ActionListener; java.awt.event.ActionListener; java.applet.Applet;
p jjavax.swing.*; g ; import class MyFrame extends JFrame implements ActionListener { private JButton buttonOK; private JCheckBox onion, cheese, tomato; public MyFrame() { setTitle("체크박스 테스트"); setSize(300, 130); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("햄버거에 무엇을 추가하시겠습니까?"); JPanel topPanel = new JPanel(); topPanel.add(label); add(topPanel, BorderLayout.NORTH); © 2009 인피니티북스 All rights reserved
예제 // 체크 박스 생성 및 추가 JPanel panel = new JPanel(); onion = new JCheckBox( JCheckBox("양파"); 양파 ); panel.add(onion); cheese = new JCheckBox("치즈"); panel.add(cheese); tomato = new JCheckBox("토마토"); Ch kB ("토마토") panel.add(tomato); add(panel, BorderLayout.CENTER); // 버튼 생성 및 추가 buttonOK = new JButton("OK"); JPanel bottomPanel = new JPanel(); b tt P bottomPanel.add(buttonOK); l dd(b tt OK) add(bottomPanel, BorderLayout.SOUTH); buttonOK.addActionListener(this); setVisible(true); }
© 2009 인피니티북스 All rights reserved
예제 public void actionPerformed(ActionEvent e) { if (e.getSource() == buttonOK) { String msg = "";; if (onion.isSelected()) msg += "양파\n"; if (cheese.isSelected()) msg += " 치즈"; 치즈" if (tomato.isSelected()) msg += " 토마토"; msg = "선택한 선택한 옵션은 다음과 같습니다.\n " + msg; System.out.println(msg); onion.setSelected(false); cheese.setSelected(false); t tomato.setSelected(false); t tS l t d(f l ) } } } public class MyFrameTest extends JFrame { public static void main(String[] args) { new MyFrame(); M F () } } 인피니티북스 All rights reserved © 2009
예제
© 2009 인피니티북스 All rights reserved
라디오 버튼
© 2009 인피니티북스 All rights reserved
생성자와 메소드
• JRadioButton • JRadioButton
radio1 = new JRadioButton("Small Size“); radio1 = new JRadioButton("Small Size“, true);
© 2009 인피니티북스 All rights reserved
그룹핑하기 // 라디오 버튼을 생성한다. JRadioButton radio1 = new JRadioButton("선택 1"); JRadioButton radio2 = new JRadioButton("선택 2"); JRadioButton radio3 = new JRadioButton( JRadioButton("선택 선택 3 3"); ); // ButtonGroup 객체를 생성한다. B ButtonGroup G group = new ButtonGroup(); B G () 라디오 버튼들을 ButtonGroup p 객체에 추가한다 추가한다. // 라디 group.add(radio1); group.add(radio2); g group.add(radio3); dd( di 3);
© 2009 인피니티북스 All rights reserved
예제 import javax.swing.*; import javax.swing.border.Border; import java.awt.event.*; import java.awt.*; class l M F MyFrame extends t d JFrame JF i l implements t ActionListener A ti Li t { private JRadioButton small, medium, large; private JLabel text; private JPanel topPanel, sizePanel, resultPanel; public MyFrame() { setTitle("라디오 tTitl ("라디오 버튼 테스트"); 테스트") setSize(300, 150); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); topPanel = new JPanel(); JLabel label = new JLabel("어떤 크기의 커피를 주문하시겠습니까?"); topPanel.add(label); add(topPanel, dd(t P l BorderLayout.NORTH); B d L t NORTH) © 2009 인피니티북스 All rights reserved
예제 sizePanel = new JPanel(); small = new JRadioButton("Small Size"); medium = new JRadioButton( JRadioButton("Medium Medium Size Size"); ); large = new JRadioButton("Large Size"); ButtonGroup size = new ButtonGroup(); size.add(small); i dd( ll) size.add(medium); size.add(large); small.addActionListener(this); medium.addActionListener(this); large.addActionListener(this); sizePanel.add(small); sizePanel.add(medium); i P l dd( di ) sizePanel.add(large); add(sizePanel, BorderLayout.CENTER); resultPanel = new JPanel(); text = new JLabel("크기가 선택되지 않았습니다."); text.setForeground(Color.red); resultPanel.add(text); ltP l dd(t t) add(resultPanel, BorderLayout.SOUTH); setVisible(true); © 2009 인피니티북스 All rights reserved }
예제 public void actionPerformed(ActionEvent e) { if (e.getSource() == small) { text.setText("Small text.setText( Small 크기가 선택되었습니다. 선택되었습니다."); ); } if (e.getSource() == medium) { text.setText("Medium 크기가 선택되었습니다."); } if (e.getSource() == large) { text.setText("Large 크기가 선택되었습니다."); } } } public bli class l R di B tt T t extends RadioButtonTest t d JFrame JF { public static void main(String[] args) { new MyFrame(); } }
© 2009 인피니티북스 All rights reserved
예제
© 2009 인피니티북스 All rights reserved
경계 만들기
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제21장 스윙 컴포넌트 II
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•레이블과 버튼에 이미지 표시 •리스트 •콤보 박스 •스피너 •슬라이더 •트리 •색상선택기및 색상선택기및 폰트선택기 선택기 •메뉴 •대화상자 •테이블 테이블
© 2009 인피니티북스 All rights reserved
스윙에서 제공하는 고급 컴포넌트들을 살펴봅시다.
텍스트와 레이블에 이미지 추가
© 2009 인피니티북스 All rights reserved
텍스트와 레이블에 이미지 추가 1. ImageIcon 인스턴스를 생성하여야 한다. • ImageIcon image = new ImageIcon("image.gif");
2. setIcon() 메소드를 사용 • JLabel label = new JLabel( JLabel("이미지 이미지 레이블 레이블"); ); • label.setIcon(image);
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
실행 결과
© 2009 인피니티북스 All rights reserved
리스트 • 리스트(List)는 여러 개의 선택 항목 중에서 하나를 선택하기 위한 컴 포넌트이다. • 리스트는 한 줄에 하나씩 선택 항목을 나타내며 이 영역은 스크롤이 가능하다. • 일반적으로 사용자는 마우스 클릭에 의하여 항목을 선택 • 더블 클릭이나 엔터 키를 치면 액션 이벤트가 발생한다.
© 2009 인피니티북스 All rights reserved
리스트의 메소드
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
선택 모드 변경 list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list
© 2009 인피니티북스 All rights reserved
리스트이 이벤트 처리
© 2009 인피니티북스 All rights reserved
콤보박스
© 2009 인피니티북스 All rights reserved
콤보 박스의 메소드
© 2009 인피니티북스 All rights reserved
콤보 박스의 이벤트 처리
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
실행 결과
© 2009 인피니티북스 All rights reserved
스피너
© 2009 인피니티북스 All rights reserved
슬라이더
© 2009 인피니티북스 All rights reserved
트리
© 2009 인피니티북스 All rights reserved
트리의 생성 순서
© 2009 인피니티북스 All rights reserved
색상 선택기
JColorChooser colorChooser = new JColorChooser(Color.RED); © 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
예제
© 2009 인피니티북스 All rights reserved
파일 선택기
© 2009 인피니티북스 All rights reserved
파일 선택기 • 표준 열기 대화상자를 만드는 것은 다음의 문장으로 한다 한다.. //파일 선택기를 생성한다. final JFileChooser fc = new JFileChooser(); ... //버튼이 클릭되면 반환된다. int returnVal = fc.showOpenDialog(aComponent);
© 2009 인피니티북스 All rights reserved
파일 선택기
© 2009 인피니티북스 All rights reserved
메뉴
© 2009 인피니티북스 All rights reserved
메뉴 클래스의 상속 계층도
© 2009 인피니티북스 All rights reserved
메뉴 생성 순서
© 2009 인피니티북스 All rights reserved
대화 상자 • 대화 상자 윈도우는 임시 정보를 나타내는데 사용되는 독립적인 서 브 윈도우이다. • 몇 개의 미리 정해진 표준 대화 상자는 아주 간단히 만들 수 있다.
© 2009 인피니티북스 All rights reserved
showMessageDialog() g g()
© 2009 인피니티북스 All rights reserved
showOptionDialog() p g()
© 2009 인피니티북스 All rights reserved
테이블 • 테이블은 스프레드 쉬트처럼 데이터를 테이블 형식으로 표시하고 사 용자가 값을 편집할 수 있는 컴포넌트이다
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제22장 넷빈을 이용한 GUI 프로그래밍
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•넷빈이란? •넷빈 둘러보기 •넷빈 사용하기
© 2009 인피니티북스 All rights reserved
넷빈을 이용하여 GUI를 비주얼하게 디자인해봅시 다.
넷빈이란? • • • •
넷빈(NetBeans)은 www.netbeans.org에 가면 다운로드가 가능 통합 개발 환경(IDE) 오픈 소스 그래픽 사용자 인터페이스를 디자인하고 코딩하는데 장점
© 2009 인피니티북스 All rights reserved
넷빈의 화면 구성
© 2009 인피니티북스 All rights reserved
팔레트
© 2009 인피니티북스 All rights reserved
디자인 영역
© 2009 인피니티북스 All rights reserved
소스 영역
© 2009 인피니티북스 All rights reserved
특성 편집기
© 2009 인피니티북스 All rights reserved
넷빈 사용하기 • 목표 프로그램 • 마일을 킬로미터로 변환하는 프로그램
© 2009 인피니티북스 All rights reserved
새로운 프로젝트의 생성
© 2009 인피니티북스 All rights reserved
프로젝트의 종류 선택
© 2009 인피니티북스 All rights reserved
프로젝트의 이름 입력
© 2009 인피니티북스 All rights reserved
중간 단계 화면
© 2009 인피니티북스 All rights reserved
컴포넌트를 끌어와서 배치
© 2009 인피니티북스 All rights reserved
중간 단계 화면
© 2009 인피니티북스 All rights reserved
컴포넌트의 속성 바꾸기
© 2009 인피니티북스 All rights reserved
응용 논리 코드 추가하기
변수의 이름을 변경한다.
© 2009 인피니티북스 All rights reserved
이벤트 처리기 붙이기
© 2009 인피니티북스 All rights reserved
필요한 코드를 넣는다
© 2009 인피니티북스 All rights reserved
완성
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제23장 그래픽 프로그래밍
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•자바에서의 그래픽 •기초 사항 •기초 도형 그리기 •색상 •폰트 •Java 2D •Java 2D를 이용한 그리기 •Java J 2D를 이용한 채우기 •도형 회전과 평행 이동
© 2009 인피니티북스 All rights reserved
자바를 이용하여서 화면에 그림을 그려봅시다.
자바 그래픽 데모
© 2009 인피니티북스 All rights reserved
자바 그래픽의 두가지 방법 자바 그래픽
AWT
•AWT를 사용하면 기본적인 도형들을 쉽게 그릴 수 있다. •어디서나 잘 실행된다.
© 2009 인피니티북스 All rights reserved
Java 2D
•커브를 그릴 수 있다. 차 도형을 형을 회 회전 •2차원 •앤티에일리어싱 •그라디언트 채우기
간단한 예제
문자열 출력
직선
© 2009 인피니티북스 All rights reserved
어디에 그릴 것인가? • JFrame이나 JPanel에도 그릴 수 있지만 우리 나름대로의 컴포넌트 를 정의하여 보자.
이것을 상속받아서 우리 나름대로의 컴포넌트를 정의한다. 정의한다
© 2009 인피니티북스 All rights reserved
어떻게 그릴 것인가? • 컴포넌트에 무언가를 그리려면 paint() 메소드를 중복 정의한다. • paint() 메소드는 컴포넌트가 화면에 그려질 때 호출된다.
© 2009 인피니티북스 All rights reserved
일반적인 코드의 형태 class MyComponent extends JComponent { public void paint(Graphics g) { // 여기에 그림을 그리는 코드를 넣는다. } }
© 2009 인피니티북스 All rights reserved
구체적인 코드 class MyComponent extends JComponent { public static final int x = 30; public bli static t ti final fi l int i t y = 80; 80
문자열 출력
public void paint(Graphics g) { g.drawString("안녕하세요? 자바 프로그래머 여러분!", x, y); g.drawLine(x, y + 10, x + 200, y + 10); } 직선 출력
}
© 2009 인피니티북스 All rights reserved
그래픽 좌표계
© 2009 인피니티북스 All rights reserved
예제 import java.awt.*; import javax.swing.*; // 그림이 그려지는 컴포넌트를 정의 class MyComponent extends JComponent { public static final int x = 30; public static final int y = 80; public void paint(Graphics g) { g.drawString("안녕하세요? d St i ("안녕하세요? 자바 프로그래머 여러분!", 여러분!" x, y); ) g.drawLine(x, y + 10, x + 200, y + 10); } }
© 2009 인피니티북스 All rights reserved
예제 // 프레임 컴포넌트를 상속받아서 정의 public class MyFrame extends JFrame { public static final int WIDTH = 300; public static final int HEIGHT = 200; public MyFrame() { setTitle("MyFrame"); tTitl ("M F ") setSize(WIDTH, HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); ( ); // MyComponent 객체 생성하여 프레임에 추가 MyComponent c = new MyComponent(); add(c); dd( ) } public static void main(String[] p ( g[] args) g ){ MyFrame frame = new MyFrame(); } }
© 2009 인피니티북스 All rights reserved
실행 결과
© 2009 인피니티북스 All rights reserved
기초 도형 그리기
© 2009 인피니티북스 All rights reserved
직선 그리기
© 2009 인피니티북스 All rights reserved
사각형 그리기
width height
© 2009 인피니티북스 All rights reserved
drawRoundRect() ()
© 2009 인피니티북스 All rights reserved
타원 그리기
© 2009 인피니티북스 All rights reserved
호그리기
© 2009 인피니티북스 All rights reserved
예제 • 아래 그림과 비슷한 얼굴을 그려보자
© 2009 인피니티북스 All rights reserved
예제 import javax.swing.*; import java.awt.event.*; import java.awt. java.awt.*;; class MyComponent extends JComponent { public bli void id paint(Graphics i t(G hi g)) { g.setColor(Color.YELLOW); g.fillOval(20, 30, 200, 200); g g.setColor(Color.BLACK); ( ); // 왼쪽 눈을 그린다. g.drawArc(60, 80, 50, 50, 180, -180); // 오른쪽 눈을 그린다. gd g.drawArc(150, A (150 80 80, 50 50, 50 50, 180 180, -180); 180) // 입을 그린다. g.drawArc(70, 130, 100, 70, 180, 180); } }
© 2009 인피니티북스 All rights reserved
예제 public class SnowManFace extends JFrame { public SnowManFace() { setSize(280, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("눈사람 얼굴"); setVisible(true); add(new dd( M C MyComponent()); t()) } public static void main(String[] p ( g[] args) g ){ SnowManFace s=new SnowManFace(); } }
© 2009 인피니티북스 All rights reserved
색상 • java.awt 패키지의 일부인 Color 클래스를 사용 • 빛의 3원색인 Red 성분, Green 성분, Blue 성분이 얼마나 함유되어 있는지를 0에서 255까지의 수를 사용하여 나타낸다.
© 2009 인피니티북스 All rights reserved
예제 import javax.swing.*; import java.awt.event.*; import java.awt. java.awt.*;; class MyPanelextends JPanel implements ActionListener { JButton button; C l color Color l = new Color(0, C l (0 0 0, 0) 0); public MyPanel() { setLayout(new y ( BorderLayout()); y ()); button = new JButton("색상 변경"); button.addActionListener(this); add(button, BorderLayout.SOUTH); } public void paint(Graphics g) { g g.setColor(color); ( ); g.fillRect(10, 10, 210, 220); }
© 2009 인피니티북스 All rights reserved
예제 public void actionPerformed(ActionEvent e) { color = new Color((int) (Math.random() (Math.random()*255.0), 255.0), (int) (Math.random()*255.0),(int) (Math.random()*255.0)); repaint(); } } public class ColorTest extends JFrame { public ColorTest() p () { setSize(240, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("Color Test"); setVisible(true); tVi ibl (t ) JPanel panel = new MyPanel(); add(panel); } public static void main(String[] args) { ColorTest s = new ColorTest(); } } © 2009 인피니티북스 All rights reserved
실행 결과
© 2009 인피니티북스 All rights reserved
색상 선택기
© 2009 인피니티북스 All rights reserved
예제 import import import import import
java.awt.*; java.awt.event.*; javax.swing.*;; javax.swing. javax.swing.event.*; javax.swing.colorchooser.*;
public bli class l C l Ch ColorChooserTest T t extends t d JFrame JF i l implements t ChangeListener Ch Li t { protected JColorChooser color; public ColorChooserTest() { setTitle("색상 선택기 테스트"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
록
color = new JColorChooser(); // 생성자 호출 color.getSelectionModel().addChangeListener(this);
// 리스너 등
color.setBorder(BorderFactory.createTitledBorder("색상 선택"));
© 2009 인피니티북스 All rights reserved
예제 JPanel panel = new JPanel(); panel.add(color); add(panel); pack(); this.setVisible(true); } public void stateChanged(ChangeEvent e) { Color newColor = color.getColor(); g (); } public static void main(String[] args) { new ColorChooserTest(); C l Ch T t() } }
© 2009 인피니티북스 All rights reserved
폰트 • 폰트를 지정하기 위해서는 Font 클래스를 사용 • Font 객체는 폰트 이름(Courier, Helvetica,..)과 스타일(plain, bold, italic,...), 크기(12포인트,...)의 3가지 속성 • Font font = new Font("Courier", Font.PLAIN, 10); // plain 형식이 고 크기는 10포인트
© 2009 인피니티북스 All rights reserved
폰트의 종류
© 2009 인피니티북스 All rights reserved
예제 import javax.swing.*; import java.awt.event.*; import java.awt.*; class MyComponent extends JComponent { Font f1, f2, f3, f4, f5; public MyComponent() { f1 = new Font("Serif", Font.PLAIN, 20); f2 = new Font("San Serif", Font.BOLD, 20); f3 = new Font("Monospaced", Font.ITALIC, 20); f4 = new Font("Dialog", Font.BOLD | Font.ITALIC, 20); f5 = new Font( Font("DialogInput" DialogInput , Font.BOLD, Font BOLD 20); } public void paint(Graphics g) { g.setFont(f1); g.drawString("Serif 20 points PLAIN", 10, 50); g.setFont(f2); g.drawString("SanSerif 20 points BOLD", 10, 70); g setFont(f3); g.setFont(f3); g.drawString("Monospaced 20 points ITALIC", 10, 90); g.setFont(f4); g.drawString("Dialog 20 points BOLD + ITALIC", 10, 110); g.setFont(f5); g.drawString("DialogInput 20 points BOLD", 10, 130); © 2009 인피니티북스 All rights reserved } }
예제 public class FontTest extends JFrame { public FontTest() { setSize(500, 200); setDefaultCloseOperation(JFrame EXIT ON CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("Font Test"); setVisible(true); JPanel panel = new MyPanel(); add(panel); } public static void main(String[] args) { FontTest s = new FontTest(); } }
© 2009 인피니티북스 All rights reserved
Java 2D
© 2009 인피니티북스 All rights reserved
Java 2D를 이용한 그리기 public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.drawLine(100, 2d Li (100 100, 100 300 300, 300) 300); g2.drawRect(10, 10, 100, 100); ... }
© 2009 인피니티북스 All rights reserved
Java 2D를 이용한 그리기
© 2009 인피니티북스 All rights reserved
사각형 그리기 • Shape r1 = new Rectangle2D.Float(10, 10, 50, 60); • g2.draw(r1);
© 2009 인피니티북스 All rights reserved
예제 import import import import import
java.util.*; javax.swing.*; java awt event *; java.awt.event.*; java.awt.*; java.awt.geom.*;
public class MoreShapes extends JFrame { public MoreShapes() { setSize(600 130); setSize(600, setTitle("Java 2D Shapes"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel = new MyPanel(); y () JPanel p add(panel); setVisible(true); } public static void main(String[] args) { new MoreShapes(); } } © 2009 인피니티북스 All rights reserved
예제 class MyPanel extends JPanel { ArrayList<Shape> shapeArray = new ArrayList<Shape>(); public MyPanel() { Shape s; // 사각형 s = new Rectangle2D.Float(10, 10, 70, 80); shapeArray.add(s); // 둥근 사각형 s = new RoundRectangle2D.Float(110, 10, 70, 80, 20, 20); shapeArray.add(s); // 타원 s = new Ellipse2D.Float(210, 10, 80, 80); p y ( ); shapeArray.add(s); // 원호: Arc2D.OPEN s = new Arc2D.Float(310, 10, 80, 80, 90, 90, Arc2D.OPEN); shapeArray add(s); shapeArray.add(s); © 2009 인피니티북스 All rights reserved
예제 // 원호 Arc2D.CHORD s = new Arc2D.Float(410, 10, 80, 80, 0, 180, Arc2D.CHORD); shapeArray add(s); shapeArray.add(s); // 원호 Arc2D.PIE s = new Arc2D.Float(510, 10, 80, 80, 45, 90, Arc2D.PIE); shapeArray.add(s); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; // 앤티 에일리어싱을 설정한다. g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(Color.BLACK); g2 setColor(Color BLACK); g2.setStroke(new BasicStroke(3)); for (Shape s : shapeArray) g2.draw(s); } } © 2009 인피니티북스 All rights reserved
예제
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제24장 입출력
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•스트림이란? •스트림의 분류 •바이트 스트림 •문자 스트림 •형식 입출력 •명령어행에서 입출력 •파일 입출력
© 2009 인피니티북스 All rights reserved
스트림을 이용한 입출력에 대하여 살펴봅시다.
스트림(stream) ( ) • 스트림(stream)은 “순서가 있는 데이터의 연속적인 흐름”이다. • 스트림은 입출력을 물의 흐름처럼 간주하는 것이다.
© 2009 인피니티북스 All rights reserved
스트림들은 연결될 수 있다.
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 자바에서는 입출력을 무엇이라고 추상화하는가? 2. 스트림은 __________가 있는 데이터의 _______ 인 흐름이다.
© 2009 인피니티북스 All rights reserved
스트림의 분류 #1 • 입출력의 단위에 따라서 분류
© 2009 인피니티북스 All rights reserved
스트림의 분류 #2 • 데이터 씽크 클래스(Data Sink Class)와 데이터 처리 클래스(Data Processing Class)로 분류할 수도 있다.
© 2009 인피니티북스 All rights reserved
데이터 씽크 스트림
© 2009 인피니티북스 All rights reserved
데이터 처리 스트림
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 문자 스트림과 바이트 스트림의 차이점은 무엇인가? 2. 데이터 씽크 스트림과 데이터 처리 스트림의 차이점은 무엇인가? 3. LineNumberReader는 데이터 씽크 스트림인가, 아니면 데이터 처리 스트림인가?
© 2009 인피니티북스 All rights reserved
바이트 스트림
© 2009 인피니티북스 All rights reserved
InputStream과 p OutputStream p • 추상 클래스로서 모든 바이트 스트림의 조상 클래스
© 2009 인피니티북스 All rights reserved
FileInputStream과 p FileOutputStream p • 파일이 입출력 대상이 된다.
© 2009 인피니티북스 All rights reserved
예제 import java.io.*; public class FileStreamTest { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { int c; out = new FileOutputStream("data.txt", false); for(int i=0;i <10; i++) { out.write(i); } in = new FileInputStream("data.txt"); while ((c = in.read()) != -1) { System.out.print(c+" "); }
© 2009 인피니티북스 All rights reserved
예제 } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
0123456789
© 2009 인피니티북스 All rights reserved
BufferedInputStream과 p BufferedOutputStream p
© 2009 인피니티북스 All rights reserved
예제 import java.io.*; public class BufferedStreamTest { public static void main(String[] args) throws IOException { BufferedInputStream in = null; BufferedOutputStream out = null; try { int c; out = new BufferedOutputStream(new FileOutputStream("data.txt")); for (int i = 0; i < 10; i++) { out.write(i); } out.flush(); // 버퍼의 내용을 파일에 쓴다. in = new BufferedInputStream(new FileInputStream("data.txt")); while ((c = in.read()) != -1) { System.out.print(c + " "); }
© 2009 인피니티북스 All rights reserved
예제 } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
0123456789
© 2009 인피니티북스 All rights reserved
DataInputStream p 과 DataOutputStream p • DataInputStream 과 DataOutputStream 클래스는 기초 자료형 단위 로 데이터를 읽고 쓸 수 있다.
© 2009 인피니티북스 All rights reserved
예제 import java.io.*; public class DataStreamTest { public static void main(String[] args) throws IOException { DataInputStream in = null; DataOutputStream out = null; try { int c; out = new DataOutputStream(new BufferedOutputStream( new FileOutputStream("data.bin"))); out.writeDouble(3.14); out.writeInt(100); out.writeUTF("자신의 생각을 바꾸지 못하는 사람은 결코 현실을 바꿀 수 없다."); out.flush(); in = new DataInputStream(new BufferedInputStream( new FileInputStream("data.bin")));
© 2009 인피니티북스 All rights reserved
예제 System.out.println(in.readDouble()); System out println(in readInt()); System.out.println(in.readInt()); System.out.println(in.readUTF()); } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } } 3.14 100 자신의 생각을 바꾸지 못하는 사람은 결코 현실을 바꿀 수 없다.
© 2009 인피니티북스 All rights reserved
ObjectInputStream과 j p ObjectOutputStream j p • 직렬화(serialization): • 객체가 가진 데이터들을 순차적인 데이터로 변환하는 것
© 2009 인피니티북스 All rights reserved
예제 import java.io.*; import java.util.Date; public class ObjectStreamTest { public static void main(String[] args) throws IOException { ObjectInputStream in = null; 객체를 ObjectOutputStream out = null; 직렬화하여서 try { 쓴다 쓴다. int c; out = new ObjectOutputStream(new FileOutputStream("object.dat")); out.writeObject(new Date()); out.flush(); in = new ObjectInputStream(new FileInputStream("object.dat")); Date d = (Date) in.readObject(); System.out.println(d);
© 2009 인피니티북스 All rights reserved
예제 } catch (ClassNotFoundException e) { } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
Fri May 01 15:46:56 KST 2009
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 파일 data.bin에서 바이트 형태로 버퍼를 사용하여서 데이터를 읽는 스트림을 생성하여 보라. 2 객체를 네트워크를 통하여 보냈다가 다시 받으려면 어떤 클래스들을 2. 이용하여야 하는가? 3. double형의 데이터를 저장하였다가 다시 읽으려면 어떤 스트림 클래 스가 적합한가?
© 2009 인피니티북스 All rights reserved
문자 스트림
© 2009 인피니티북스 All rights reserved
Reader와 Writer 클래스 • 추상 클래스로서 모든 문자 스트림의 조상 클래스
© 2009 인피니티북스 All rights reserved
FileReader와 FileWriter • 입출력의 대상이 파일이고 단위는 문자
© 2009 인피니티북스 All rights reserved
예제 import java.io.*; public class FileReaderTest { public static void main(String[] args) throws IOException { FileReader in = null; FileWriter out = null; String s = "꿈에 미치면 신화가 된다"; out = new FileWriter("test.txt"); out.write(s); // 문자열은 write()로 출력 가능 out.append('.'); // 문자 추가 out.flush();
© 2009 인피니티북스 All rights reserved
예제 in = new FileReader("test.txt"); int c; while ((c = in.read()) != -1) { System.out.print((char) c); } if(in != null) in.close(); if(out != null) out.close(); } }
꿈에 미치면 신화가 된다. 된다
© 2009 인피니티북스 All rights reserved
InputStreamReader와 p OutputStreamWriter p • 바이트 스트림과 문자 스트림을 연결하는 클래스
© 2009 인피니티북스 All rights reserved
명령어행에서 입출력 • System.in, System.out, System.err • 표준 스트림은 모두 역사적인 이유로 바이트 스트림으로 정의
© 2009 인피니티북스 All rights reserved
File 클래스 • File 클래스는 파일을 나타낸다. File file = new File("data.txt");
• 파일에 대한 여러 가지 메소드를 제공
© 2009 인피니티북스 All rights reserved
예제 import java.io.File; import java.io.IOException; public class FileTest { public static void main(String[] args) throws IOException { String name = "c:/eclipse"; Fil dir File di = new File(name); Fil ( ) String[] fileNames = dir.list(); // 현재 디렉토리의 전체 파일 리스트 for (String s : fileNames) { File l f = new File(name l + "/" + s); // 절대 경로로 이름을 주어야 함 System.out.println("==============================="); System.out.println("이름: " + f.getName()); System.out.println("경로: " + f.getPath()); System.out.println("부모: " + f.getParent()); System.out.println("절대경로: " + f.getAbsolutePath()); System.out.println("정규경로: " + f.getCanonicalPath()); System.out.println("디렉토리 여부:" + f.isDirectory()); System.out.println("파일 여부:" + f.isFile()); System.out.println("==============================="); } © 2009 인피니티북스 All rights reserved }
예제 =============================== 이름: .eclipseproduct eclipseproduct 경로: c:\eclipse\.eclipseproduct 부모: c:\eclipse 절대경로: c:\eclipse\.eclipseproduct c:\eclipse\ eclipseproduct 정규경로: C:\eclipse\.eclipseproduct 디렉토리 여부:false 파일 여부:true =============================== ...
© 2009 인피니티북스 All rights reserved
임의 접근 파일 • 임의 접근 파일은 파일에 비순차적인 접근을 가능하게 한다. • new RandomAccessFile("all.zip", "r");
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제25장 네트워크 프로그래밍
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•네트워크 프로그래밍의 개요 •URL 클래스 •TCP를 이용한 통신 •TCP를 이용한 서버 제작 •TCP를 이용한 클라이언트 제작 •UDP를 UDP를 이용한 통신
© 2009 인피니티북스 All rights reserved
자바를 이용하여서 TCP/IP 통신을 이용하는 응응 프로그램을 작성하여 봅시다.
서버와 클라이언트 • 서버(Server): 사용자들에게 서비스를 제공하는 컴퓨터 • 클라이언트(Client): 서버에게 서비스를 요청해서 사용하는 컴퓨터 • (예) 웹서버와 클라이언트
© 2009 인피니티북스 All rights reserved
IP 주소 • IP 주소: 인터넷에서 컴퓨터의 주소
© 2009 인피니티북스 All rights reserved
포트 • 포트(port): 가상적인 통신 선로
© 2009 인피니티북스 All rights reserved
호스트 이름,, DNS,, URL • DNS(Domain Name System): 숫자 대신 기호를 사용하는 주소 • DNS 서버: 기호 주소를 숫자 주소가 변환해주는 서버 • URL(Uniform Resource Locator): 인터넷 상의 자원을 나타내는 약속
© 2009 인피니티북스 All rights reserved
프로토콜 • 프로토콜(protocol): 통신을 하기 위한 약속
© 2009 인피니티북스 All rights reserved
TCP • TCP(Transmission Control Protocol)는 신뢰성있게 통신하기 위하여 먼저 서로 간에 연결을 설정한 후에 데이터를 보내고 받는 방식
© 2009 인피니티북스 All rights reserved
UDP • UDP(User Datagram Protoocol)는 데이터를 몇 개의 고정 길이의 패 킷(다이어그램이라고 불린다)으로 분할하여 전송
© 2009 인피니티북스 All rights reserved
자바와 네트워크 • 네트워크 프로그래밍을 위한 패키지는 java.net • TCP를 위한 클래스 • URL • URLConnection • Socket • ServerSocket S S k 를 위한 클래 클래스 • UDP를 • DatagramPacket • DatagramSocket • MulticastSocket M lti tS k t
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. IP 주소와 도메인 이름은 어떻게 다른가? 2. 전화와 비슷한 전송 프로토콜은 ___________이고 편지와 비숫한 프 로토콜은 _________이다. 이다 3. TCP/IP에서 자신을 가리키는 주소는?
© 2009 인피니티북스 All rights reserved
URL 클래스 • URL java = new URL("http://java.sun.com");// 절대 경로 • URL reference = new URL(java, "reference.html");// 상대 경로
© 2009 인피니티북스 All rights reserved
예제 import java.net.*; import java.io.*; public class ParseURLExample { public static void main(String[] args) throws Exception { URL myURL = new URL("http://java.sun.com:80/docs/books/tutorial" + "/index.html?name=database#TOP"); System.out.println("protocol = " + myURL.getProtocol()); System.out.println("authority = " + myURL.getAuthority()); System.out.println("host = " + myURL.getHost()); System.out.println("port = " + myURL.getPort()); System.out.println("path = " + myURL.getPath()); System.out.println("query = " + myURL.getQuery()); System.out.println("filename = " + myURL.getFile()); System.out.println("ref = " + myURL.getRef()); } } © 2009 인피니티북스 All rights reserved
예제 protocol = http authority = java java.sun.com:80 sun com:80 host = java.sun.com port = 80 path = /docs/books/tutorial/index.html /docs/books/tutorial/index html query = name=database filename = /docs/books/tutorial/index.html?name=database ref = TOP
© 2009 인피니티북스 All rights reserved
Socket 클래스 • 소켓(socket): TCP를 사용하여 응용 프로그램끼리 통신을 하기 위한 연결 끝점(end point)
© 2009 인피니티북스 All rights reserved
ServerSocket과 Socket ServerSocket 클래스: 서버를 위한 소켓
소켓의 종류
Socket 클래스: 클라이언트를 위한 소켓
© 2009 인피니티북스 All rights reserved
Socket 클래스
© 2009 인피니티북스 All rights reserved
ServerSocket 클래스
© 2009 인피니티북스 All rights reserved
소켓을 이용한 서버 제작 1. ServerSocket 객체 생성 • ServerSocket server = new ServerSocket(portNumber, queueLength); 2. accept() 메소드 호출 • Socket clientSocket = server.accept(); 3 소켓으로부터 스트림 객체를 얻는다. 3. 얻는다 • InputStream input = clientSocket.getInputStream(); • OutputStream output = clientSocket.getOutputStream(); 4. 상호 대화 단계 • read()와 write() 사용 5. 종료 • close() 사용 © 2009 인피니티북스 All rights reserved
TCP 예제: 퀴즈 서버와 클라이언트
퀴즈 클라이언트: 퀴즈에 대한 답을 보낸다.
© 2009 인피니티북스 All rights reserved
퀴즈 서버: 퀴즈를 출제한다.
Q QuizServer import java.net.*; import java.io.*; public class QuizServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(5555); } catch (IOException e) { System.err.println("다음의 포트 번호에 연결할 수 없습니다: 5555"); System.exit(1); } Socket clientSocket = null; try { clientSocket = serverSocket serverSocket.accept(); accept(); } catch (IOException e) { System.err.println("accept() 실패"); System.exit(1); } © 2009 인피니티북스 All rights reserved
Q QuizServer PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( clientSocket.getInputStream())); String inputLine, outputLine; QuizProtocol qp = new Q Q QuizProtocol(); (); outputLine = qp.process(null); out.println(outputLine); while ((inputLine = in.readLine()) != null) { outputLine = qp.process(inputLine); out.println(outputLine); p ( p ); if (outputLine.equals("quit")) break; } out close(); out.close(); in.close(); clientSocket.close(); (); serverSocket.close(); } } © 2009 인피니티북스 All rights reserved
예제
서버만 작성되었고 클라이언트가 없으니 결과는 아직 없습니다. 없습니다
© 2009 인피니티북스 All rights reserved
QuizProtocol 클래스 Q class QuizProtocol { private static final int WAITING = 0; private static final int PROBLEM = 1; private static final int ANSWER = 2; private static final int NUMPROBLEMS = 3; private int state = WAITING; private int currentProblem = 0; private String[] problems = { "네트워크 처리 패키지는?", "자바의 최신버전은?", " 인터넷에서 컴퓨터를 식별하는 주소는?" }; private String[] answers = { "java.io", "1 6" "1.6", "IP 주소" };
© 2009 인피니티북스 All rights reserved
QuizProtocol 클래스 Q public String process(String theInput) { String theOutput = null; if (state == WAITING) { theOutput = "퀴즈를 시작합니다(y/n)"; state = PROBLEM; } else if (state == PROBLEM) { if (theInput.equalsIgnoreCase( (theInput equalsIgnoreCase("y")) y )) { theOutput = problems[currentProblem]; state = ANSWER; } else { state = WAITING; theOutput = "quit"; } } else if (state == ANSWER) { if (theInput.equalsIgnoreCase(answers[currentProblem])) { theOutput = "정답입니다. 계속하시겠습니까? (y/n)"; state = PROBLEM; } else l { state = PROBLEM; theOutput = "오답입니다. 계속하시겠습니까? (y/n)"; } currentProblem = (currentProblem+1)% NUMPROBLEMS; } © 2009 인피니티북스 All rights reserved return theOutput; }
QuizlClient 클래스 Q import java.io.*; import java.net.*; public class QuizClient { public static void main(String[] args) throws IOException { S k quizSocket Socket i S k = null; ll PrintWriter out = null; BufferedReader in = null; try { quizSocket = new Socket("localhost", 5555); out = new PrintWriter(quizSocket.getOutputStream(), true); i = new BufferedReader(new in B ff dR d ( I InputStreamReader(quizSocket tSt R d ( i S k t .getInputStream())); } catch (UnknownHostException e) { System.err.println("localhost에 System.err.println( localhost에 접근할 수 없습니다. 없습니다."); ); System.exit(1); } catch (IOException e) { System.err.println("입출력 오류"); S t System.exit(1); it(1) } © 2009 인피니티북스 All rights reserved
QuizlClient 클래스 Q BufferedReader user = new BufferedReader(new InputStreamReader( System.in)); String fromServer; String fromUser; ((fromServer = in.readLine()) ()) != null)) { while (( System.out.println("서버: " + fromServer); if (fromServer.equals("quit")) break; fromUser = user.readLine(); if (fromUser != null) { System.out.println("클라이언트: " + fromUser); out.println(fromUser); } } out.close(); in.close(); quizSocket.close(); } } © 2009 인피니티북스 All rights reserved
서버와 클라이언트의 실행 • 두개의 프로그램을 동시에 실행하여야 한다.
서버: 퀴즈를 시작합니다(y/n) y 클라이언트: y 서버: 네트워크 처리 패키지는? java.io 클라이언트: java.io java io 서버: 정답입니다. 계속하시겠습니까? (y/n) n 클라이언트: n 서버: quit © 2009 인피니티북스 All rights reserved
다중 클라이언트를 지원하려면 • 각각의 클라이언트를 별도의 스레드로 처리하여야 한다 while(true){ 연결 요청을 수락한다; 수락한다 클라이언트를 대응하는 쓰레드를 만든다;
}
© 2009 인피니티북스 All rights reserved
UDP를 이용한 서버와 클라이언트 • DatagramSocket 클래스 • DatagramSocket()은 UDP 프로토콜을 사용하는 소켓을 생성 • DatagramPacket 클래스 • DatagramPacket()은 D t P k t()은 UDP 패킷을 생성한다. 생성한다
© 2009 인피니티북스 All rights reserved
Sender 클래스 import java.net.*; import java.io.*; public class Sender { public static void main(String[] args) throws IOException { DatagramSocket socket = null; socket = new DatagramSocket(); String s = "우리는 여전히 우리 운명의 주인이다."; byte[] buf = s.getBytes(); s getBytes();
트
// "address"의 “port"에 있는 클라이언트에게 데이터를 보낸다. InetAddress address = InetAddress.getByName("127.0.0.1"); // 로컬 호스 DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 5000); socket.send(packet); socket.close();
} }
© 2009 인피니티북스 All rights reserved
Receiver 클래스 import java.io.*; import java.net.*; public class Receiver { public static void main(String[] args) throws IOException { byte[] buf = new byte[256]; DatagramSocket socket = new DatagramSocket(5000); // 포트 번호: 5000 DatagramPacket packet = new DatagramPacket(buf, DatagramPacket(buf buf buf.length); length); socket.receive(packet); System.out.println(new String(buf)); } }
© 2009 인피니티북스 All rights reserved
서버와 클라이언트의 실행 • 두개의 프로그램을 동시에 실행하여야 한다.
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power JJava
제26장 애플릿
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•애플릿 소개 •애플릿 작성 및 소개 •애플릿의 생명주기 •애플릿에서의 그래픽 컴포넌트의 소개 •Applet API의 이용
© 2009 인피니티북스 All rights reserved
웹 브라우저상에 서 실행되는 작은 프로그램인 애플릿에 대하여 학습합니다.
애플릿이란? • 애플릿은 웹 페이지 같은 HTML 문서 안에 내장되어 실행되는 자바 프로그램이다.
© 2009 인피니티북스 All rights reserved
애플릿을 실행시키는 두가지 방법 1. 웹 브라우저를 이용하는 방법 2. Appletviewer를 이용하는 방법 • (예) C>appletviewer example1.html
© 2009 인피니티북스 All rights reserved
애플릿에서 할 수 있는 것 • 그래픽을 포함한 거의 모든 자바 라이브러리를 사용할 수 있다. • (예)
© 2009 인피니티북스 All rights reserved
애플릿과 애플리케이션의 비교 • 애플릿 • main() 메소드를 가지지 않음 • 웹을 통하여 쉽게 실행 • 현재 동작되는 컴퓨터를 변경할 수 없음 • 보안 측면에서 우수 • 애플리케이션 • main() 메소드를 가지고 여기서부터 모든 작업이 시작 • 자바 웹 스타트(Java Web Start) 기능을 이용하면 쉽게 웹을 통하 여 다운로드되어서 실행
© 2009 인피니티북스 All rights reserved
전형적인 애플릿의 구조 public class MyApplet extends JApplet { public void init() { // 애플릿 초기화 } public void start() { // 애플릿의 실행 시작 } public void stop() { // 애플릿의 실행 정지 } public void destroy() { // 애플릿의 종료 } public void paint(Graphics g) { // 그림을 그리는 코드 } ... } 애플릿 위에 그림을 그린다.
© 2009 인피니티북스 All rights reserved
애플릿 #1 import java.awt.Graphics; import javax.swing.JApplet;
JApplet을 상속받는 상속받는다.
public class MyApplet extends JApplet { public void paint(Graphics g) { super.paint(g); g.drawString("애플릿 프로그래머 여러분 안녕하세요?", 50, 25); } Paint() 메소드를 } 재정의한다.
© 2009 인피니티북스 All rights reserved
애플릿을 실행시키려면 • Test.html 파일을 작성한다. <html> <body> <applet code="MyApplet code= MyApplet.class class" width=400 height=100> </applet> </body> </html>
• Appletviewer로 실행한다. C> appletviewer Test.html
© 2009 인피니티북스 All rights reserved
애플릿이 들어있는 위치 지정 • 절대 경로 형식 <applet codebase="http://test.sch.ac.kr/pub/java" code="MyApplet.class" width=200 height=80> </applet>
• 상대 경로 형식 <applet codebase="pub/java" code="MyApplet.class" width=200 height=80> </applet>
© 2009 인피니티북스 All rights reserved
애플릿 #2 import java.awt.Color; import java.awt.Graphics; i import j javax.swing.JApplet; i JA l public class MyApplet1 extends JApplet { Paint() 메소드를 재정의한다. public void paint(Graphics g) { super.paint(g); g.setColor(Color.YELLOW); g.fillOval(0, 0, getSize().width - 1, getSize().height - 1); g.setColor(Color.BLACK); g.drawString("그래픽도 사용할 수 있죠!", 10, getSize().height / 2); } } 그래픽 메소드 사용
© 2009 인피니티북스 All rights reserved
애플릿 #3 import javax.swing.JApplet; import java.awt.Graphics; public class HelloWorld extends JApplet { public void paint(Graphics g) { g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); g.drawString("Hello world!", 5, 15); } } 애플릿의 크기
© 2009 인피니티북스 All rights reserved
애플릿의 생명 주기
© 2009 인피니티북스 All rights reserved
애플릿과 웹브라우저 인터페이스 • init() • 애플릿을 초기화하는 메소드 • 애플릿이 들어있는 페이지를 열 때 자동으로 호출 • start() • 사용자가 애플릿이 포함된 페이지를 방문할 때마다 호출 • stop() • 사용자가 애플릿이 포함된 함된 페이지를 떠날 때 호출된다. 출된다 • destroy() • 브라우저가 닫힐 때만 호출된다. 호출된다
© 2009 인피니티북스 All rights reserved
애플릿 예제 import java.awt.Graphics; import javax.swing.JApplet; public class MyApplet2 extends JApplet { StringBuffer output; public void init() { output = new StringBuffer(); output.append("init() "); repaint(); } public void start() { output.append("start() "); repaint(); }
© 2009 인피니티북스 All rights reserved
애플릿 #2 public void stop() { output.append("stop() "); repaint(); i () } public void destroy() { output.append("destroy() "); repaint(); } public void paint(Graphics g) { super.paint(g); g.drawString(output.toString(), 10, 10); } }
© 2009 인피니티북스 All rights reserved
실행 결과
© 2009 인피니티북스 All rights reserved
애플릿 위에서 GUI 사용 • 모든 GUI 컴포넌트를 사용할 수 있다. • (예) 다음과 같이 마우스를 클릭하면 사각형을 그리는 애플릿을 작성 하여 보자.
© 2009 인피니티북스 All rights reserved
애플릿 예제 import import i import import
java.awt.event.*; java.applet.Applet; j java.awt.Color; C l java.awt.Graphics;
public class MyApplet3 extends Applet implements MouseListener { int x, y; public void init() { addMouseListener(this); } public void paint(Graphics g) { super.paint(g); g.setColor(Color.RED); g.fillRect(x, y, 20, 20); }
// 마우스 리스너를 등록한다.
// 미우스의 현재 위치에 사각형을 그린다.
© 2009 인피니티북스 All rights reserved
애플릿 예제 public void mouseEntered(MouseEvent event) { } public bli void id mouseExited(MouseEvent E i d(M E event)) { } public void mousePressed(MouseEvent event) { } public void mouseReleased(MouseEvent event) { } public void mouseClicked(MouseEvent event) { x = event.getX(); // 미우스가 클릭되면 현재 위치를 얻는다. y = event.getY(); repaint(); // 다시 화면을 그린다. } } paint()를 직접 호출하는 출 는것 것이 아니라 repaint()를 호출한다. © 2009 인피니티북스 All rights reserved
애플릿 예제 import import i import import
java.awt.event.*; java.applet.Applet; j java.awt.*; * javax.swing.*;
public class MyApplet4 extends JApplet implements ActionListener { JTextField field; JTextArea area; public void init() { field = new JTextField(); area = new JTextArea(); setLayout(new BorderLayout()); add(field, BorderLayout.SOUTH); add(area, BorderLayout.CENTER); field.addActionListener(this); }
배치 관리자를 BorderLayout 으로 변경
© 2009 인피니티북스 All rights reserved
애플릿 예제 public void actionPerformed(ActionEvent arg0) { area.append(field.getText() + "\n"); fi ld l All() field.selectAll(); area.setCaretPosition(area.getDocument().getLength()); repaint(); 이벤트 처리기 작성. } }
© 2009 인피니티북스 All rights reserved
애플릿 매개 변수 • 애플릿과 웹브라우저는 매개 변수를 통하여 값들을 주고 받을 수 있 다. HTML
파일 일
애플릿
<APPLET CODE="test.class" WIDTH=200 HEIGHT=200> <PARAM NAME="imgDir" VALUE="java/images"> <PARAM NAME="bColor" VALUE="0xff00c0"> <PARAM NAME="COUNT" VALUE=20> ... </APPLET> int count = 0; ... String countString = getParameter("COUNT"); if (wString != null) { y{ try count = Integer.parseInt(countString); } catch (NumberFormatException e) { count = 10;; // 디폴트값을 사용 } ©}2009 인피니티북스 All rights reserved
애플릿이 할 수 없는 것 • 신뢰받지 못한 애플릿이 할 수 없는 기능은 다음과 같다. • 라이브러리를 적재하거나 네이티브 메소드를 정의할 수 없다. • 수행되고 있는 호스트 컴퓨터의 파일을 읽고 쓸 수 없다. • 네트워크를 통한 연결을 만들 수 없다. 없다 • 호스트 컴퓨터상의 프로그램을 실행시킬 수 없다. • 호스트 컴퓨터의 시스템 특성을 읽을 수 없다.
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved
Power Java
제27장 데이터베이스 프로그래밍
© 2009 인피니티북스 All rights reserved
이번 장에서 학습할 내용
•자바와 데이터베이스 •데이터베이스의 기초 •SQL •JDBC를 이용한 프로그래밍 •변경가능한 결과 집합
© 2009 인피니티북스 All rights reserved
자바를 통하여 데이터베이스 를 사용하는 방법을 학습합니다.
자바와 데이터베이스 JDBC(Java Database Connectivity)는 자바 API의 하나로서 데이터베 이스에 연결하여서 데이터베이스 안의 데이터에 대하여 검색하고 데 이터를 변경할 수 있게 한다.
© 2009 인피니티북스 All rights reserved
데이터베이스 프로그램 개발 절차 ① DBMS(DataBase Management System)를 설치 ② 자신이 설치한 DBMS에 필요한 JDBC 드라이버를 설치한다. ③ JDBC가 제공하는 기능을 이용하여 데이터베이스 응용 프로그램을 개발한다. JDBC를 통하여 데이터베이스에 연결되면 그 다음 에는 SQL 명령어를 데이터베이스에 전달하면 됩니다.
© 2009 인피니티북스 All rights reserved
데이터베이스란? 관계형 데이터베이스(database)는 데이터를 여러 개의 테이블에 나 누어서 저장한다. 가장 많이 사용되는 DBMS 오라클, 마이크로소프트의 SQL Server, 사이베이스, MySQL
© 2009 인피니티북스 All rights reserved
테이블
© 2009 인피니티북스 All rights reserved
MySQL MySQL은 www.mysql.com 에서 다운로드 무료 설치 프로그램 제공
© 2009 인피니티북스 All rights reserved
SQL이란? 관계형 데이터베이스에서 사용하기 위하여 설계된 언어
© 2009 인피니티북스 All rights reserved
MySQL에서 SQL 실행하기 MySQL은 다음과 같은 명령어 행 클라이언트를 가지고 있다.
© 2009 인피니티북스 All rights reserved
데이터베이스 생성하기 기존의 데이터베이스가 있으면 삭제
데이터베이스 생성
데이터베이스 사용
데이블 생성
© 2009 인피니티북스 All rights reserved
레코드 추가하기
레코드 삽입
© 2009 인피니티북스 All rights reserved
레코드 검색하기 레코드 선택
© 2009 인피니티북스 All rights reserved
검색시 조건 지정 선택 조건 지정
© 2009 인피니티북스 All rights reserved
정렬하려면 정렬 지정
© 2009 인피니티북스 All rights reserved
레코드 수정하기 레코드 수정 명령어
© 2009 인피니티북스 All rights reserved
레코드 삭제하기 레코드 삭제 명령어
© 2009 인피니티북스 All rights reserved
결과 집합과 커서 쿼리의 조건을 만족하는 레코드들의 집합이 결과 집합(result set)이 다. 커서(cursor)는 결과 집합의 레코드들을 포함하고 있는 파일에 대한 포인터
레코드 ….. ….. ..… ….. ..… …....…….. ….. ..…….. …..
© 2009 인피니티북스 All rights reserved
커서
결과 집합
중간 점검 문제 1. 영화를 저장할 수 있는 테이블을 SQL을 사용하여 정의하여 보라. 2. books 테이블에서 가격이 30000원 이상이고 2005년 이후에 출간된 책을 검색하는 SQL 문장을 작성하여 보라.
© 2009 인피니티북스 All rights reserved
JDBC 드라이버 설치 1. www.mysql.com/products/connector로부터 드라이버를 다운로드받 아서 압축을 푼다. 2. 다음은 자바 가상 기계가 이 드라이버 파일을 찾을 수 있도록 하여야 한다. 클래스 경로를 나타내는 환경 변수인 CLASSPATH를 변경 또는 압축된 아카이브 파일을 jre/lib/ext 디렉토리에 복사
© 2009 인피니티북스 All rights reserved
© 2009 인피니티북스 All rights reserved
드라이버 클래스 적재 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out.println("드라이버를 찾을 수 업습니다“); }
지정된 이름의 클래스를 찾아서 메모리로 적재한다.
© 2009 인피니티북스 All rights reserved
데이터베이스 연결 String url = “jdbc:mysql://localhost/book_db”; String user = “root”; String password = “password”; con = DriverManager.getConnection(url, user, password);
사용자 아이디와 패스워드를 사용하여 데이터베이스에 연결.
© 2009 인피니티북스 All rights reserved
데이터베이스 연결 예제 import java.sql.*; public class ConnectDatabase { public static Connection makeConnection() { String url = "jdbc:mysql://localhost/book_db"; String id = "root"; String password = "password"; Connection con = null; try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("드라이버 적재 성공"); con = DriverManager.getConnection(url, id, password); System.out.println("데이터베이스 연결 성공"); } catch (ClassNotFoundException e) { System.out.println("드라이버를 찾을 수 없습니다."); } catch (SQLException e) { System.out.println("연결에 실패하였습니다."); } return con; © 2009 인피니티북스 All rights reserved }
데이터베이스 연결 예제 public static void main(String arg[]) throws SQLException { Connection con = makeConnection(); }
드라이버 적재 성공 데이터베이스 연결 성공
© 2009 인피니티북스 All rights reserved
SQL 문장 수행
© 2009 인피니티북스 All rights reserved
SQL 문장 수행 Statement s = con.createStatement(); // 문장 객체 생성 String select = “SELECT * FROM books ORDER BY book_id”; // SQL 문장 생성 ResultSet rows = s.executeQuery(select); // SQL 문장 실행
SQL문장을 실행하고 결과 집합을 반환한다.
© 2009 인피니티북스 All rights reserved
데이터베이스 연결 예제 import java.sql.*; public class SQLSelectTest { public static Connection makeConnection() { ... // 앞의 코드와 동일 } public static void main(String arg[]) throws SQLException { Connection con = makeConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM books"); while (rs.next()) { int id = rs.getInt("book_id"); 결과 집합에서 다음 레코드로 이동한다. String title = rs.getString("title"); System.out.println(id + " " + title); 현재 레코드에서 필드의 값을 가져온다. } } } © 2009 인피니티북스 All rights reserved
실행 결과 드라이버 적재 성공 데이터베이스 연결 성공 1 Operating System Concepts 2 Head First PHP and MYSQL 3 C Programming Language 4 Head First SQL
© 2009 인피니티북스 All rights reserved
레코드 수정, 삭제 import java.sql.*; public class SQLInsertTest { public static Connection makeConnection() { ...// 전과 동일 } public static void main(String arg[]) { addBook("Artificial Intellegence", "Addison Wesley", "2002", 35000); }
© 2009 인피니티북스 All rights reserved
레코드 수정, 삭제 private static void addBook(String title, String publisher, String year, int price) { Connection con = makeConnection(); try { Statement stmt = con.createStatement(); String s = "INSERT INTO books (title, publisher, year, price) VALUES "; s += "('" + title + "','" + publisher + "','" + year + "','" + price + "')"; System.out.println(s); int i = stmt.executeUpdate(s); if (i == 1) 레코드를 수정할때 사용. System.out.println("레코드 추가 성공"); else System.out.println("레코드 추가 실패"); } catch (SQLException e) { System.out.println(e.getMessage()); System.exit(0); } }
}
© 2009 인피니티북스 All rights reserved
실행 결과 드라이버 적재 성공 데이터베이스 연결 성공 INSERT INTO books (title, publisher, year, price) VALUES ('Artificial Intellegence','Addison Wesley','2002','35000') 레코드 추가 성공
© 2009 인피니티북스 All rights reserved
중간 점검 문제 1. 레코드의 모든 필드를 출력하도록 SQLSelectTest.java를 변경하여 보 라. 2. 사용자로부터 필드값을 받아서 새로운 레코드를 생성하도록 SQLInsertTest.java를 변경하여 보라.
© 2009 인피니티북스 All rights reserved
Q&A
© 2009 인피니티북스 All rights reserved