ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Collection
    Java 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();
    
    	}
    }

     

    ' collection 프레임워크 상속구조

     

     collection 인터페이스 특징

     

     

    < 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();
    	}
    
    }

    'Java' 카테고리의 다른 글

    입출력(I/O)  (0) 2021.11.29
    상속 과제물  (0) 2021.11.25
    예외처리  (0) 2021.11.25
    객체지향 퀴즈  (0) 2021.11.24
    객체지향프로그래밍 (자바의정석)  (0) 2021.11.22

    댓글

Designed by Tistory.