본문 바로가기

공부/자바 OOP

6월10일 - Java Collection Framework

교재

자제교재-chap 20~22

교학사 7장

 

자바의 기초 

- Java Collection Framework

- Thread

- IO입출력

---------------------------------

- Network

- JDBC ->데이터베이스가 좀 익숙해진다면, 

------------------------------

UI 화면구현 관련 클래스

- java.awt

- java.swing


Java Collection Framework

자료를 모아서 저장할 수 있는 클래스들

배열이랑 비슷한 개념

패턴의 특성 (Interface 개념으로 존재)

1) List  : 순서(Index)가 있다. 순서는 0부터(넣은 순서대로) 나온다. 

          Interface ex) - List, Vector, ArrayList, Collections

          class -> interface 다형성가능, 자식이 부모집에 들어갈 수 있다.

1. List 계열

※주의 : util패키지 안에 있는 List를 사용해야함

List list=new Vector();       //다형성
List item=new ArrayList(); //다형성
		
Vector vec=new Vector();
vec.add(new Object()); //매개변수명 ; object
vec.add(new Integer(3));
vec.add(new Double(1.2));
vec.add(new String("HAPPY"));
vec.add(5); // autobox ; 기본형 정수값을 적어도 자동으로 object를 받는다. 참조형을 시켜준담  
Integer a=5;
vec.add(6.7);
vec.add("APPLE");

2. 요소 분석하기

1. 요소의 갯수
System.out.println(vec.size()); //7
		
//3번째 요소 가져오기
Object obj=vec.get(3);
System.out.println(obj); //HAPPY
String str=(String) obj; //다형성 형변환해서 들어가기, 
System.out.println(str); //HAPPY
		
//5번째 요소 가져오기
Double doub=(Double) vec.get(5); //좀 지저분함 형변환으로 계속 적기엔, 
System.out.println(doub); //6.7

2. 전체 요소 접근
for(int idx=0; idx<vec.size(); idx++){
	System.out.println(vec.get(idx));
}//for end
System.out.println("--------------------------------"); //7
		
//0번째 요소 제거 
vec.remove(0);
for(int idx=0; idx<vec.size(); idx++){
	System.out.println(vec.get(idx));
}//for end
System.out.println("--------------------------------"); 
		
//모든 요소 전부 삭제
vec.removeAllElements();
System.out.println(vec.size());
		
if(vec.isEmpty()){
	System.out.println("요소없다");
}else{
	System.out.println("요소있다");
}//if end

3. 문제 : remove()를 이용해서 요소 전부 삭제

1. 내가 한 것
for(int idx=0; idx<vec.size(); idx++){
	vec.remove(idx);
	System.out.println(vec.get(idx));
}//for end
		
2. 선생님 답안		
for(int idx=vec.size()-1; idx>=0; idx--){
	vec.remove(idx);
}//for end
		
System.out.println(vec.size()); //0

해석 -

내가 한 방법의 for문을 보면, 0번째 인덱스를 지우면 1번째인덱스가 0번째가 된다. 마지막까지 다 지워도 0번째가 되기 때문에, 뒤에서부터 지워와야한다.

 

2) Set   : 순서가 없다. 입력한 순서대로 안나온다. 일관성이 없다. 

           Set, HashSet, Iterator

1. Set 계열

내가 가져오고 싶은 값을 커서(cursor)를 가리키는 방법으로 불러온다.

커서(cursor)가 가리키는 값(요소)이 없다면 false, 가리키는 값이 있다면 true.

next를 씀으로 그 다음것의 데이터를 불러올 수 있다. 만약  

previous(뒤로) next 반댓말

StringTokenizer와 비슷함. //oop0530 String . 0531 test02_참조

Set set=new HashSet(); //set에 메모리를 저장
set.add(3);
set.add(1.2);
set.add("HAPPY");
set.add(new Integer(5));
System.out.println(set.size()); //4

2. Interface Iterator

- cursor를 이용해서 요소를 접근하는 경우

- 리턴형 : iterator

- set과 같이 많이 쓴다. 

※주의 : util패키지 안에 있는 Iterator를 사용해야함

Iterator iter=set.iterator(); //커서를 만들어 iter에 넣은 것
while(iter.hasNext()){ //cursor가 존재하는지?
	//cursor가 가리키는 요소 가져오기
	Object obj=iter.next();
	System.out.println(obj);
}//while end

출력결과
1.2
3
HAPPY
5

해석 -> 순서가 뒤죽박죽으로 나왔다. 왜냐 Set은 순서가 없기때문에.

 

 

3) Map : 순서가 없다. 입력한 순서대로 안나온다. (JSP에서 많이 씀) 

           Map, HashMap, HashTable

1. Map 계열

- 제이슨문법

- key와 value로 구성되어있다.

- Key   : 이름 (중복허용 안됨)

- Value : 값   (중복허용 가능)

Map map=new HashMap();
map.put("one", "손흥민"); //element추가 함수 put
map.put("two", 3); 
map.put("three", new Double(5.6)); 
//key는 중복선언하지 않는다.
map.put("one", "박지성"); //one과 같은 이름으로 인식한다
map.put("four", "손흥민"); //one과의 value값 같을 수 있다.
		
System.out.println(map.size()); //4 one과 같은 이름으로 인식한다
System.out.println(map.get("one")); //손흥민
System.out.println(map.get("three")); //5.6

해석 ->

만약 key값이 중복되어 있다면 하나로 인식된다. 

 

2. 문제) key값으로 "rea.do" 호출하면 value값으로 "net.bbs.Read" 출력하시오

- '=' 문자를 기준으로 문자열을 분리해서 = 앞의 문자열은 key, = 뒤의 문자열은 value로 map에 저장
//substring , tokenizer, split 이용해서 분리가능

HashSet command=new HashSet();
command.add("list.co=net.bbs.List");
command.add("read.do=net.bbs.Read");
command.add("write.do=net.bbs.Write");
		
HashMap map=new HashMap();
		
Iterator iter=command.iterator();
while(iter.hasNext()){
	String str=(String) iter.next();
	int pos=str.indexOf("="); 
	String key=str.substring(0,pos);
	String value=str.substring(pos+1);
	map.put(key, value);
}//while end

System.out.println(map.get("read.do"));	 //net.bbs.Read	
System.out.println(map.get("list.co"));	 //net.bbs.List
System.out.println(map.get("write.do"));//net.bbs.Write	 

 


-수정하기

Generic 제네릭

데이터를 수집하는 경우 자료형을 제한할 수 있다.

제네릭은 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다.

즉, 클래스 내부에서 사용할 데이터 타입을 나중에 인스턴스를 생성할 때 확정하는 것을 제네릭이라고 한다.

한꺼번에 여러 자료형이 들어오면 관리하기 어렵다. 제네릭으로 원하는 자료형만 제한을 둘 수 있다.

 

제네릭의 여러가지 형태

<E> Element :  <참조자료형> 을 넣어주면 됨. 클래스만 올 수 있음.

<T> 사용자 정의형으로도 만들 수 있음.

<?>

 

1) 제네릭 Vector<String> 예시 

int[] su=new int[3];
//Vector<int> vec: 에러 기본형이 아니라 참조형이어야함.
//Element는 참조형(클래스)만 가능하다.

Vector<String> vec=new Vector<String>();
vec.add("손흥민");
//vec.add(3); 에러 , 자료형 스트링
vec.add(new String("박지성"));
//vec.add(new Integer(5)); 에러 , 자료형 스트링
vec.add("김연아");
vec.add("이강인");
		
for(int idx=0; idx<vec.size(); idx++){
	String str=vec.get(idx);
	System.out.println(str);
}//for end

출력결과
손흥민
박지성
김연아
이강인

 

2) 제네릭 ArrayList<Integer> 예시

ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(3);
arr.add(new Integer(5));
//arr.add("안녕"); //String형이라 에러
//arr.add('r'); //Character형이라 에러
//arr.add(2.5); //Double형이라 에러

 

3) 제네릭 HashSet<String> 예시

HashSet<String> set=new HashSet<String>();
set.add("개나리");
set.add("진달래");
set.add("라일락");

4) 제네릭 HashMap<K, V> 예시

- KEY & VALUE

HashMap<String, Integer> map=new HashMap<String, Integer>();
//key값으론 한글은 웬만하면 안쓰는게 좋다.
map.put("one", 3); 
map.put("two", new Integer(5));
//map.put("", "홍길동"); 정수형에 스트링넣어서 에러
		

5) 제네릭 사용자정의 자료형 예시

하나의 꾸러미형태로 만들어서, 값을 모아 다른페이지에 전달할 수 있다.

제네릭은 사용자가 만든 자료형을 넣을 수 있다.

package oop0610;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Vector;

class Mountain{
	String name; //산이름
	int height;    //산높이
	public Mountain(){}
	public Mountain(String name, int height){
		this.name=name;
		this.height=height;
	}
}//class end


public class Test03_Generic {

	public static void main(String[] args) {
		Mountain one=new Mountain("한라산",1950);
		Mountain two=new Mountain("관악산",1500);
		Mountain three=new Mountain("북한산",1000);
		
		//사용자 정의 자료형도 제네릭에 올 수 있다.
		ArrayList<Mountain> list=new ArrayList<Mountain>();
		list.add(one);
		list.add(two);
		list.add(three);
		//list.add("솔데스크"); 에러
		
		for(int idx=0; idx<list.size(); idx++){
			Mountain dto=list.get(idx);
			System.out.println(dto.name+" "+dto.height);
		}//for end
				
	}//main() end
}//class end

출력결과
한라산 1950
관악산 1500
북한산 1000

 

 


예제 1) 상품구매 프로그램 만들기

지금까지 배웠던 기능을 써본 예제이다.

자유자재로 쓸 수 있을 때까지 반복해서 보기

 

예제1) 상품구매 프로그램

package oop0610;
import java.util.*;

class Product { //인터페이스로 만드는거도 괜찮다.
	public int price; //상품가격
	public int bonusPoint; //마일리지
	public Product(){} //default Constructor
	public Product(int price){
		this.price = price;
		this.bonusPoint=(int)(price*0.1); //마일리지는 상품가격의 10%
	} //메소드 오버로딩
	
}//class end

class SmartTV extends Product{
	 //상품가격 100
	 //부모에게 상속받은 price에 상품가격 넣어주기
	 //super 명령어 이용하기.
	public SmartTV(){ //'나'의 생성자를 통해서 상속.
		super(100); //상품가 100, 보너스포인트 10
	}
	
	@Override
	public String toString() {
		return "스마트TV"; //상품명
	}
	
	
}

class Notebook extends Product{
	//상품가격 200
	public Notebook(){
		super(200); //상품가 100, 보너스포인트 10
	}
	
	@Override
	public String toString() {
		return "노트북";
	}
}

class SmartPhone extends Product{
	 //상품가격 300
	public SmartPhone(){
		super(150);
	}
	
	@Override
	public String toString() {
		return "스마트폰";
	}
}//class end


class Buyer{
	private int money = 1000; //총 재산
	private int mileage = 0;  //내 마일리지
	private int myProduct = 0;
	
	//구매한 상품을 저장
	private Product[] item = new Product[10]; //배열은 자료형이 같은 것만 받아온다. 그래서 부모인 Product 자료형을 받음.
	private int i=0;
	
	
	public Buyer(){}
	
	//이 셋은 부모가 product란 공통점이 있다.
/*	public void buy(SmartTV a){} 
	public void buy(Notebook a){}
	public void buy(SmartPhone a){}*/
	
	public void buy(Product a){ //몇 개를 샀는지 모아놓을 필요가 있다. 컬렉션프레임워크나 객체배열에 저장한다.
		if(this.money<a.price){
			System.out.println("잔액이 부족합니다.");
			return;
		}//if end
		
		//구매한 상품을 저장
		item[i++]=a;

		money = this.money - a.price;
		mileage = this.mileage + a.bonusPoint;
		
		
		
	}
	
	public void disp(){
		//내가 구매한 상품명
		String goods ="";
		
		//내가 사용한 총 누적 합계
		int hap =0;
		int items = 0;
		for(int n=0; n<item.length; n++){
			if(item[n]==null) break;
			goods = goods+item[n]+" ";			
			hap = hap+item[n].price;
			items = n+1;
		}//for end
		
		System.out.println("구매한 상품: "+goods);
		System.out.println("구매한 제품갯수: "+items+"개 입니다.");
		System.out.println("구매한 금액: "+hap+"원 입니다.");
		System.out.println("잔여금액: "+this.money+"원이 남았습니다.");
		System.out.println("마일리지: "+this.mileage+"점이 적립되었습니다.");
	}
	
}//class end



public class Test04_BuyerTest {

	public static void main(String[] args) {
		//상품구매 관련 프로그램.
		//지금까지 배운 것을 적용한 예제.
		
		
		//상품 진열하기.
		SmartTV tv = new SmartTV();
		Notebook note = new Notebook();
		SmartPhone phone = new SmartPhone();
		
		Buyer kim = new Buyer();
		kim.buy(tv);
		kim.buy(tv);
		kim.buy(note);
		kim.buy(note);
		kim.buy(phone);
		kim.disp();
		
		
		

	}//main end
}//class end

 

 

예제2) 상품구매 후 반품 프로그램

package oop0609;
import java.util.*;

class Product { //인터페이스로 만드는거도 괜찮다.
	public int price; //상품가격
	public int bonusPoint; //마일리지
	public Product(){} //default Constructor
	public Product(int price){
		this.price = price;
		this.bonusPoint=(int)(price*0.1); //마일리지는 상품가격의 10%
	} //메소드 오버로딩
	
}//class end

class SmartTV extends Product{
	 //상품가격 100
	 //부모에게 상속받은 price에 상품가격 넣어주기
	 //super 명령어 이용하기.
	public SmartTV(){ //'나'의 생성자를 통해서 상속.
		super(100); //상품가 100, 보너스포인트 10
	}
	
	@Override
	public String toString() {
		return "스마트TV"; //상품명
	}
	
	
}

class Notebook extends Product{
	//상품가격 200
	public Notebook(){
		super(200); //상품가 100, 보너스포인트 10
	}
	
	@Override
	public String toString() {
		return "노트북";
	}
}

class SmartPhone extends Product{
	 //상품가격 300
	public SmartPhone(){
		super(150);
	}
	
	@Override
	public String toString() {
		return "스마트폰";
	}
}//class end


class Buyer{
	private int money = 1000; //총 재산
	private int mileage = 0;  //내 마일리지
	private int myProduct = 0;
	
	//구매한 상품을 저장
	Vector<Product> vec = new Vector<Product>();
	
	
	public Buyer(){}
	
	//이 셋은 부모가 product란 공통점이 있다.
/*	public void buy(SmartTV a){} 
	public void buy(Notebook a){}
	public void buy(SmartPhone a){}*/
	
	public void buy(Product a){ //몇 개를 샀는지 모아놓을 필요가 있다. 컬렉션프레임워크나 객체배열에 저장한다.
		if(this.money<a.price){
			System.out.println("잔액이 부족합니다.");
			return;
		}//if end
		
		//구매한 상품을 저장
		vec.add(a);

		money = this.money - a.price;
		mileage = this.mileage + a.bonusPoint;
		
	}
	
	
	
	
	public void disp(){
		//내가 구매한 상품명
		String goods ="";
		
		//내가 사용한 총 누적 합계
		int hap =0;
		int items = 0;
		
		if(vec.isEmpty()){
			System.out.println("상품구매내역이 존재하지 않습니다.");
			return;
		}
		
		for(int n=0; n<vec.size(); n++){
			if(vec.elementAt(n)==null) break;
			goods = goods+vec.elementAt(n)+" ";			
			hap = hap+vec.elementAt(n).price;
			items = n+1;
		}//for end
		
		System.out.println("구매한 상품: "+goods);
		System.out.println("구매한 제품갯수: "+items+"개 입니다.");
		System.out.println("구매한 금액: "+hap+"원 입니다.");
		System.out.println("잔여금액: "+this.money+"원이 남았습니다.");
		System.out.println("마일리지: "+this.mileage+"점이 적립되었습니다.");
	}
	
	public void refund(Product a){
		if(vec.remove(a)){
			System.out.println(a.toString()+"(반품)");
			this.money=this.money+a.price;
			this.mileage=this.mileage-a.bonusPoint;
		}else {
			System.out.println(a.toString()+"상품이 없습니다.");
		}
	}
	
	
	
}//class end



public class Test05_BuyerTest {

	public static void main(String[] args) {
		//상품구매 관련 프로그램.
		//지금까지 배운 것을 적용한 예제.
		
		
		//상품 진열하기.
		SmartTV tv = new SmartTV();
		Notebook note = new Notebook();
		SmartPhone phone = new SmartPhone();
		
		Buyer kim = new Buyer();
		kim.buy(tv);
		kim.buy(note);
		kim.buy(phone);
		kim.disp();
		
		//상품 반품하기.	
		System.out.println("----------------반품----------------");
		kim.refund(phone);
		kim.refund(note);
		
		//구매내역 출력하기.
		kim.disp();
		
		
		

	}//main end
}//class end