-
CollectionJava 2021. 11. 25. 15:47
객체를 하나로 묶을 수 있는 클래스
클래스들을 하나로묶은게 컬렉션
컬렉션은 여러 변수 타입도 한번에 저장 가능
공간을 얼마나 확보할 지 사전에 지정하지 않아도 ok -> 알아서 한칸씩 밀려나서 자리를 확보함
public class MemberVO { // 멤버영역에 변수 선언 - private캡슐화 되어있으므로 외부클래스에서 호출불가 private int num; private String userName; private String tel; // 외부에서 private 변수도 접근,수정하게 하는 메소드 // setter public void setNum(int num) { this.num = num; } // getter public int getNum() { return num; } public void setUserName(String userName) { this.userName = userName; } public String getUserName() { return userName; } public void setTel(String tel) { this.tel = tel; } public String getTel() { return tel; } }
public class AAA { public AAA() {} public MemberVO memberList() { // 데이터가 발생한 곳 int num = 250; String name = "양지현"; String tel = "010-6675-1374"; // 컬렉션에 담기 MemberVO vo = new MemberVO(); vo.setNum(num); vo.setUserName(name); vo.setTel(tel); return vo; } }
public class BBB { public BBB() { AAA aaa = new AAA(); MemberVO vo = aaa.memberList(); System.out.println("번호=" + vo.getNum()); System.out.println("이름=" + vo.getUserName()); System.out.println("연락처=" + vo.getTel()); } public static void main(String[] args) { new BBB(); } }
< List >
1. Vector 활용하기
public class MemberVO { // 멤버영역에 변수 선언 - private캡슐화 되어있으므로 외부클래스에서 호출불가 private int num; private String userName; private String tel; // 매개변수 있는 생성자, 없는 생성자 public MemberVO() {} public MemberVO(int num, String userName, String tel) { this.num = num; this.userName = userName; this.tel = tel; } // 외부에서 private 변수도 접근,수정하게 하는 메소드 // setter public void setNum(int num) { this.num = num; } // getter public int getNum() { return num; } public void setUserName(String userName) { this.userName = userName; } public String getUserName() { return userName; } public void setTel(String tel) { this.tel = tel; } public String getTel() { return tel; } // 회원정보를 문자열로 만들어 리턴하는 메소드 생성 // 하위클래스에서 오버라이딩 public String toString() { String result = num+"\t"+userName+"\t"+tel; return result; } }
import java.util.Calendar; import java.util.Random; import java.util.Vector; public class VectorTest { public Vector getData() { // 별도의 setter를 사용하지않아도 알아서 데이터가 생성됨 MemberVO vo = new MemberVO(200, "양지현", "010-6675-1374"); Random ran = new Random(); Calendar date = Calendar.getInstance(); date.set(2020, 10, 30); String str = "세종대왕"; Integer intData = 1234; // 데이터가 5개이므로 하나의 변수로 return 못함 --> vector에 담아서 return Vector v = new Vector(); System.out.println("capacity->" + v.capacity()); // vector에 객체 추가하기 v.add(vo); v.addElement(ran); v.add(date); v.add(1, str); // 1번째 인덱스에 str을 추가 -> 기존에 저장된 데이터는 한칸씩 밀려남 v.addElement(intData); return v; } public Vector<MemberVO> getMember() { MemberVO vo = new MemberVO(10, "박효신", "010-1234-5678"); MemberVO vo1 = new MemberVO(10, "김수현", "010-4567-5678"); MemberVO vo2 = new MemberVO(10, "폴킴", "010-1358-5453"); MemberVO vo3 = new MemberVO(10, "이석훈", "010-7578-7753"); // 벡터에 담기 Vector<MemberVO> v = new Vector<MemberVO>(); v.add(vo); v.add(vo1); v.add(vo2); v.add(vo3); // v.add(new Random()); return v; } }
- 메인메소드
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Random; import java.util.Vector; public class VectorMain { public VectorMain() { } public void start() { // index가 있다 // 객체를 가지고 나와도 객체가 지워지지않는다 VectorTest vt = new VectorTest(); Vector v = vt.getData(); System.out.println("객체수->"+v.size()); MemberVO vo = (MemberVO)v.get(0); System.out.println(vo.getNum()+", "+vo.getUserName()); String txt = (String)v.get(1); System.out.println("txt->"+txt); Random r = (Random)v.get(2); System.out.println("random->"+r.nextInt(100)); Calendar d = (Calendar)v.get(3); SimpleDateFormat fmt = new SimpleDateFormat(); System.out.println(fmt.format(d.getTime())); int intData = (Integer)v.get(4); System.out.println("intData->"+intData); // 제너릭을 이용한 컬렉션 사용하기 Vector<MemberVO> list = vt.getMember(); for(int i=0; i<list.size(); i++) { MemberVO vecVO = list.get(i); // System.out.println(vecVO.getNum()+", "+vecVO.getUserName()+", " // + vecVO.getTel()); System.out.println(vecVO.toString()); } } public static void main(String[] args) { VectorMain vm = new VectorMain(); vm.start(); } }
<출력형식 변환하는 클래스>
import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; public class FormatTest { public static void main(String[] args) { // 출력형식을 이용하여 정보 변환 // 날짜 Calendar now = Calendar.getInstance(); // 2021-11-26(금) 형식으로 출력 SimpleDateFormat frm = new SimpleDateFormat("yyyy-MM-dd(E)"); String dateFrm = frm.format(now.getTime()); System.out.println(dateFrm); // 숫자형식의 포멧 // 2354862 -> 2,354,862원 int data = 2354862; // DecimalFormat fmt2 = new DecimalFormat("#,###,###원"); DecimalFormat fmt2 = new DecimalFormat("#,###원"); String deciData = fmt2.format(data); System.out.println(deciData); // 패턴화된 데이터를 원래정수로 변환 // 예외처리 try { NumberFormat nf = NumberFormat.getInstance(); Number n = nf.parse(deciData); int won = n.intValue(); // 원래데이터형태로 변환 System.out.println("won->" + won); }catch(ParseException pe){ System.out.println("숫자로 변환 못함..ㅜㅜ" + pe.getMessage()); } } }
2. ArrayList 활용
import java.util.ArrayList; import java.util.List; public class Data { public List<MemberVO> getMember() { // ArrayList 상위에 List가 있으므로 클래스명은 ArrayList로 MemberVO vo = new MemberVO(10, "박효신", "010-1234-5678"); MemberVO vo1 = new MemberVO(10, "김수현", "010-4567-5678"); MemberVO vo2 = new MemberVO(10, "폴킴", "010-1358-5453"); MemberVO vo3 = new MemberVO(10, "이석훈", "010-7578-7753"); // ArrayList에 담기 List<MemberVO> lst = new ArrayList<MemberVO>(); lst.add(vo); lst.add(vo1); lst.add(vo2); lst.add(vo3); // v.add(new Random()); return lst; } }
import java.util.List; public class ArrayListTest { ArrayListTest(){} public void start() { Data data = new Data(); List<MemberVO> lst = data.getMember(); for(MemberVO vo:lst) { System.out.println(vo.toString()); } } public static void main(String[] args) { ArrayListTest at = new ArrayListTest(); at.start(); } // stack, que,deque는 객체 정보를 output하면 정보 사라짐 // list, arraylist는 output해도 그대로 있음 }
3. LinkedList 활용
import java.util.LinkedList; public class LinkedListTest { LinkedListTest(){} public void start() { LinkedList<String> ll = new LinkedList<String>(); // 객체추가 // 추신수 - 손흥민 - 김연아 - 박지성 ll.offer("김연아"); ll.offer("손흥민"); ll.addFirst("박지성"); ll.addLast("추신수"); // 제일 앞에 있는 객체를 얻는다 String txt = ll.pop(); // 박지성이 pop되면서 삭제됨 (사이즈 감소) System.out.println("txt->" + txt); System.out.println("size->"+ ll.size()); txt = ll.get(1); System.out.println("txt->" + txt); // get(index)를 통해 데이터를 추출하면 객체는 그대로 System.out.println("size->"+ ll.size()); // is.Empty(): 객체가 비어있는지 확인해주는 메소드 while(!ll.isEmpty()) { // 객체가 비어있지 않을때만 작업 System.out.println(ll.pop()); } System.out.println("size->"+ ll.size()); // 0: 비워짐 } public static void main(String[] args) { LinkedListTest llt = new LinkedListTest(); llt.start(); } }
< Set >
1. HashSet
import java.util.HashSet; import java.util.Iterator; public class HashSetTest { public HashSetTest(){ } public void start() { // 중복데이터를 알아서 제거 // 입력순서를 유지하지 않는다 (정렬도 안되있음) HashSet<String> hs = new HashSet<String>(); HashSet<Integer> hs2 = new HashSet<Integer>(); String name[] = {"김연아","박태환","박지성","손흥민","박태환"}; int[] num = {100, 400, 500, 400, 400}; // 값을 추가 for(int i=0; i<name.length; i++) { hs.add(name[i]); hs2.add(num[i]); } ////////////// System.out.println("hs->size->"+hs.size()); System.out.println("hs2->size->"+hs2.size()); // HashSet의 객체를 얻기 위해서는 다른 인터페이스(Iterator객체)에 의존해야함 Iterator<String> ii = hs.iterator(); Iterator<Integer> iii = hs2.iterator(); while(ii.hasNext()) { // 객체가 있으면 true, 없으면 false String data = ii.next(); System.out.println(data); // 순서는 자기 맘대로 나옴 } while(iii.hasNext()) { int data = iii.next(); System.out.println(data); } } public static void main(String[] args) { HashSetTest ht = new HashSetTest(); ht.start(); } }
2. TreeSet
- 크기순대로 정렬해주는 기능을 갖고있음
import java.util.Iterator; import java.util.TreeSet; public class TreeSetTest { String names[] = {"red","yellow","green","black","white","red","blue","red"}; int num[] = {25,9,36,95,45,853,36,25,68,25,26,25,36,85}; public TreeSetTest() { } public void start() { // 중복 허용하지 않음 // 입력순서 유지하지 않음 // 객체는 정렬된다 TreeSet<String> color = new TreeSet<String>(); TreeSet<Integer> numset = new TreeSet<Integer>(); // 데이터 입력 for(String c:names) { color.add(c); } for(int n:num) { numset.add(n); } System.out.println("color->"+color.size()); System.out.println("num->"+numset.size()); // 데이터를 가지고 나오기 // 오름차순으로 정렬됨 Iterator<String> getStrData = color.iterator(); while(getStrData.hasNext()) { System.out.print(getStrData.next()+"\t"); } System.out.println(); Iterator<Integer> getIntData = numset.iterator(); while(getIntData.hasNext()) { System.out.print(getIntData.next()+"\t"); } System.out.println(); // 내림차순으로 얻어오기 Iterator<Integer> descNum = numset.descendingIterator(); while(descNum.hasNext()) { System.out.print(descNum.next()+"\t"); } System.out.println(); } public static void main(String[] args) { TreeSetTest tt = new TreeSetTest(); tt.start(); } }
예제) 앞서 만든 로또생성기를 TreeSet으로 풀기
import java.util.Iterator; import java.util.Random; import java.util.Scanner; import java.util.TreeSet; // 정답코드 public class Lotto_pr2 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); Random ran = new Random(); while(true) { System.out.print("게임수="); int gameCount = scan.nextInt(); // 게임수만큼 반복 for(int cnt=1; cnt<=gameCount; cnt++) { // 한게임당 treeset에 입력 TreeSet<Integer> numset = new TreeSet<Integer>(); // 마지막에 생성된 번호를 기억하기 위한 변수 =bonus번호 int lastNum=0; while(numset.size()<7) { lastNum = ran.nextInt(45)+1; numset.add(lastNum); } // 보너스번호와 일치하는 번호는 지우기 numset.remove(lastNum); // 출력 System.out.print(cnt+"게임=["); Iterator<Integer> lottoNum = numset.iterator(); for(int i=0; i<=numset.size()-1; i++) { if(i==numset.size()-1) { System.out.print(lottoNum.next()+"], bonus=" +lastNum); // }else { System.out.print(lottoNum.next()+", "); } } System.out.println(); } // 계속진행여부 System.out.print("계속하시겠습니까?(1:예, 2:아니오)"); int ans = scan.nextInt(); if(ans==1) continue; else break; } } }
< Map >
1. HashMap
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Set; public class HashMapTest { public HashMapTest() { // Map interface : HashMap, HashTable, TreeMap(key를 기준으로 정렬) // key, value를 가진 컬렉션 HashMap<String, MemberVO> hm = new HashMap<String, MemberVO>(); // MemberVO를 담을수 있는 컬렉션 생성 hm.put("홍길동", new MemberVO(100, "홍길동", "010-1234-5678")); hm.put("손흥민", new MemberVO(200, "손흥민", "010-2795-4367")); hm.put("김연아", new MemberVO(300, "김연아", "010-3296-4512")); hm.put("박태환", new MemberVO(400, "박태환", "010-2555-3155")); hm.put("추신수", new MemberVO(500, "추신수", "010-2234-5588")); // 키에 해당하는 객체 가져오기 MemberVO obj = hm.get("박태환"); // 가져오고자 하는 객체의 클래스로 객체 지정 System.out.println(obj.toString()+"\n============================="); // HashMap의 모든 키를 얻어오기 Set<String> keyList = hm.keySet(); // 키 목록을 다시 다른 컬렉션으로 바꿔줘야 출력 가능 Iterator<String> ii = keyList.iterator(); while(ii.hasNext()) { String key = ii.next(); // key MemberVO vo = hm.get(key); System.out.println(vo.toString()); } System.out.println(); System.out.println("HashMap에서 key없이 value객체만 얻어오기"); Collection<MemberVO> value = hm.values(); Iterator<MemberVO> iii = value.iterator(); while(iii.hasNext()) { MemberVO vo = iii.next(); System.out.println(vo.toString()); } // value전체를 구할때는 꼭 key값이 없어도 된다는 것을 보여줌 } public static void main(String[] args) { HashMapTest hmt = new HashMapTest(); } }
** 스택 (LIFO)
import java.util.Stack; public class StackTest { public static void main(String[] args) { Stack<String> st = new Stack<String>(); // 스택에 객체 추가 st.push("홍길동"); st.push("손흥민"); st.push("박태환"); System.out.println(st.pop()); // 제일 나중에 추가된 '박태환'이 출력됨 System.out.println(); st.push("김연아"); while(!st.empty()) { // 스택이 비어있으면 true, 비어있지않으면 false System.out.println(st.pop()); } } }
2. TreeMap
import java.util.Collection; import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TreeMapTest { public TreeMapTest() { // Map interface : HashMap, HashTable, TreeMap(key를 기준으로 정렬) // key, value를 가진 컬렉션 // TreeMap은 키를 이용해서 정렬이 수행됨 TreeMap<String, MemberVO> tm = new TreeMap<String, MemberVO>(); // MemberVO를 담을수 있는 컬렉션 생성 tm.put("홍길동", new MemberVO(100, "홍길동", "010-1234-5678")); tm.put("손흥민", new MemberVO(200, "손흥민", "010-2795-4367")); tm.put("김연아", new MemberVO(300, "김연아", "010-3296-4512")); tm.put("박태환", new MemberVO(400, "박태환", "010-2555-3155")); tm.put("추신수", new MemberVO(500, "추신수", "010-2234-5588")); // 키에 해당하는 객체 가져오기 MemberVO obj = tm.get("박태환"); // 가져오고자 하는 객체의 클래스로 객체 지정 System.out.println(obj.toString()+"\n============================="); // TreeMap의 모든 키를 얻어오기 Set<String> keyList = tm.keySet(); // 키 목록을 다시 다른 컬렉션으로 바꿔줘야 출력 가능 Iterator<String> ii = keyList.iterator(); while(ii.hasNext()) { String key = ii.next(); // key MemberVO vo = tm.get(key); System.out.println(vo.toString()); } System.out.println(); System.out.println("TreeMap에서 key없이 value객체만 얻어오기"); Collection<MemberVO> value = tm.values(); Iterator<MemberVO> iii = value.iterator(); while(iii.hasNext()) { MemberVO vo = iii.next(); System.out.println(vo.toString()); } // value전체를 구할때는 꼭 key값이 없어도 된다는 것을 보여줌 } public static void main(String[] args) { TreeMapTest tmt = new TreeMapTest(); } }