Set계열
특징
- 순서를 기억하지 않음
- 데이터 중복을 허용하지 않음
구현 클래스
- HashSet은 객체를 저장하기 전에 객체의 hashCode()를 호출하여 해시코드를 얻어낸다.
그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다. 만약 동일한 해시코드가 있다면
다시 equals() 메소드로 두 객체를 비교해서 trus가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
package day23;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
//이중로그인 방지할때 사용할 수 있겠다
Set<String> set = new HashSet<String>();
set.add("Java");
set.add("JavaScript");
set.add("Vue.js");
set.add("Java");
System.out.println(set.size());
Iterator <String> it =set.iterator();
while(it.hasNext()) {
String str = it.next();
System.out.println(str);
}
}
}
domain 객체 (값을 담고 있는 객체) VO(Value Object)객체
DTO(Data Transfer Object)
Set에서 hashCode()와 equals()를 오버라이드하여 조건을 처리해줘야한다.
package day23;
import java.util.*;
class Member{
//domain 객체 (값을 담고 있는 객체) Vo(Value Object)객체
//DTO(Data Transfer Object
String name;
int age;
public Member() {
}
public Member(String name, int age) {
this.name= name;
this.age = age;
}
/*이름과 나이가 같으면 중복저장되지 못하도록 하기 위해
* hashCode()와 eqauls()메소드를 오버라이딩*/
@Override
public int hashCode() {
return name.hashCode()+age;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) {
Member user = (Member)obj;
boolean b = (user.name.equals(this.name))&&(user.age==this.age);
return b;
}else {
return false;
}
}
}
public class HashSetTest2 {
public static void main(String[] args) {
Member m1= new Member("홍길동",22);
Member m2= new Member("김길동",22);
Member m3= new Member("홍길동",32);
Member m4= new Member("김길동",32);
Member m6= new Member("김길동",32);
Member m5= m1;
Set<Member> set = new HashSet<Member>();
set.add(m1);
set.add(m2);
set.add(m3);
set.add(m4);
set.add(m6);
System.out.println("set.size = "+set.size());
Iterator<Member> it = set.iterator();
while(it.hasNext()) {
Member m = it.next();
System.out.println(m.name+" "+m.age);
}
}
}
Properties
: 맵계열. Hashtable의 자식 클래스
key === value 매핑하여 저장
XXXX.properties 파일을 읽어서 해당 파일에 저장된 내용을 사용하고자 할 때 이용한다.
package day23;
import java.util.Properties;
import java.io.*;
public class PropertiesTest {
public static void main(String[] args)
throws IOException, FileNotFoundException
{
Properties p = new Properties();
p.setProperty("OS", "Windows");
// key value
p.setProperty("Lang", "Java");
//데이터 꺼내기
String os = p.getProperty("OS");
String lang = p.getProperty("Lang");
//database.properties 파일에 저장된 내용을
//Properties 객체로 옮겨보자.
String loc = "src/day23/database.properties";
FileReader fr = new FileReader(loc);
p.load(fr);//파일 내용을 p로 옮긴다.
System.out.println(p.getProperty("DbType"));
System.out.println(p.getProperty("DbVersion"));
System.out.println(p.getProperty("DbUser"));
System.out.println(p.getProperty("DbPasswd"));
//spring에서 많이 쓰는 방법이다.
System.out.println(p.getProperty("msg","저장된 메시지가 없어요"));
}
}
CardLayout, MouseEvent
package day23;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
public class MouseTest extends JFrame {
JPanel p = new JPanel();
JPanel p1 = new JPanel();
JPanel p3 = new JPanel();
JTextField tfId;
JPasswordField tfPwd;
JButton btLogin;
CardLayout card = new CardLayout();
JPanel p2 = new ContentJPanel(this);
public MouseTest() {
super("::MouseTest::");
Container cp = getContentPane();
cp.add(p, "Center");
p.setBackground(Color.white);
p.setLayout(card);
tfId= new JTextField(20);
tfPwd = new JPasswordField(20);
btLogin = new JButton("Login");
p1.add(tfId);
p1.add(tfPwd);
p1.add(btLogin);
p1.setBackground(Color.darkGray);
p.add(p1,"Login");
tfId.setBorder(new TitledBorder("아이디"));
tfPwd.setBorder(new TitledBorder("비밀번호"));
p2.setBackground(Color.cyan);
p.add(p2,"Content1");
p3.setBackground(Color.red);
p.add(p3,"Content2");
btLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String uid = tfId.getText();
char[]ch = tfPwd.getPassword();
String pwd = new String(ch);
//유효성 체크 trim() 문자열 앞 뒤의 공백문자를 제거함
if(uid==null||pwd==null||uid.trim().equals("")||pwd.trim().isEmpty()) {
JOptionPane.showMessageDialog(p1,"아이디와 비밀번호를 입력하세요");
tfId.requestFocus();
return;
}
if(uid.contentEquals("Admin")&&pwd.equals("tiger")) {
card.show(p, "Content1");
}else {
JOptionPane.showMessageDialog(p1, "아이디와 비밀번호가 일치하지 않아요");
}
}
});
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
MouseTest ae = new MouseTest();
ae.setSize(500, 500);
ae.setVisible(true);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package day23;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
/*
* 이벤트 소스 : JLabel
* 이벤트 : MouseEvent
*
*
*
*
* */
public class ContentJPanel extends JPanel{
JPanel pNorth = new JPanel(new BorderLayout());
JLabel lbHome, lbNext,lb;
JTextArea ta;
JTabbedPane tab;
MouseTest s;
public ContentJPanel(MouseTest parent) {
s=parent;
setLayout(new BorderLayout());
add(pNorth,"North");
tab= new JTabbedPane();
lbHome=new JLabel(new ImageIcon("images/11.PNG"));
lbNext=new JLabel(new ImageIcon("images/22.PNG"));
pNorth.add(lbHome,"West");
pNorth.add(lbNext,"East");
ta= new JTextArea("::메모 내용을 입력하세요::");
lb= new JLabel(new ImageIcon("images/11.PNG"));
tab.add("메모 남기기",new JScrollPane(ta)); //index 0
tab.add("사진첩",new JScrollPane(lb)); //index 1
add(tab,"Center");
MyHandler my = new MyHandler();
lbHome.addMouseListener(my);
lbNext.addMouseListener(my);
tab.setSelectedIndex(1);
}
//class는 단일 상속이 가능해서 하나만 할 때 가능
class MyHandler extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Click");
Object o = e.getSource();
System.out.println(o);
if(o==lbHome) {
s.card.show(s.p ,"Login");
}else if(o==lbNext) {
s.card.show(s.p ,"Content2");
}
}
}
//implements는 다중 상속이 가능하기 때문에 여러 이벤트할 떄 유용
/*
class MyHandler implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Click");
}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
}
*/
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
서브쿼리2
#단일행 서브쿼리
사용 가능한 연산자 : > , >=, < ,<=, =, <>, !=
--단일행 서브쿼리
[문제1] 사원 테이블에서 평균 급여 보다 적게 받는 사원의 사번,이름, 급여
select empno, ename, sal
from emp
where sal< (select avg(sal) from emp)
order by sal;
#다중행 서브쿼리
사용 가능한 연산자 : IN, ANY, ALL, EXISTS 연산자
부서별로 최대급여를 받는 사원의 이름과, 급여, 부서번호를 출력하세요
select max(sal)
from emp
group by deptno;
--부서별로 최대급여를 받는 사원의 이름과, 급여, 부서번호를 출력하세요
select ename, deptno, sal
from emp
where (deptno,sal) in (select deptno, max(sal) from emp group by deptno);
1) ANY 연산자
- 서브쿼리 결과값 중 어느 하나의 값이라도 만족이 되면 결과값을 반환한다.
최소 값보다 크면 가져오는 것과 동일하다.
select ename, sal
from emp
where deptno !=20
and
sal > any(select sal from emp where job='SALESMAN');
2) ALL 연산자
- 서브쿼리 결과값 중 모든 결과 값이 만족되어야만 결과값을 반환한다
select ename, sal
from emp
where deptno !=20
and
sal > all(select sal from emp where job='SALESMAN');
3)EXISTS 연산자
- 서브쿼리의 데이터가 존재하는지 여부를 따져서 존재하는 값들만을 결과로 반환해준다.
- 서브쿼리가 적어도 1개의 행을 반환하면 논리식은 참이고 그렇지 않으면 거짓이다.
--문제 사원을 관리할 수 있는 사원의 정보를 보여주세요
select empno, ename, job
from emp e
where exists (select empno from emp where e.empno = mgr)
--self join으로 해결하기
select distinct(e2.empno), e2.ename, e2.job
from emp e1 join emp e2
on e1.mgr = e2.empno;
--문제 1 상품 테이블에서 상품의 판매가격이 평균 판매가보다 큰 상품의 목록을 보여주세요
--단, 평균을 구할 때와 결과를 보여줄 때 판매가격이 50원원이 넘어가는 것은 제외
select * from products;
select products_name
from products
where output_price>(select avg(output_price) from products where output_price<=500000) and output_price<=500000;
--문제2 카테고리 테이블에서 카테고리 이름에 '컴퓨터'라는 단어가 포함된
--카테고리에 속하는 상품 정보를 보여주세요
select *
from products
where category_fk in (select category_code from category where category_name like '%컴퓨터%');
--문제3 member테이블에서 작업별로 나이가 가장 많은 사람의 이름, 직업, 나이 , 마일리지 점수를 보여주세요
select name, job, age, mileage
from member
where (job,age) in (select job,max(age) from member group by job);