2008. 8. 23. 16:10

Part 6. AWT - II 컴포넌트의 이벤트 처리(1)

이벤트, 이벤트 소스, 이벤트 핸들러란?
이벤트(event) : 프로그램과 사용자간의 상호작용을 위해서 사용자가 키보드나 마우스 등의 장치를 통해서 응용 프로그램에 어떤 요구를 하는 사건을 말합니다.
이벤트 리스너(event listener) : 이벤트를 기다렸다가 이벤트가 발생하게 되면 전달되어오는 이벤트 소스 객체로 적당한 처리를 하게 되는 객체를 말합니다.
이벤트 소스(event source) : 버튼(Button)이나 스크롤바(Scrollbar)와 같이 이벤트가 발생한 컴포넌트 객체를 말합니다.

이벤트 처리 방법
1. 이벤트 패키지 임폴트 : import java.awt.event.*;
2. 처리할 이벤트에 대한 이벤트 리스너의 설계
public class ButtonListener implements ActionListener {
}
ActionListener는 이벤트 처리를 담당하는 이벤트 리스너 인터페이스
ButtonListener는 ActionListener 인터페이스를 구현하여 만든 이벤트 리스너 클래스
이벤트 리스너 클래스(ButtonListener)는 인터페이스를 구현한 것이므로 인터페이스 내부의 추상 메서드를 오버라이딩 해서 구현해야 한다.
ActionListener 인터페이스는 actionPerformed 메서드 한개만 추상 메서드로 가진다.
이 메서드는 버튼에 이벤트가 발생하면 호출되는 메서드이다.
3. 이벤트 리스너 객체를 생성한다.
4. 이벤트를 받아들인 컴포넌트 객체에 리스너를 등록한다.

아래는 레드,블루 버튼을 클릭하는 이벤트가 발생하면 배경이미지가 바뀌는 이벤트 처리
소스이다.
===================================================================================
package pack05;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// FrameEx가 두가지 역할(프레임으로서, 이벤트처리객체로서)을 하도록
class FrameEx extends Frame implements ActionListener{
 Button redBtn, blueBtn ;
 // actionPerformed의 전달인자인 ActionEvent가 이벤트소스에 정보를 갖고 있다.
 public void actionPerformed(ActionEvent e){
  System.out.println(e.getActionCommand()+"버튼이 눌림");
  if(e.getActionCommand().equals("빨간색")){
   setBackground(Color.RED);
  }
  else if(e.getActionCommand().equals("파란색")){
   setBackground(Color.BLUE);
  }
 }
 FrameEx(){
  // 배치관리자로 플로우 레이아웃 지정
  // 빨간색 버튼을 redBtn으로
  // 파란색 버튼을 blueBtn으로 생성
  // 프레임 크기를 300,200으로 설정
  // 눈에 보이도록 한다.
  setLayout(new FlowLayout());
  redBtn=new Button("빨간색");
  blueBtn=new Button("파란색");
  // 이벤트 소스인 버튼과 이벤트처리객체를 연결해 주어야 한다.
  redBtn.addActionListener(this);
  blueBtn.addActionListener(this);
  add(redBtn);
  add(blueBtn);
  setSize(300,200);
  setVisible(true);
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameEx();
 }
}
===================================================================================
윈도우 창에 X버튼을 누르면 창이 닫히도록 하기(윈도우리스너 인터페이스로 구현)
package training;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
// [닫기]버튼이 눌리면 창이 닫히도록 WindowListener 인터페이스 상속 받음
class FrameEvent extends Frame implements ActionListener, WindowListener{
 public void windowActivated(WindowEvent arg0) {  
 }
 public void windowClosed(WindowEvent arg0) {
 }
 // [닫기]버튼이 눌러졌을 때 호출되는 메소드
 public void windowClosing(WindowEvent arg0) {
  dispose();
  System.exit(0);
 }
 public void windowDeactivated(WindowEvent arg0) {
 }
 public void windowDeiconified(WindowEvent arg0) {
 }
 public void windowIconified(WindowEvent arg0) {
 }
 public void windowOpened(WindowEvent arg0) {
 }
 public void actionPerformed(ActionEvent e) {
  System.out.println(e.getActionCommand()+"버튼이 눌림");
  Object o=e.getSource();
  if(o==redBtn){
   setBackground(Color.RED);
  }
  else if(o==blueBtn){
   setBackground(Color.BLUE);
  }
 }
 // 클래스 내의 멤버(필드)로 버튼에 대한 레퍼런스 변수를 선언해야 한다.
 Button redBtn, blueBtn;
 FrameEvent(){
  setLayout(new FlowLayout());
  redBtn=new Button("빨간색");
  blueBtn=new Button("파란색");
  // 이벤트 소스인 버튼과 이벤트 처리 객체와 연결
  redBtn.addActionListener(this);
  blueBtn.addActionListener(this);
  // 이벤트 소스인 프레임과 이벤트 처리 객체와 연결
  this.addWindowListener(this);
  add(redBtn);
  add(blueBtn);
  setSize(400,300);
  setVisible(true);
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameEvent();
 }
}
===================================================================================
윈도우 어댑터 클래스를 통한 구현
package pack01;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameEvent extends Frame implements ActionListener{
 public void actionPerformed(ActionEvent e) {
  System.out.println(e.getActionCommand()+"버튼이 눌림");
  Object o=e.getSource();
  if(o==redBtn){
   setBackground(Color.RED);
  }
  else if(o==blueBtn){
   setBackground(Color.BLUE);
  }
 }
 // 클래스 내의 멤버(필드)로 버튼에 대한 레퍼런스 변수를 선언해야 한다.
 Button redBtn, blueBtn;
 FrameEvent(){
  setLayout(new FlowLayout());
  redBtn=new Button("빨간색");
  blueBtn=new Button("파란색");
  // 이벤트 소스인 버튼과 이벤트 처리 객체와 연결
  redBtn.addActionListener(this);
  blueBtn.addActionListener(this);
  add(redBtn);
  add(blueBtn);
  setSize(400,300);
  setVisible(true);
  SubClass sc=new SubClass();
  addWindowListener(sc);
 }

 // 창이 닫히도록 하기 위해서 필요한 메소드 : WindowClosing();
 class SubClass extends WindowAdapter{
  public void windowClosing(WindowEvent e) {
   dispose(); // 창(프레임)을 소멸
   System.exit(0); // 프로세스 죽임
  }
 }
} // Frame 클래스의 끝
public class Ex01 {
 public static void main(String[] args) {
  new FrameEvent();
 }
}
===================================================================================
외부 클래스와 내부 클래스
package pack01;
class Outer{ // 외부클래스
 int data=100;
 class Inner{ // 내부클래스 : 외부클래스의 모든 멤버를 가져다 사용할 수 있다.
  int b=200;
  public void printData(){
   System.out.println(data);
  }
 } // inner 클래스의 끝
} // outer 클래스의 끝
public class Ex02 {
 public static void main(String[] args) {
 
 }
}
===================================================================================
package pack01;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameExit extends Frame{
 FrameExit(){
  setSize(400,300);
  setVisible(true);
  // 이벤트 소스와 이벤트 처리 객체와 연결되어야 함
  this.addWindowListener(
   // WindowAdapter를 슈퍼로 갖는 서브클래스 설계 시작
   new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
     System.out.println("WindowClosing 메소드 호출");
     dispose();
     System.exit(0);
    }    
   } // 클래스 설계 끝
  ); // addWindowListener 메소드 호출
 }

}
public class Ex03 {
 public static void main(String[] args) {
  new FrameExit();
 }
}
===================================================================================

2008. 8. 21. 17:57

Chap 10. 테이블에 데이터 추가, 수정, 삭제하기

데이터를 입력하기 위해 사용하는 insert 문
형식 insert into 테이블명            insert into dept07          // dept테이블을 그대로 복사한
컬럼명 values(값);                    (deptno, dname, loc)    // dept07 테이블
                                              values (50,'TEST','YEOSU');
insert 문에서 컬럼명을 생략해도 정상적인 실행이 가능
insert into dept07
values (50,'TEST','YEOSU');

오류가 발생되는 예
1. 컬럼명에 기술된 항목보다 values 값이 적거나 많을때
values ( 50, 'TEST') OR values (50, 'TEST','YEOSU','TEST1');
2. 컬럼명이 잘못 기술되어 있을 때
(deptn, dname, loc)
3. 컬럼의 데이터 타입과 값이 서로 맞지 않을 때
values (50, 'TEST', YEOSU); // loc 컬럼은 문자형이므로 단일 인용부호('')를 사용해야함

서브쿼리로 로우 추가하기
create table dept01  // 테이블 구조만 복사하고 내용은 들어가지 않는다.
select * from dept
where 1=0;

create table dept01  // 테이블 구조와 내용이 전부 복사됨.
select * from dept;

update 문 : 테이블에 저장된 테이터를 수정
update 테이블명
set 컬럼명=변경할 값
where 조건절

'수업 > 오라클 + PL/SQL' 카테고리의 다른 글

Chap 13. 무결성 제약 조건  (0) 2008.08.27
Chap 11. 트랜잭션 관리  (0) 2008.08.27
Chap 9. 테이블 생성 및 변경, 삭제하기  (0) 2008.08.20
Chap3,4 SQLPLUS 명령어 & 연산자  (1) 2008.08.20
Chap 2. SQL의 기본  (2) 2008.08.20
2008. 8. 21. 15:41

Part 6. AWT - I AWT를 이용한 GUI 작성

자바에서는 AWT로 GUI컴포넌트(버튼, 체크박스 등)을 제공하며 AWT를 사용하기 위해서
import java.awt 를 해야합니다.
아래는 awt의 계층도 입니다.

사용자 삽입 이미지
Container 클래스
자바는 GUI 컴포넌트를 컨테이너 내부에 배치하는데 컨테이너의 종류에는 Window, Frame, Panel, Dialog 등이 제공됩니다. 오늘은 Frame과 Panel 에 대해서 살펴봅니다.

Frame 클래스에서 사용되는 메서드입니다.

생성자

public Frame ( )

기본 생성자입니다.

public Frame (String title)

타이틀바의 문자열을 지정합니다.

메서드

public String getTitle()

타이틀바의 문자열을 가져옵니다.

public boolean isResizable()

창의 크기 변경 여부를 알아냅니다.

public void setMenuBar(MenuBar mb)

프레임에 메뉴를 등록합니다.

public void setResizable(boolean b)

창의 크기 변경 여부를 지정합니다.

public void setTitle(String title)

타이틀바의 문자열을 지정합니다.

================= 프레임 객체를 생성하고 사이즈와 보임을 지정하여 창을 출력 ==========
package training;
import java.awt.Frame;
public class Ex01 {
 public static void main(String[] args) {
  Frame f=new Frame("Frame Demo"); // 프레임 객체 생성
  f.setSize(300, 200); // 사이즈 지정 후,
  f.setVisible(true); // 보여지도록
 }
}
===================================================================================
배치관리자(Layout Manager)
프레임에 컴포넌트를 어떤 식으로 추가할 것인지 레이아웃(Layout)을 관리하는 클래스
FlowLayout, BorderLayout, GridLayout 세개를 살펴보도록 하겠습니다.

컨테이너마다 디폴트로 제공하는 배치관리자가 아래의 그림처럼 다릅니다.
Frame과 Dialog는 BorderLayout 이고 Panel과 Applet은 FlowLayout 입니다.
사용자 삽입 이미지
===================================================================================
컨테이너에게 배치관리자를 지정하는 절차
1. 객체 생성 : FlowLayout f = new FlowLayout();
2. 프레임에 지정
    Frame f = new Frame();
    f.setLayout(layout);
3. add 메소드로 프레임에 컴포넌트를 추가
    Button bt01 = Button01();
    f.add(bt01);
============== 프레임의 배치관리자로 플로우 레이아웃 설정하기 ======================
플로우 레이아웃 : 컨테이너 안에 가로 방향으로 물 흐르듯이 배치할때 사용
package pack01;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
class FrameEx extends Frame{
 FrameEx(){
 방법 1. /*FlowLayout f1=new FlowLayout();// 배치관리자 객체 생성
  setLayout(f1); */ // 프레임에 해당 배치관리자를 설정*/
  /*방법 2.*/ setLayout(new FlowLayout()); // 배치관리자 객체 생성하여 프레임에 설정
  // 컴포넌트를 생성해서 프레임에 추가
  add(new Button("버튼1"));
  add(new Button("버튼2"));
  add(new Button("버튼3"));
  add(new Button("버튼4"));
  add(new Button("버튼5"));
  setSize(300,200); // 크기 설정
  setVisible(true); // 보여지도록 해야 한다.
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameEx();
 }
}
============= 프레임의 배치관리자로 보더 레이아웃 설정하기 ==========================
보더 레이아웃 : 컴포넌트의 위치를 동,서,남,북,센터로 배치할 때 사용
add 메서드를 통해 컴포넌트를 컨테이너에 추가할 때 동,서,남,북,센터 위치를 지정한다.
package pack02;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
class FrameEx extends Frame{
 FrameEx(){
  /*FlowLayout f1=new FlowLayout();// 배치관리자 객체 생성
  setLayout(f1);// 프레임에 해당 배치관리자를 설정*/
  setLayout(new BorderLayout()); // 배치관리자 객체 생성하여 프레임에 설정
  // 컴포넌트를 생성해서 프레임에 추가
  add(new Button("버튼1"), BorderLayout.NORTH);
  add(new Button("버튼2"), BorderLayout.WEST);
  add(new Button("버튼3"), BorderLayout.CENTER);
  add(new Button("버튼4"), BorderLayout.EAST);
  add(new Button("버튼5"), BorderLayout.SOUTH);
  setSize(300,200); // 크기 설정
  setVisible(true); // 보여지도록 해야 한다.
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameEx();
 }
}
============= 프레임의 배치관리자로 그리드 레이아웃 설정하기 ========================
그리드 레이아웃 : 행의 개수와 열의 개수를 지정하여 행렬의 구조로 컴포넌트를 배치
package pack03;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
class FrameEx extends Frame{
 FrameEx(){
  /*FlowLayout f1=new FlowLayout();// 배치관리자 객체 생성
  setLayout(f1);// 프레임에 해당 배치관리자를 설정*/
  //setLayout(new GridLayout()); // 배치관리자 객체 생성하여 프레임에 설정
  //setLayout(new GridLayout(3,2)); // 원하는 행,렬을 지정할 수 있다.
  //setLayout(new GridLayout(2,3));
  setLayout(new GridLayout(1,5));
  // 컴포넌트를 생성해서 프레임에 추가
  add(new Button("버튼1"));
  add(new Button("버튼2"));
  add(new Button("버튼3"));
  add(new Button("버튼4"));
  add(new Button("버튼5"));
  setSize(300,200); // 크기 설정
  setVisible(true); // 보여지도록 해야 한다.
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameEx();
 }
}
========================== Panel 컨테이너 =========================================
Panel 클래스는 여러 개의 컴포넌트들을 그룹별로 모을때 주로 사용하는 프레임과 같은 일종의 컨테이너로서 그룹 단위로 한꺼번에 이벤트를 처리할 수 있다.
또한 컴포넌트들을 그룹별로 모아 둔 패널을 Frame과 같은 다른 컨테이너에 붙여야 한다.
package pack04;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
// Frame의 상속을 받는 서브 클래스를 생성한 후에
// 생성자를 추가하여 프레임의 크기 설정한 후, 보여지도록
class FrameTest extends Frame {
 Panel p1,p2,p3; // 패널 레퍼런스 변수 선언(컨테이너)
 Button b1,b2,b3,b4,b5;
 FrameTest(){
  p1=new Panel();// 생성자 안에서 인스턴스 생성
  p2=new Panel();
  p3=new Panel();
  //p1.setBackground(Color.YELLOW);
  //p2.setBackground(Color.PINK);
  //p3.setBackground(Color.BLUE);
  setBackground(Color.RED);
  // p1 북쪽, p2 가운데, p3 남쪽에 배치
  add(p1, BorderLayout.NORTH);
  add(p2, BorderLayout.CENTER);
  add(p3, BorderLayout.SOUTH);
  b1=new Button("버튼1");
  b2=new Button("버튼2");
  b3=new Button("버튼3");
  b4=new Button("버튼4");
  b5=new Button("버튼5");
  // 패널도 컨테이너이기에 버튼을 붙일 수 있다.
  p1.add(b1); p1.add(b2);
  p2.add(b3);
  p3.add(b4); p3.add(b5);
  b1.setVisible(false); b2.setVisible(false);
  p3.setVisible(false);
  // setSize(300,200); // 크기를 임의 설정
  pack(); // 크기 자동 설정
  setVisible(true);
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
2008. 8. 20. 18:40

Chap 9. 테이블 생성 및 변경, 삭제하기

오라클에서 제공하는 자료형

자료형의 종류

의미

CHAR(N)

주어진 크기만큼 고정 길이의 문자 저장
1바이트~2000바이트

VARCHAR2(N)

주어진 크기만큼 가변 길이의 문자 저장
1바이트~4000바이트

NVARCHAR2(N)

국가별 국자 집합에 따른 크기의 문자 또는 바이트의 가변 길이 문자
 1바이트~4000바이트

NUMBER(p, s)

정밀도와 스케일로 표현되는 숫자

DATE

날짜 형식을 저장

ROWID

테이블내 행의 고유 주소를 가지는 64진수 문자
해당 6바이트(제한된 ROWID) 또는 10바이트(확장된 ROWID)

BLOB

대용량의 바이너리 데이터를 저장
최대 4GB

CLOB

대용량의 텍스트 데이터를 저장
최대 4GB

BFILE

대용량의 바이너리 데이터를 파일 형태로 저장
최대 4GB

TIMESTAMP(n)

DATE 형의 확장된 형태

INTERVAL YEAR TO MONTH

년과 월을 이용하여 기간을 저장

INTERVAL DAY TO SECOND

일, 시, 분, 초를 이용하여 기간을 저장
두 날짜 값의 정확한 차이를 표현한는데 유용


1. 테이블 생성
create table 테이블명
(컬럼명 자료형)
=======사번, 이름, 급여로 테이블 구성=============================================
CREATE TABLE em01
 (empno NUMBER(4),
 ename varchar2(20),
 sal NUMBER(7, 2));
====================================================
식별자의 선언
컬럼명이나 테이블명을 선언하기 위해서는 다음과 같은 원칙을 지켜야 한다.
1. 시작은 반드시 영문자
2. 예약어(SELECT 등)는 쓸 수 없다.
3. 유일한 단어이어야 한다.
4. _,$는 사용가능하다.

서브쿼리를 이용한 테이블 생성
테이블의 구조와 데이터까지 복사하는 경우
create table emp01
as
select * from emp;
원하는 컬럼만 복사하는 경우
create table emp01
as
select empno, ename, sal from emp;
테이블의 구조만 복사
create table emp01
as
select * from emp
where 1=0;      // where 조건 절이 항상 거짓이 되므로 빈 테이블이 생성된다.

2. 테이블의 구조 변경
컬럼 추가
alter table 테이블명                   alter table emp01
add (컬럼명 자료형);                add (email varchar2(10));
컬럼 변경
alter table emp01
modify (email varchar2(40));
컬럼 삭제
alter table emp01
drop column email;
테이블 제거
drop table emp01;
================================================================================
EMP 테이블의 사원번호, 이름, 직급, 매니저 칼럼과 동일한 칼럼명과 유형을 갖는 테이블을 EMP01란 이름으로 생성하라.
create table emp01
as
select empno, ename, job, mgr from emp;
이미 존재하는 EMP01 테이블에 EMP 테이블과 동일한 구조로 입사일자 칼럼을 추가하라.
alter table emp01
add(hiredate date);
EMP01 테이블의 직급 칼럼의 크기를 20으로 변경하라.(기존 job varchar2(9))
alter table emp01
modify (job varchar2(20));
EMP01 테이블에서 매니저 칼럼을 삭제하라.
alter table emp01
drop column mgr;
================================================================================
테이블 명을 변경하는 RENAME 문
형식 : RENAME old_name TO new_name
EMP01 테이블의 이름을 EMP02로 변경하라.
rename emp01 to emp02;

'수업 > 오라클 + PL/SQL' 카테고리의 다른 글

Chap 11. 트랜잭션 관리  (0) 2008.08.27
Chap 10. 테이블에 데이터 추가, 수정, 삭제하기  (0) 2008.08.21
Chap3,4 SQLPLUS 명령어 & 연산자  (1) 2008.08.20
Chap 2. SQL의 기본  (2) 2008.08.20
Chap 8. 서브쿼리  (0) 2008.08.20
2008. 8. 20. 17:59

Chap3,4 SQLPLUS 명령어 & 연산자

3. SQLPLUS 명령어
SQLPLUS 명령어는 한줄을 넘어가서 다음 줄까지 이어져야 하는 경우 반드시 연결문자(-)를 써야 명령문이 이어진다.

LIST (L) : 버퍼에 있는 내용을 나타냄
RUN(R, /) : 버퍼에 저장된 쿼리문을 실행시킴
EDIT(ED) : 버퍼에 저장된 쿼리문을 메모장에서 편집
SAVE 파일명 : 최근에 수행한 쿼리문을 파일로 저장
SAVE 파일명 REPLACE : 저장한 파일 덮어쓰기
@파일명 : 파일을 실행
GET : 파일로 저장한 쿼리문 불러오기
SPOOL : 실행결과 화면 갈무리
SPOOL OFF : SPOOL 해제
SET : 시스템 변수 설정 [
1. HEADING :  컬럼 제목의 출력 여부 결정 (ON, OFF)
2. LINESIZE : 한 화면에 출력되는 라인수 결정
3. PAGESIZE : 한 페이지에 출력되는 페이지의 크기 결정 ]

4. 연산자
WHERE 컬럼명 연산자 비교대상값;
비교연산자( > , >= , < , <= , = )
문자열 데이터 조회
SQL문에서는 대소문자를 구분하지 않지만, 테이블내에 저장된 데이터 값은 대소문자를 구분한다.
컬럼의 자료형이 날짜형(DATE)일 경우에는 비교 연산을 하기 위해서는 단일 따옴표(' ') 안에 내용을 기술한다.
임의의 문자 또는 문자열을 포함한 값을 찾을때는 Like 연산자를 사용한다.
% : 0~n개의 문자열을 대체
_ : 단 1글자의 문자열을 대체
IN 연산자 : 특정 필드가 여러 개의 값 중에 하나인지를 확인
형식 : 컬럼명 IN (value_list)
BETWEEN A AND B
NOT 연산자
IS NULL(IS NOT NULL) : 임의의 컬럼이 NULL인지 아닌지를 비교 검색
정렬 출력 : ORDER BY 컬럼명 (DESC, ASC)
================================================================================
테이블 EMP 중에서 부서번호가 10번인 사원에 관한 모든 정보만 출력하라.  
select *
from emp
where deptno=10;
테이블 EMP 중에서 급여가 2000 미만이 되는 사원의 정보 중에서
사번과 이름, 급여를 출력하라.
select ename, sal
from emp
where sal <= 2000;

'수업 > 오라클 + PL/SQL' 카테고리의 다른 글

Chap 10. 테이블에 데이터 추가, 수정, 삭제하기  (0) 2008.08.21
Chap 9. 테이블 생성 및 변경, 삭제하기  (0) 2008.08.20
Chap 2. SQL의 기본  (2) 2008.08.20
Chap 8. 서브쿼리  (0) 2008.08.20
Chap 7. 조인  (1) 2008.08.18
2008. 8. 20. 17:45

Chap 2. SQL의 기본

SQL 접속
sqlplus scott/tiger -> 기본계정 scott로 접속

데이터 구조 살펴보기
desc 테이블명;

select * from emp; -> emp 테이블의 모든 컬럼을 조사.

산술연산자의 사용이 가능하다.
+, -, *, / 의 사칙연산이 가능

NULL도 데이터이다
1. 0(zero)도 아니고, 2. 빈공간도 아니다.
3. 미확정, 알수 없는 값을 의미하며, 4. 어떤값인지 알 수 없지만 어떤 값이 존재하고 있다.
5. ? 혹은 무한대의 의미이므로 연산, 할당, 비교가 불가능하다.

특정 컬럼의 로우가 null 일때 0(zero)로 대체하기 위한 nvl함수
형식 nvl ( 컬럼명, 0)

중복되는 컬럼을 한 번씩만 보여주기 위한 distinct
================================================================================
EMP 테이블에서 칼럼 JOB를 표시하되 중복된 값은 한번만 표시하라.
select distinct job
from emp;
사원들이 어떤 부서에 소속되어 있는지 소속 부서번호 출력하되 중복되지 않고
한번씩 출력하는 쿼리문을 작성하자.
select distinct deptno
from emp;
================================================================================

'수업 > 오라클 + PL/SQL' 카테고리의 다른 글

Chap 9. 테이블 생성 및 변경, 삭제하기  (0) 2008.08.20
Chap3,4 SQLPLUS 명령어 & 연산자  (1) 2008.08.20
Chap 8. 서브쿼리  (0) 2008.08.20
Chap 7. 조인  (1) 2008.08.18
Chap 6. 그룹함수  (0) 2008.08.14
2008. 8. 20. 16:06

Chap 8. 서브쿼리

서브쿼리란 하나의 테이블에서 검색한 결과를 다른 테이블에 전달하여 새로운 결과를 검색하는 경우에 사용하는 기능이다.

서브퀴리에 기술되는 select 문은 괄호()로 묶어주어야 하며, 서브쿼리가 실행이 된 후,
메인쿼리가 실행 된다.

단일행 서브쿼리
하나의 행만 검색하여 그 결과를 메인쿼리에 보내는 것
// 존스의 deptno를 emp 테이블에서 검색하고 dept테이블에 적용시켜 dname을 검색
select dname
from dept
where deptno=(select deptno
                      from emp
                      where ename='JONES');
서브쿼리에서는 그룹함수의 사용이 가능하다.
// emp 테이블에서 평균급여보다 높은 직원의 이름과 급여를 출력하라.
select ename, sal
from emp
where sal > (select avg(sal)
                   from emp);

다중행 서브쿼리
서브쿼리에서 반환되는 결과가 하나 이상의 행일 때 사용한다.

종류

의미

IN

메인 쿼리의 비교 조건(‘=’ 연산자로 비교할 경우)이 서브 쿼리의 결과 중에서 하나라도 일치하면 참입니다.

ANY, SOME

메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상이 일치하면 참입니다.

ALL

메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참입니다.

EXIST

메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참입니다.

================================================================================
1.SMITH와 동일한 직급을 가진 사원의 이름과 직급을 출력하라.(단일행 서브 쿼리 이용)
select ename, job
from emp
where job=(select job
                 from emp
                 where ename='SMITH')
/
2. 부서별로 가장 급여를 많이 받는 사원의 정보를 출력하라.(IN 연산자 이용)
select *
from emp
where sal in(select max(sal)
                   from emp
                   group by deptno)
/
3. 직급이 'SALESMAN'인 사원이 받는 급여들의 최대 급여보다 많이 받는 사원들의 이름과 급여를 출력하되
   부서번호가 20번인 사원은 제외한다.(ALL 연산자 이용)
select ename, sal
from emp
where sal > all (select max(sal)
                        from emp
                        where job='SALESMAN')
/
4. 직급이 'SALESMAN'인 사원이 받는 급여들의 최소 급여보다 많이 받는 사원들의 이름과 급여를 출력하되
부서번호가 20번인 사원은 제외한다.(ANY 연산자 이용)
select ename, sal
from emp
where sal > any (select min(sal)
                  from emp
                  where job='SALESMAN'
                  and deptno not in(20))
================================================================================

'수업 > 오라클 + PL/SQL' 카테고리의 다른 글

Chap3,4 SQLPLUS 명령어 & 연산자  (1) 2008.08.20
Chap 2. SQL의 기본  (2) 2008.08.20
Chap 7. 조인  (1) 2008.08.18
Chap 6. 그룹함수  (0) 2008.08.14
Chap 5. SQL 주요 함수  (0) 2008.08.13
2008. 8. 20. 14:35

Part 5. 자바에서 자주 사용되는 클래스 IV - 컬렉션 클래스와 제네릭

/*배열은 원소의 자료형태가 결정
int []s=new int[5];
String []name=new String[5];

컬렉션 클래스의 설계 원리
- 자료구조(알고리즘) - 해쉬 테이블 혹은 ArrayList가 일반화되어 정의
- 원소들을 자바의 최상위 클래스 Object 형으로 저장하도록 설계
- 원소가 추가되는 순간에 업캐스팅

ArrayList []s=new ArrayList(); // 점수를 저장하기 위한 용도 : 원소가 Object형
ArrayList []name=new ArrayList(); // 이름을 저장하기 위한 용도 : 원소가 Object형
[1.4버전까지의 컬렉션 클래스의 단점]
1. 하나의 ArrayList 객체의 원소 자료형이 혼합되어서 사용될수 있다는 단점
2. 원소를 추출한 후에는 다운캐스팅을 위한
   명시적인 형변환을 해야함(캐스트 연산자로)
   name.add("이강국");
   name.add(10); // 원소의 자료형이 혼합되어 사용 됨
   String str=(String)name.get(0); // Object 형이므로, 다운캐스팅이 필요하다.

제너릭 클래스 : 컬렉션 클래스에서 사용되는 JDK5.0에서 새롭게 나온 개념
하나의 클래스가 알고리즘을 적용받을 수 있는 원소의 자료형을 다양하게 하기 위해서
제너릭 클래스란 개념을 5.0에서 가져다 사용
제너릭 클래스는 로직만 구현하고 원소들의 자료형태에 대해서는 언급하지 않음

객체를 생성할 때에는 자료형을 언급해야 함.
ArrayList<Integer> []s=new ArrayList<Integer>(); // 원소 : Integer
ArrayList<String> []name=new ArrayList<String>(); // 원소 : String
name.add("조현상");
name.add(10); // 에러 남 : 원소의 자료형이 혼합되어 사용되지 못함
String str=name.get(0); // 다운캐스팅이 필요없다.*/

// 문자를 가져다가 대문자로 출력하기
package training;
import java.util.ArrayList;
public class Ex01 {
 public static void main(String[] args) {
  // JDK 1.4에서 사용되던 컬렉션 클래스
  ArrayList list = new ArrayList();
  list.add("apple"); // 내부적으로 저장될때에는 Object 형으로 업캐스팅됨 
  list.add("banana");
  list.add("orange");
  list.add("3"); // 단점 : 원소들의 자료형이 혼합되어 사용
  // list에 저장된 원소들을 갖다가 대문자로 출력하기
  for(int i=0;i<list.size();i++){
   System.out.println(list.get(i)+" ");
   // 대문자로 변환하기 위한 메소드로 toUpperCase가
   // String 클래스에서 제공된다.
   // 단점 : 다운 캐스팅을 위해 캐스트 연산자를 기술해야 한다.
   String item=(String)list.get(i);
   System.out.println(item.toUpperCase());
  } 
 }
}
===============점수 5개로 총점과 평균을 구하기 1. 배열 ==============================
// 배열 : 배열의 크기가 변경되지 않는다. 배열에 원소를 추가하거나 삭제할 수 없다.
// ArrayList : 배열의 크기가 변경 되고 배열에 원소를 추가하거나 삭제할 수 있다.
public class Ex03 {
 public static void main(String[] args) {
  int [] a={90, 85, 70, 80, 95};
  int tot=0;
  for(int i=0;i<a.length;i++){
   System.out.println(a[i] + " ");
   tot+=a[i];
  }
  System.out.println("\n 총점 : " + tot);
  System.out.println("\n 평균 : " + tot/a.length);
 }
}
===============점수 5개로 총점과 평균을 구하기 2. ArrayList===========================
import java.util.ArrayList;
public class Ex04 {
 public static void main(String[] args) {
  ArrayList list=new ArrayList();
  System.out.println("원소의 갯수 : "+list.size());
  list.add(90);
  list.add(85);
  list.add(70);
  list.add(80);
  list.add(95);
  System.out.println("원소의 갯수 : "+list.size());
  int tot=0;
  for(int i=0;i<list.size();i++){
   System.out.println(list.get(i) + " ");
   tot=tot+(Integer)list.get(i);
   // tot=tot+list.get(i);
  }
  System.out.println("\n 총점 : " + tot);
  System.out.println("\n 평균 : " + tot/list.size());
 }
}
===================================================================================
package training;
import java.util.ArrayList;
public class Ex01 {
 public static void main(String[] args) {
  // JDK 1.4에서 사용되던 컬렉션 클래스
  ArrayList list = new ArrayList();
  list.add("apple"); // 내부적으로 저장될때에는 Object 형으로 업캐스팅됨 
  list.add("banana");
  list.add("orange");
  list.add("3"); // 단점 : 원소들의 자료형이 혼합되어 사용
  // list에 저장된 원소들을 갖다가 대문자로 출력하기
  for(int i=0;i<list.size();i++){
   System.out.println(list.get(i)+" ");
   // 대문자로 변환하기 위한 메소드로 toUpperCase가
   // String 클래스에서 제공된다.
   // 단점 : 다운 캐스팅을 위해 캐스트 연산자를 기술해야 한다.
   String item=(String)list.get(i);
   System.out.println(item.toUpperCase());
  } 
 }
}
===================================================================================
package training;
import java.util.ArrayList;
public class Ex02 {
 public static void main(String[] args) {
  // 단점 : 원소들의 자료형이 혼합되어 사용되지 않도록
  // 단점 : 다운 캐스팅하지 않도록
  // JDK5.0부터 컬렉션 클래스를 제너릭 클래스 형태로 제공
  // 객체 생성 시, 원소의 자료형들을 결정하기
  // 제너릭_컬렉션 클래스 <원소의 자료형>
  ArrayList<String> list = new ArrayList<String>();
  list.add("apple");  
  list.add("banana");
  list.add("orange");
  // list.add(3); // 원소들의 자료형이 혼합되어 사용되지 않도록
  for(int i=0;i<list.size();i++){
   System.out.println(list.get(i)+" ");  
   String item=list.get(i);
   // String형으로 다운캐스팅 하지 않아도 된다.
   System.out.println(item.toUpperCase());
  } 
 }
}
===================================================================================
package training;
import java.util.Enumeration; // import를 하기 위해서 <ctrl>+<shift>+o(영문)
import java.util.Hashtable;
public class Ex03 {
 public static void main(String[] args) {
  // key, value를 쌍으로 저장하는 해쉬 테이블
  // "이강국" 65.5
  Hashtable<String, Double>ht=new Hashtable<String, Double>();
  ht.put("이강국", 63.5);
  ht.put("김재필", 68.5);
  ht.put("김경윤", 70.5);
  System.out.println(ht.get("이강국"));
  // 해쉬 테이블에 저장된 모든 정보를 얻어오기
  Enumeration<String> name=ht.keys();
  while(name.hasMoreElements()){
   String key=name.nextElement();
   Double weight=ht.get(key);
   System.out.println(key + " : " + weight);
  }
 }
}
===================================================================================

2008. 8. 19. 16:31

Part 5. 자바에서 자주 사용되는 클래스 III - 문자열 관련 클래스

다른 클래스들은 new 연산자를 통해서만 객체를 생성할 수 있지만, String 클래스는 문자열 상수를 지정하면 바로 String 객체가 생성 된다.

문자열 관련 클래스 : String, StringBuffer 등이 있다.
String 클래스와 StringBuffer 클래스의 차이점
String 클래스는 메서드에 의해 처리된 결과를 저장할 문자열을 새롭게 생성하지만
StringBuffer 클래스는 메모리 상의 자신의 값이 수정 된다는 점이 다르다.

String 관련 메소드

int length()

String 클래스의 문자열 길이를 반환한다.

boolean equals(Object anObject)

두 String 클래스 객체의 내용이 같은지를 비교한다.

boolean equalsIgnoreCase

(String anotherString)

대소문자 구분 없이 문자열이 같은지를 비교한다.

String substring(int beginIndex)

beginIndex로 주어진 값부터 문자열의 마지막까지의 문자열을 반환해주는 메서드

String concat(String str)

이 메서드를 호출한 String 클래스객체의 내용과 인자로 주어진 문자열을 합친 새로운 String 클래스객체를 반환한다.

String replace

(char oldChar, char newChar)

기존의 oldChar로 표시된 모든 문자들을 newChar로 표시된 문자로 모두 바꾸어준다

String toLowerCase()

String 클래스 객체의 모든 문자를 소문자로 바꾼다

String toUpperCase()

String 클래스 객체의 모든 문자를 대문자로 바꾼다.

char charAt(int index)

index로 지정된 곳의 문자값을 반환한다.

int indexOf(int ch)

주어진 문자가 존재하는 위치를 알려준다. 존재하지 않으면 -1을 되돌린다.

int lastIndexOf(int ch)

주어진 문자가 존재하는 마지막 위치를 알려준다. 존재하지 않으면 -1을 되돌린다.

String trim( )

문자열의 시작과 끝 사이에 있는 공백을 없앤다.

static String valueOf(Object obj)

주어진 객체나 기본 데이터형을 문자열로 바꾼다.

===================================================================================
package training;
public class Ex02 {
 public static void main(String[] args) {
  // String  객체 생성하는 2가지 방법
  // 1. new 연산자로 다른 클래스와 동일하게 생성
  String str01=new String("안녕");
  String str02=new String("안녕");
  System.out.println(str01==str02);
  // 2. 문자열 상수를 바로 레퍼런스 변수에 대입
  // 최초로 사용된 문자열 상수는 메모리 할당을 한다.
  String str03="안녕";
  // 이미 사용된 문자열상수일 경우는 메모리할당을 하지않고
  // 최초로 사용되어서 메모리할당한 상수를 가리킴
  String str04="안녕";
  System.out.println(str03==str04);
 }
}
===================================================================================
package training;
public class Ex03 {
 public static void main(String[] args) {
  // String 클래스의 특징을 살펴보기 위한 예제
  String str1="Java Programming";
  // str1이 저장하고 있는 데이터를 대문자로 변환
  str1.toUpperCase();
  System.out.println(str1);
  // 불변객체 : 생성당시의 값이 절대 변하지 않고 유지된다.
  // 메소드를 호출하면 또 다른 메모리를 할당하여
  // 변환된 값을 저장하게 된다.
  System.out.println(str1.toUpperCase());
  String str2=str1.toUpperCase();
  System.out.println(str1);
  System.out.println(str2);
  // 대문자로 변환한 메소드 호출후에 str1에 대문자가
  // 저장되도록 해 보세요.
  str1=str1.toUpperCase();
  System.out.println(str1);
 }
}
===================================================================================
package training;
public class Ex04 {
 public static void main(String[] args) {
  String str01="Java";
  String str02="JAVA";
  System.out.println(str01.length());
  System.out.println(str01.equals(str02)); // 대,소문자 구별
  System.out.println(str01.equalsIgnoreCase(str02)); // 대,소문자 무시
  String str03="Programming";
  String str04=str01.concat(str03); // 문자 결합
  System.out.println(str04);
  // 012345678901234
  // JavaProgramming
  System.out.println(str04.substring(4,8));
  System.out.println(str04.substring(4));
  System.out.println(str04.replace('a','e'));
  // char 형 배열
  char []str={'J','a','v','a'};
  System.out.println(str);
  // 한문자씩 출력하기 - 배열일 경우에는 []연산자에 인덱스
  System.out.println(str[0]);
  System.out.println(str[1]);
  System.out.println(str[2]);
  System.out.println(str[3]);
  // String 객체에 저장된 데이터를 문자 한개씩 출력
  System.out.print(str01.charAt(0)+" ");
  System.out.print(str01.charAt(1)+" ");
  System.out.print(str01.charAt(2)+" ");
  System.out.print(str01.charAt(3)+"\n");
  // 문자열 중에서 문자 한개를 검색
  System.out.println(str04.indexOf('a'));
  System.out.println(str04.lastIndexOf('a'));
  String str05="    pinksung    "; // 사용자가 입력한 아이디
  String str06="pinksung"; // 디비에 저장된 아이디
  System.out.println(str05.equals(str06));
  str05=str05.trim(); // 앞뒤에 입력된 공백문자 제거
  System.out.println(str05.equals(str06));
 }
}
===================================================================================
package training;
public class Ex05 {
 public static void main(String[] args) {
  StringBuffer sb01=new StringBuffer("Java");
  System.out.println("문자열의 길이 : " +sb01.length());
  System.out.println("실제 할당된 메모리 크기 : " +sb01.capacity());
  System.out.println(sb01);
  // 실제 데이터를 저장할 기억공간보다 더 여유롭게 메모리 할당
  sb01.append("Programming");
  System.out.println(sb01);
  String str01="Java";
  str01.replace('a','e'); // String은 불변객체로 메소드 호출후에도 초기값이 유지된다.
  System.out.println(str01);
  System.out.println(sb01);
  sb01.replace(0,4,"MFC"); // StringBuffer는 자신의 값이 변경된다.
  System.out.println(sb01);
  sb01.delete(0,3);
  System.out.println(sb01);
  sb01.deleteCharAt(3);
  System.out.println(sb01);
 }
}
===================================================================================
2008. 8. 19. 16:21

Part 5. 자바에서 자주 사용되는 클래스 II - Wrapper 클래스

기본 데이터형(int, boolean, double 등)의 본질은 그대로 두고 인터페이스만 제공받을 수 있도록 하는 것이 Wrapper 클래스이다.

===================================================================================
package training;
public class Ex01 {
 public static void main(String[] args) {
  int a=10; // 기본데이터형
  // 레퍼 클래스로 변환한 후에는 다양한 메소드를 사용할 수 있다.
  Integer wrapA=new Integer(a);
  Integer wrapB=new Integer("20");
  // wrapA wrapB
  int c;
  // 언박싱 : 레퍼클래스는 힙영역에 데이터를 저장하고 있는데
  // 스택 영역으로 가지고 나오는 것을 intValue() 메소드로
  int n=wrapA.intValue();
  int m=wrapB.intValue();
  c=n+m;
  System.out.println(c);
  // 박싱 : 기본데이터형은 스택영역에 데이터를 저장하고 있는데
  // 힙 영역으로 가지고 들어가는 것을 valueOf() 메소드로
  wrapA=Integer.valueOf(n);
  wrapB=Integer.valueOf(m);
 }
}
===================================================================================