List collection
<예제1>
package com.step5;
import java.util.ArrayList;
public class List1 {
public static void main(String[] args) {
ArrayList fruits = new ArrayList();
fruits.add("🍓");
fruits.add(1,"🍉");
fruits.add(1,"🍎");
System.out.println(fruits.get(0));
for(int i=0;i<fruits.size();i++) {
System.out.println(fruits.get(i));//
}
}
}
치환 연습
<예제1-2>
package com.step5;
import java.util.ArrayList;
public class List1 {
public static void main(String[] args) {
String s1 = null;
String s2 = null;
String s3 = null;
ArrayList fruits = new ArrayList();
boolean isOk = fruits.add("🍍");
System.out.println(isOk);
fruits.add("🍓");
s1 = (String)fruits.get(0);
fruits.add(1,"🍉");
s2 = (String)fruits.get(1);
fruits.add(1,"🍎");
s3 = (String)fruits.get(2);
for(int i=0;i<fruits.size();i++) {
System.out.println(fruits.get(i));//
}
System.out.println(s1+","+s2+","+s3);
}
}
Remove
<예제1-3>
package com.step5;
import java.util.ArrayList;
public class List2 {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<String>(); // 제네릭 추가
fruits.add("🍉");
fruits.add(1,"🍎");
fruits.add(1,"🍓");
String r1=(String)fruits.remove(1);
System.out.println(fruits);
System.out.println(r1);
}
}
<예제2-1>
package com.step5;
import java.util.ArrayList;
public class List3 {
void getFruitList(ArrayList<String> fruits) {
for(int i=0;i<fruits.size();i++) {
System.out.println(fruits.get(i));
}
}
ArrayList<String> methodA(){
return null;
}
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<String>();
fruits.add("🍉");
fruits.add(1,"🍎");
fruits.add(1,"🍓");
List3 li=new List3();
li.getFruitList(fruits);// 참조에 의한 호출(call by reference)
}
}
<예제2-2>
package com.step5;
import java.util.ArrayList;
public class List3 {
void getFruitList(ArrayList<String> fruits) {
for(int i=0;i<fruits.size();i++) {
System.out.println(fruits.get(i));
}
}
ArrayList<String> methodA(){
ArrayList<String> fruits = new ArrayList<String>();
fruits.add("🍉");
fruits.add(1,"🍎");
fruits.add(1,"🍓");
return fruits;
}
public static void main(String[] args) {
List3 li=new List3();
ArrayList<String> fruits = li.methodA();
System.out.println(fruits);
}
}
<예제3>
package com.step5;
import java.util.ArrayList;
import java.util.List;
public class List4 {
List<DeptDTO> li = new ArrayList<>(); // 선언부와 생성부 이름 다른 다형성 내용(확장성, 유지보수 할 때 코드 수정 양을 줄여준다)
public static void main(String[] args) {
List4 l4=new List4();
DeptDTO dept = new DeptDTO();
dept.setDeptno(10);
dept.setDname("영업부");
dept.setLoc("부산");
l4.li.add(dept);
dept = new DeptDTO();
dept.setDeptno(10);
dept.setDname("개발부");
dept.setLoc("대전");
l4.li.add(dept);
System.out.println(l4.li);
DeptDTO rd = l4.li.get(0);
System.out.println(rd.getDeptno()+","+rd.getDname()+","+rd.getLoc());
rd = l4.li.get(1);
System.out.println(rd.getDeptno()+","+rd.getDname()+","+rd.getLoc());
}
}
<예제4-EmpDTO>
package com.step5;
public class EmpDTO {
private int empno =0;//
private String ename =null;//
private String job = null;//
private int mgr =0;//
private String hiredate = null;//
private int sal =0;//
private int comm =0;//
private int deptno =0;//
public EmpDTO() {}
public EmpDTO(int empno, String ename, String job, int mgr
, String hiredate, int sal, int comm, int deptno) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
this.sal = sal;
this.comm = comm;
this.deptno = deptno;
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
public int getSal() {
return sal;
}
public void setSal(int sal) {
this.sal = sal;
}
public int getComm() {
return comm;
}
public void setComm(int comm) {
this.comm = comm;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
}
<예제4-EmpManager>
package com.step5;
import java.util.ArrayList;
public class EmpManager {
ArrayList<EmpDTO> empList = new ArrayList<>(); // 아무것도 없다. size() = 0이다. 빈 방
// EmpDTO 가 비어있다. ArrayList 안에 EmpDTO를 추가해줘야 한다.
void getEmpList() {
System.out.println(empList.size()); // 0
// EmpDTO emp = new EmpDTO(); // 0이 5개, null이 3개 들어가 있음. (EmpDTO클래스에서 확인)
EmpDTO emp = new EmpDTO(7566, "나신입", "영업", 7500, "2000-10-20", 3000, 500, 10);
empList.add(0,emp); // 0번째에 들어감.
emp = new EmpDTO();
empList.add(1,emp); // 1번째에 들어감.
System.out.println(empList.size());
for(int i=0; i<empList.size(); i++) {
EmpDTO remp = empList.get(i);
System.out.println(remp.getEmpno()+", "+remp.getEname()+", "+remp.getHiredate());
}
}
public static void main(String[] args) {
// 자기 신을 인스턴스화 해야만 전역변수가 인식된다.
EmpManager em = new EmpManager();
em.getEmpList();
}
}
<예제4-DeptDTO>
package com.step5;
public class DeptDTO {
private int deptno;
private String dname;
private String loc;
public DeptDTO() {}
// 생성자의 파라미터 자리를 통해서 전역변수의 초기화(재정의) 한다.
public DeptDTO(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
private EmpDTO empDto;
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
public EmpDTO getEmpDto() {
return empDto;
}
public void setEmpDto(EmpDTO empDto) {
this.empDto = empDto;
}
public static void main(String[] args) {
}
}
<예제4-DeptManager>
package com.step5;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
// ActionListener al = new DeptManager();
// 자바는 단일 상속만 가능하다. - 다중상속은 발가함 - 다중상속의 단점을 보완하기 위해 인터페이스가 제공된다.
// 단 인터페이스는 여러개를 implements할 수 있다. (추상클래스, 인터페이스는 설계관점에서 중요하다.)
public class DeptManager extends JFrame implements ActionListener{
// 선언부
List<DeptDTO> deptList = new ArrayList<>(); // 왜 전역변수로 하는가? 입력|수정|삭제|조회 유지되어야 하기 때문에
String header[] = {"부서번호", "부서명", "지역"};
String datas[][] = new String[3][3]; // 2차배열 - 대괄호가 2쌍이 필요하다.
// 생성자의 파라미터를 통해서 서로 다른 클래스가 의존관계를 맺고 하나의 기능을 서비스 할 수 있다.
// 생성자도 파라미터를 여러개 가질 수 있다. - 메소드오버로딩
DefaultTableModel dtm_dept = new DefaultTableModel(datas, header); // <table> - 양식 > 자바가 있어야 DataSet 구성함
JTable jt_dept = new JTable(dtm_dept);
JScrollPane jsp_dept = new JScrollPane(jt_dept); // JScrollPane 위에 JTable위에 DefaultTableModel 넣음
JPanel jp_north = new JPanel();
JButton jbtnSelect = new JButton("조회");
JButton jbtnDelete = new JButton("삭제");
JButton jbtnAdd = new JButton("행 추가");
JButton jbtnDel = new JButton("행 삭제");
JButton jbtnExit = new JButton("종료");
// 생성자
DeptManager(){
getDeptList();
initDisplay();
} //////////// end of DeptManager /////////////
public List<DeptDTO> getDeptList(){
DeptDTO dept = new DeptDTO(10, "영업부", "부산");
deptList.add(dept);
dept = new DeptDTO(20,"개발부","대전");
deptList.add(dept);
dept = new DeptDTO(30,"운영부","인천");
deptList.add(dept);
return deptList;
}
// 화면 처리부
public void initDisplay() {
jbtnSelect.addActionListener(this);
jbtnDelete.addActionListener(this);
jbtnAdd.addActionListener(this); // 행추가
jbtnDel.addActionListener(this); // 행삭제
jp_north.setLayout(new FlowLayout(FlowLayout.LEFT));
jp_north.add(jbtnSelect);
jp_north.add(jbtnDelete);
jp_north.add(jbtnAdd); // 행추가 JPanel 붙이기
jp_north.add(jbtnDel);
jp_north.add(jbtnExit);
this.add("North", jp_north);
this.add("Center", jsp_dept);
this.setSize(500,400); // this -> 나 자신 -> DeptManager
this.setVisible(true);
} /////////////// end of intiDisplay ////////////////
//메인 메소드
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
DeptManager dm = new DeptManager(); // 상속받고있는 부모클래스 new JFrame()도 같이 호출되는 것이다.
} /////////////// end of main /////////////////
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("actionPerformed 호출은 반드시 addActionListener가 있어야 한다.");
Object obj = e.getSource(); // 버튼을 눌렀을 때 감지
// 행 삭제 해보기
if(obj == jbtnDel) { // 행 추가, 삭제는 데이터를 건드는 게 아니라 UI를 추가, 삭제하는 것
dtm_dept.removeRow(0);
}
// 행 추가 해보기
else if(obj == jbtnAdd) {
// Vector addRow = new Vector();
Object addRow2[] = new Object[3];
dtm_dept.addRow(addRow2);
}
// 너 삭제할거니?
else if(obj == jbtnDelete) {
int index = jt_dept.getSelectedRow(); // 사용자가 선택한 로우의 index값을 반환함
if(index<0) { // -1 반환(EOF)
JOptionPane.showMessageDialog(this,"삭제할 데이터를 선택하시오.","info",JOptionPane.INFORMATION_MESSAGE);
return; // 메소드 탈출
}
// 여기로 못오게 함
else {
System.out.println(index); // index 값을 add(int, E) 1 remove(1),
DeptDTO rdept=deptList.remove(index);
System.out.println(rdept+",rdept.getDeptno():"+rdept.getDeptno());
if(rdept != null) {
JOptionPane.showMessageDialog(this,"삭제 성공하였습니다.","info", JOptionPane.INFORMATION_MESSAGE);
refreshData();
} else {
JOptionPane.showMessageDialog(this,"삭제 실패하였습니다.","info", JOptionPane.ERROR_MESSAGE);
return;
}
}
}
// 너 조회버튼 누른거야?
else if(obj == jbtnSelect) {
// 웹 개발이더라도 html이 데이터를 쥘 수는 없다.
// html과 자바코드를 섞어쓰기가 가능한가?? - 불가능 -jsp공부 -> 자바자료구조를 JSON형식으로 넘기기
// dtm_dept는 실제 데이터를 포용함
// JTable은 클릭이벤트 같은 것은 가능함 - 실제 데이터를 쥐고있지는 못함.
// getRowCount는 실제 데이터의 로우 수를 반환 - 현재 3건
while(dtm_dept.getRowCount()>0) { // dtm은 데이터셋(자바측)받는 클래스에 ~~~~~~~~~~~
dtm_dept.removeRow(0); // 0번째 로우를 지우는 이유는 로우가 삭제될 때 마다 ~~~~~~~~~~~~
}
for(int i=0; i < deptList.size(); i++) {
DeptDTO rdept = deptList.get(i);
Vector<Object> v = new Vector<>();
v.add(0,rdept.getDeptno());
v.add(1,rdept.getDname());
v.add(2,rdept.getLoc());
dtm_dept.addRow(v); // 파라미터자리에 Vector를 사용해야하는 addRow를 불러왔기 때문에 인스턴스화 후 v 넣기.
}
}/////////// end of if /////////////
} ////////////////// end of actionPerformed ///////////////////
// 새로고침(f5) 구현하기
public void refreshData() {
while(dtm_dept.getRowCount()>0) { // dtm은 데이터셋(자바측)받는 클래스에 ~~~~~~~~~~~
dtm_dept.removeRow(0); // 0번째 로우를 지우는 이유는 로우가 삭제될 때 마다 ~~~~~~~~~~~~
}
for(int i=0; i < deptList.size(); i++) {
DeptDTO rdept = deptList.get(i);
Vector<Object> v = new Vector<>();
v.add(0,rdept.getDeptno());
v.add(1,rdept.getDname());
v.add(2,rdept.getLoc());
dtm_dept.addRow(v); // 파라미터자리에 Vector를 사용해야하는 addRow를 불러왔기 때문에 인스턴스화 후 v 넣기.
}
}
}
<예제5>
package com.step5;
public class Array3 {
public static void main(String[] args) {
int is[] = new int[3];
System.out.println(is[1]); //0
for(int i=0;i<is.length;i++) { // <= 가 아닌 <로 해줘야 한다
System.out.println(is[i]);
}
}
}
map
<예제1>
package com.step5;
import java.util.HashMap;
import java.util.Map;
public class MapTest1 {
public static void main(String[] args) {
// 선언부와 생성부의 타입을 다르게 인스턴스화 하기 - 다형성
// 선언부에 뭐가 올 수 있지? - 추상클래스 or 인터페이스 or 구현체 클래스
// Hashtable(멀티스레드 안전), HashMap(싱글안전)
// List보다 속도 빠름 - milisec - 순서가 없다. 2차 가공이 필요없다
Map<String, Object> map = new HashMap<>();
map.put("deptno", "10");
map.put("dname", "영업부");
map.put("loc", "부산");
System.out.println(map.get(10));
System.out.println(map.containsKey(10)); // false
System.out.println(map.containsKey("deptno")); // true
System.out.println(map.containsKey("Deptno")); // false - 대문자여서
System.out.println(map.containsKey("deptno1111")); // false - 숫자가 붙어서. 저런 키가 없어서
if(map.containsKey(10)) {
System.out.println("키가 있어요");
}
else {
System.out.println("키가 있어요");
}
}
}
<예제2>
package com.step5;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest2 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("deptno", "10");
map.put("dname", "영업부");
map.put("loc", "부산");
Set<String> set = map.keySet();
Object keys[] = set.toArray();
for(int i=0;i<keys.length;i++) {
System.out.println(keys[i]+"===>"+map.get(keys[i]));
}
}
}
<예제3>
package com.step5;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class MapTest3 {
public static void main(String[] args) {
List<Map<String, Object>> deptList = new ArrayList<>();
Map<String,Object> map = new HashMap<>();
map.put("DEPTNO", 10);
map.put("DNAME", "영업부");
map.put("LOC", "부산");
deptList.add(map);
Set<String> set = map.keySet();
Object keys[] = set.toArray();
for(int i=0;i<keys.length;i++) {
System.out.println(keys[i]+"===>"+map.get(keys[i]));
}
System.out.println(deptList.get(0).get("DEPTNO"));
System.out.println(deptList.get(0).get("dname")); // null - 소문자여서
System.out.println(deptList.get(0).get("LOC"));
}
}
<예제4>
package com.step5;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class MapTest4 {
public static void main(String[] args) {
List<Map<String, Object>> deptList = new ArrayList<>();
Map<String,Object> map = new HashMap<>();
map.put("DEPTNO", 10);
map.put("DNAME", "영업부");
deptList.add(map);
map = null; // 끊김
map = new HashMap<>(); // 이렇게 하면 다시 연결돼서 부산이 보일까? 아님. 복사본이기 때문
map.put("LOC", "부산");
// 부산도 담으려면 어떻게 해야할까?
deptList.add(map);
map = new HashMap<>();
map.put("DEPTNO", 20);
map.put("DNAME", "개발부");
map.put("LOC", "대구");
deptList.add(map);
System.out.println(deptList);
}
}
<예제5>
package com.step5;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class DeptManager2 extends JFrame implements ActionListener{
// 선언부
List<Map<String, Object>> deptList = new ArrayList<>();
String header[] = {"부서번호", "부서명", "지역"};
String datas[][] = new String[0][0];
DefaultTableModel dtm_dept = new DefaultTableModel(datas, header);
JTable jt_dept = new JTable(dtm_dept);
JScrollPane jsp_dept = new JScrollPane(jt_dept);
JPanel jp_north = new JPanel();
JButton jbtnSelect = new JButton("조회");
JButton jbtnDelete = new JButton("삭제");
JButton jbtnAdd = new JButton("행 추가");
JButton jbtnDel = new JButton("행 삭제");
JButton jbtnExit = new JButton("종료");
// 생성자
DeptManager2(){
getDeptList();
initDisplay();
} //////////// end of DeptManager /////////////
public List<Map<String,Object>> getDeptList(){
Map<String,Object> map = new HashMap<>();
map.put("DEPTNO", 10);
map.put("DNAME", "영업부");
map.put("LOC", "부산");
deptList.add(map);
map = new HashMap<>();
map.put("DEPTNO", 20);
map.put("DNAME", "개발부");
map.put("LOC", "대구");
deptList.add(map);
map = new HashMap<>();
map.put("DEPTNO", 30);
map.put("DNAME", "인사부");
map.put("LOC", "서울");
deptList.add(map);
return deptList;
}
// 화면 처리부
public void initDisplay() {
jbtnSelect.addActionListener(this);
jbtnDelete.addActionListener(this);
jbtnAdd.addActionListener(this); // 행추가
jbtnDel.addActionListener(this); // 행삭제
jp_north.setLayout(new FlowLayout(FlowLayout.LEFT));
jp_north.add(jbtnSelect);
jp_north.add(jbtnDelete);
jp_north.add(jbtnAdd);
jp_north.add(jbtnDel);
jp_north.add(jbtnExit);
this.add("North", jp_north);
this.add("Center", jsp_dept);
this.setSize(500,400);
this.setVisible(true);
} /////////////// end of intiDisplay ////////////////
//메인 메소드
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
DeptManager2 dm = new DeptManager2();
} /////////////// end of main /////////////////
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("actionPerformed 호출은 반드시 addActionListener가 있어야 한다.");
Object obj = e.getSource();
// 행 삭제 해보기
if(obj == jbtnDel) {
// dtm_dept.removeRow(0);
int index = jt_dept.getSelectedRow(); // 사용자가 선택한 로우의 index값을 반환함
if(index<0) { // -1 반환(EOF)
JOptionPane.showMessageDialog(this,"삭제할 행을 선택하시오.","info",JOptionPane.INFORMATION_MESSAGE);
return; // 메소드 탈출
}
else {
dtm_dept.removeRow(index);
}
}
// 행 추가 해보기
else if(obj == jbtnAdd) {
// Vector addRow = new Vector();
Object addRow2[] = new Object[3];
dtm_dept.addRow(addRow2);
}
// 너 삭제할거니?
else if(obj == jbtnDelete) {
int index = jt_dept.getSelectedRow(); // 사용자가 선택한 로우의 index값을 반환함
if(index<0) { // -1 반환(EOF)
JOptionPane.showMessageDialog(this,"삭제할 데이터를 선택하시오.","info",JOptionPane.INFORMATION_MESSAGE);
return; // 메소드 탈출
}
// 여기로 못오게 함
else {
System.out.println(index); // index 값을 add(int, E) 1 remove(1),
Map<String,Object> map =deptList.remove(index);
System.out.println(map+",rdept.get(DEPTNO):"+map.get("DEPTNO"));
if(map != null) {
JOptionPane.showMessageDialog(this,"삭제 성공하였습니다.","info", JOptionPane.INFORMATION_MESSAGE);
refreshData();
} else {
JOptionPane.showMessageDialog(this,"삭제 실패하였습니다.","info", JOptionPane.ERROR_MESSAGE);
return;
}
}
}
// 너 조회버튼 누른거야?
else if(obj == jbtnSelect) {
while(dtm_dept.getRowCount()>0) { // dtm은 데이터셋(자바측)받는 클래스에 ~~~~~~~~~~~
dtm_dept.removeRow(0); // 0번째 로우를 지우는 이유는 로우가 삭제될 때 마다 ~~~~~~~~~~~~
}
for(int i=0; i < deptList.size(); i++) {
Map<String,Object> map = deptList.get(i);
Vector<Object> v = new Vector<>();
v.add(0,map.get("DEPTNO"));
v.add(1,map.get("DNAME"));
v.add(2,map.get("LOC"));
dtm_dept.addRow(v); // 파라미터자리에 Vector를 사용해야하는 addRow를 불러왔기 때문에 인스턴스화 후 v 넣기.
}
}/////////// end of if /////////////
} ////////////////// end of actionPerformed ///////////////////
// 새로고침(f5) 구현하기
public void refreshData() {
while(dtm_dept.getRowCount()>0) { // dtm은 데이터셋(자바측)받는 클래스에 ~~~~~~~~~~~
dtm_dept.removeRow(0); // 0번째 로우를 지우는 이유는 로우가 삭제될 때 마다 ~~~~~~~~~~~~
}
for(int i=0; i < deptList.size(); i++) {
Map<String,Object> map = deptList.get(i);
Vector<Object> v = new Vector<>();
v.add(0,map.get("DEPTNO"));
v.add(1,map.get("DNAME"));
v.add(2,map.get("LOC"));
dtm_dept.addRow(v);
}
}
}