Vector
- Object 유형의 Collection으로서 어떤 유형의 객체도 저장할 수 있다.
- 벡터는 데이터가 가득 차면 자동으로 저장 영역을 확대한다.
- java.util.List 인터페이스를 구현하는 클래스로 순서대로 정렬되고, 중복도 허용하는 특징을 갖는다.
java.util.Vector 클래스
- java.util.List 인터페이스를 구현한 컬렉션
- 특징
순서를 기억한다.
데이터 중복저장을 허용한다.
- 유사 클래스
ArrayList
Enumeration
Enumeration<E> elements()
객체들을 집합체 형태로 관리하게 하는 인터페이스
이 인터페이스에는 각각의 객체들을 한 순간에 하나씩 처리할 수 있는 메소드를 제공한다
논리적 커서가 존재하여 커서를 이동하면서 데이터를 꺼내온다.
boolean hasMoreElements()
Iterator
Element와 똑같은 기능을 하는 Iterator가 있다
Iterater <Object> it = it.iterator();
it.hasNext(); 다음 원소가 있는지 없는지 확인하는 메소드
it.next(); 하나 다음으로 넘기는 함수이다.
package day21;
import java.util.*;
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name =name;
this.setAge(age);
}
//setter, getter
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class VectorTest2 {
public static void main(String[] args) {
Person p1 = new Person("홍길동",20);
Person p2 = new Person("김길동",22);
Person p3 = new Person("이길동",23);
Vector<Person> pp = new Vector<Person>();
pp.add(p1);
pp.add(p2);
pp.add(p3);
for(Person te : pp) {
System.out.println("이름: "+te.getName()+" 나이 :"+te.getAge());
}
//void copyInto(Object[] anArray)
//벡터에 저장된 객체를 배열 anArray로 카피하여 넣어준다.
//v에 저장된 Person객체들을 Person타입의 배열로 카피
Person te2[] = new Person[pp.size()];
pp.copyInto(te2);
for(Person te : te2) {
System.out.println(te.getName());
}
/*Enumeration<E> elements()
객체들을 집합체 형태로 관리하게 하는 인터페이스
이 인터페이스에는 각각의 객체들을 한 순간에 하나씩 처리할 수 있는 메소드를 제공한다
논리적 커서가 존재하여 커서를 이동하면서 데이터를 꺼내온다.
*/
//boolean hasMoreElements()
//현재 커서 이후에 요소들이 있는지 여부를 체크한다.
//요소가 있으면 true, 없으면 false를 반환함
//(맨처음에는 커서가 첫번쨰 요소 직전에 위치)
//E nextElement()
//커서를 다음 요소로 이동시키고, 가리키고 있는 요소 객체를 꺼내 반환한다.
Enumeration<Person> en =pp.elements();
while(en.hasMoreElements()) {
Person p = en.nextElement();
System.out.println(p.getName()+p.getAge());
}
//Element와 똑같은 기능을 하는 Iterator가 있다
//remove()메소드도 가지고 있음
Iterator<Person> en2 =pp.iterator();
while(en2.hasNext()) {
Person p = en2.next();
System.out.println(p.getName());
}
}
}
Vector와 ArrayList 차이
vector에는 동기화가 구현되어 있기 때문에 시간이 조금 더 오래 걸린다.
순서가 상관 없는 경우에는 동기화가 없는 ArrayList를 사용하는 것이 빠르다.
ArrayList
java.util.List인터페이스를 구현함
Vector와 기능이 동일함
단 차이점은
Vector는 동기화(Synchronized)가 구현된 반면
ArrayList는 동기화 되어 있지 않음
package day21;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest2 {
public static void main(String[] args) {
List<String> arrList= new ArrayList<String>();
arrList.add("Apple");
arrList.add("Melon");
arrList.add("Kiwi");
arrList.add("Grape");
String str = arrList.get(0);
System.out.println(str.toLowerCase());
Iterator<String> it = arrList.iterator();
for(int i=1;it.hasNext();i++) {
String t = it.next();
System.out.println(i+"번째는 "+t);
}
System.out.println();
String arr[] = new String[arrList.size()];
arrList.toArray(arr);
for(String s : arr) {
System.out.println(s);
}
}
}
Swing -> JFC(java foundation class) = UI Delegation - 모델
MVC패턴
Model
- 데이터를 갖는 클래스(객체)
View
- 화면을 구성하는 클래스
Controller
- Model과 View를 제어하는 클래스
JList, JComboBox, JTable 컴포넌트
JList의 경우
1) Model : DefaultListModel <= 데이터(자료구조)를 갖는다.
2) View : JList ( visual component )
3) Controller : ListCellRenderer... XXXRenderer, XXXEditor
package day21;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class JListDemo extends JFrame {
JPanel p = new JPanel();
JList<String> lst1, lst2; // View를 담당
Vector <String> osV;//==> Model이 갖는다.
String [] langs= {"Python","C","Java","JavaScript","jQuery"};
JComboBox<String> combo1, combo2;
DefaultComboBoxModel<String> cmodel;
//combo2는 cmodel에 데이터를 담아 연결해서 p에 붙여보자
DefaultListModel<String> model;//(데이터나 자료구조를 갖는 부분)
public JListDemo() {
super("::JListDemo::");
Container cp = getContentPane();
cp.add(p, "Center");
p.setBackground(Color.white);
osV = new Vector<String>(); //==>모델이 가져야 함
osV.add("Windows");
osV.add("Linux");
osV.add("Android");
lst1 = new JList(osV);
//내부적으로 데이터(Vector)를 DefaultListModel객체로 넘기고
//View와 Model을 연결해주고 있음
p.add(lst1);
model = new DefaultListModel<String>(); //model
for(String s : langs) {
model.addElement(s);
}
lst2= new JList();//view
//view와 model을 연결
lst2.setModel(model);
p.add(new JScrollPane(lst2));
combo1 = new JComboBox<String>(osV);
p.add(new JScrollPane(combo1));
osV.add("ios");
cmodel = new DefaultComboBoxModel<String>(langs);//Model
combo2 = new JComboBox<String>();//View
combo2.setModel(cmodel);
p.add(combo2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
JListDemo ae = new JListDemo();
ae.setSize(500, 500);
ae.setVisible(true);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
SQL 기타 함수
DECODE( 컬럼, 저간1, 결과1, 조건2, 결과2, ........) : 칼럼이 조건1에 부합하면 결과 1을 반환 ...
--사원 정보를 출력하되 사번, 사원이름, 업무, 부서명을 함께 출력하세요
select empno, ename, job,
decode(deptno, 10,'ACCOUNTING',20 ,'RESEARCH',30,'SALES','OPERATION')
from emp;
--emp에서 사원정보를 출력하되 MGR 사원정보를 출력하되 관리자가 있는 사원은 '일반직원',
--관리자가 없는 사원은 '최고관리자'로 출력하세요
select ename, decode(mgr,null,'최고관리자','일반직원')
from emp
order by mgr desc;
RANK() OVER(분석절) 함수 ==> 분석함수
--급여가 가장 높은 순으로 랭킹을 매겨보세요
select ename, sal from emp
order by SAL desc;
--급여가 가장 높은 TOP 5인 사원을 뽑아 정보를 출력하세요
RNK는 지역변수와 같이 작용하기 때문에 서브쿼리를 이용해서 뽑아낼 수 있다.
select * from (
select rank() over(order by sal desc) as RNK, emp.* from emp
)
where RNK between 1 and 5;
ROW_NUMBER ( ) OVER ( 분석절 ) ==> 게시판 페이징 처리시 많이 사용한다.
분석절에 의해 가져온 레코드에 행번호를 붙인다.
select * from(
select ROW_NUMBER() OVER(ORDER BY SAL DESC) RN, EMP.* from emp
)
where rn >0 and rn<10;
TABLE JOIN
- 두 개 이상의 테이블이나 데이터 베이스를 서로 연결하여
데이터를 검색할 때 사용하는 방법
서로 연관있는 테이블을 이용하여 두 개의 테이블이 마치
하나의 테이블인 것처럼 보여주는 것.
- 일반적으로 PRIMARY KEY(PK)와 FOREIGN KEY (FK)를 사용하여 JOIN
하는 경우가 대부분이지만 논리적인 값들의 연관으로 JOIN하는 경우도 있다.
Cross Join, Cartesian produce - 4 * 16개의 값이 나온다.
select d.*, e.*
from dept d, emp e;
따라서 조인 조건이 필요하다.
select d.*, e.*
from dept d, emp e
where d.deptno = e.deptno
order by 1;
1. 구문
SELECT table1.colum1[, table2.column2 ...]
FROM table1, table2
WHERE table1.colum1=table2.column2;
또는 join절을 이용한 명시적 조인
SELECT table1.colum1[,table2.colum2...]
FROM table1 JOIN table2
ON table1.column1 = talbe2.column2;
**참고: 정규화를 통해 나누어진 여러 테이블을 join을 통해 질의해야
원하는 결과를 얻어올 수 있다.
cf> 정규화란?-Normalization. 정규화를 통해 하나의 테이블에 중복된
데이터가 없어야 한다는 원칙에 따라 반복적인
데이터를 분리하고, 각 데이터가 종속된 테이블에
적절히 배치되도록 작업을 수행하는 일.
-추후 데이터베이스 모델링에서 다룸
2. guideline
1) 똑같은 컬럼명이 존재하는 테이블이 있을 경우는 반드시 컬럼명
앞에 테이블명을 붙인다.
select d.deptno, dname, ename, job
from dept d join emp e
on d.deptno = e.deptno
order by deptno asc;
2) n개의 테이블을 조인하려면 최소한 n-1번의 조인 조건문이 필요하다.
3. JOIN의 종류
--------------------------------------------------------------------
1) EQUI JOIN : 조인조건이 정확히 일치하는 경우에 사용(pk와 fk를 사용하여)
2) NON-EQUI JOIN : 조인 조건이 정확히 일치하지 않는 경우에 사용(등급,학점)
3) OUTER JOIN : 조인 조건이 정확히 일치하지 않는 경우에도 모든 행들을 출력
4) SELF JOIN : 하나의 테이블에서 행들을 조인하고자 할 때 사용.
그외
5) Cartesian Product : 모든 가능한 행들의 조인
6) Set Operator : 여러 개의 select문장을 연결하여 작성한다.
--------------------------------------------------------------------
EQUI JOIN
[문제]
카테고리 테이블과 상품 테이블을 JOIN하여 카테고리 코드, 카테고리명, 상품이름, 판매가를 함께 출력하세요
--요즘 스타일
select category_code, category_name, output_price
from category c join products p
on c.category_code = p.category_fk;
--옛날 스타일
select category_code, category_name, output_price
from category c, products p
where c.category_code = p.category_fk;
**테이블에서 ALIAS사용****************************
- 테이블 별칭을 사용하여 긴 테이블명을 간단하게 사용한다.
- 테이블 별칭은 30자까지 사용가능하나 짧을 수록 좋다.
- FROM 절에서 별칭이 사용되면 SELECT문 전체에서 사용 가능하다.
- 테이블의 별칭은 현재 SELECT문에서만 유용하다.
[문제]
JOB이 MANAGER인 사원의 사번, 이름, 급여, 부서명, 근무지역을 출력하세요
select e.empno, ename, sal, job, loc
from emp e join dept d
on e.deptno = d.deptno
where job='MANAGER';
2)
select e.empno, ename, sal, job, loc
from emp e join dept d
on e.deptno = d.deptno and job='MANAGER';
[문제2]
상품별로 상품의 카테고리명,, 상품명, 판매가를 출력하되, 카테고리명이 TV인 것은 제외시키세요
판매가는 가격 표시 포맷으로 출력하세요 또한 가격은 저렴한 순으로 정렬하여 보여주세요
select category_name,products_name, to_char(output_price,'L999,999,999') as 가격
from category c join products p
on c.category_code=p.category_fk
where category_name<>'TV'
order by output_price asc;
2) NON-EQUIJOIN
- WHERE절 뒤의 조건절에서 두 개 이상의 테이블을 연결할 때
조건이 EQUAL(=) 이 아닌 다른 연산 기호로 만들어지는 경우에 사용.
- EMP와 SALGRADE 테이블 사이 관련성을 살펴보면, EMP테이블의
어떠한 컬럼도 직접적으로 SALGRADE테이블의 한 컬럼에 상응하지
않는다.
따라서 두 테이블의 관련성은 EMP테이블의 SAL컬럼이
SALGRADE의 LOSAL과 HISAL컬럼 사이에 있다.
이 경우 NON-EQUIJOIN이다.
조인 조건은 = 연산자 이외의 BETWEEN~AND 연산자를 이용한다.
SELECT EMPNO,ENAME,SAL FROM EMP;
SELECT GRADE,LOSAL,HISAL FROM SALGRADE;
위 두 테이블 정보를 NON-EQUIJOIN하면
SELECT EMPNO,ENAME,SAL,GRADE,LOSAL,HISAL FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
select empno,ename,sal,grade,losal,hisal from emp e,salgrade s
where e.sal between s.losal and s.hisal and e.deptno=10;
위 질의가 실행가능한 이유는
- salgrade테이블에서 중복되는 등급을 포함하는 행이 없다.
- emp테이블에 있는 sal의 값은 salgrade테이블에서 제공하는 값
범위에 있다.
- between외에도 >=, <= 등의 연산자 사용이 가능하다.
emp 에서 사원정보를 출력하되 , 사원명 , 급여 , 급여 등급을 함께 출력하세요
select ename, sal, grade
from emp e join salgrade s
on e.sal between s.losal and s.hisal;
[문제]
EMP에서 DALLAS에 근무하는 사원의 이름, 업무, 급여, 부서명을 출력하세요
select ename, job, sal, d.DNAME
from emp e join dept d
on d.deptno = e.deptno and d.loc = 'DALLAS';
[문제2]
EMP에서 보너스를 받는 사원의 이름, 급여, 보너스, 부서명, 근무지를 출력하세요
select ename, sal, comm, loc
from emp e join dept d
on e.deptno = d.deptno and comm is not null;
[문제3]
상품 테이블에서 상품명과 해당 상품의 공급가, 공급업체명을 함께 출력하세요
select products_name, input_price, ep_code ,ep_name
from supply_comp s join products p
on s.ep_code = p.ep_code_fk;
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
이름 추가하기 과제, JTable과제
package day21;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import day16.MyJPanel;
public class ChatUserList extends JFrame{
JPanel p = new MyJPanel();
JList<String> lst1;
Vector<String> userV;
JButton btEnter;
ChartUserDialog cd;
public ChatUserList() {
super("::ChatUserList::");
Container cp = getContentPane();
cp.add(p, "Center");
p.setBackground(Color.white);
p.setLayout(new GridLayout(1,2));
userV=new Vector<>();
userV.add("Happy");
userV.add("Bangry");
lst1 = new JList<>(userV);
p.add(lst1);
lst1.setBorder(new TitledBorder("::채팅참여자목록::"));
btEnter= new JButton(" 참여하기 ");
JPanel p2 = new MyJPanel(60,10,10,10);
p.add(p2);
p2.add(btEnter);
btEnter.setBorder(new LineBorder(Color.red,3));
btEnter.addActionListener((e)->{
String name = JOptionPane.showInputDialog("대화명을 입력");
if(name==null) return;
userV.add(name);
setTitle(""+userV.size());
//데이터는 변경 되었지만 아직 View에서 변경된 데이터가 적용되지 않을 경우
lst1.updateUI();
});
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
ChatUserList ae = new ChatUserList();
ae.setSize(500, 500);
ae.setVisible(true);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package day21;
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class test2 extends JFrame {
JPanel p = new JPanel();
String [][] data= {
{"1","Scott","Analyst","20"},
{"2","Smith","Clerk","10"},
{"3","King","Salesman","30"},
{"4","Ford","Analyst","40"},
};
String []colHeader= {"사번","사원명","업무","부서번호"};
JTable t;
DefaultTableModel s ;
public test2() {
super("::test2::");
Container cp = getContentPane();
cp.add(p, "Center");
p.setBackground(Color.white);
s= new DefaultTableModel(data,colHeader);
t= new JTable(s);
p.add(new JScrollPane(t));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
test2 ae = new test2();
ae.setSize(500, 500);
ae.setVisible(true);
}
}