컬렉션 프레임워크(Collection Framework)
컬렉션 프레임워크는 프로그래머가 가장 많이 쓰는 데이터 정렬 방식들을 지원하는 도구이다.
json{key:value} -> (java의 HashMap도 Key와 Value를 대응시킨다.)
최근에 많이 사용하게 되었음.
ex){
"이름": "홍길동",
"나이": 25,
"성별": 남;
}
와 같이 key 와 value를 대응시킨다.
key로 검색하면 value가 나오는 형식이다.
자바스크립트의 문법을 채용했다.
(자바스크립트를 자주 사용하는 웹 환경에서 유리하다.)
문서로 데이터를 교환하는 xml 방식과 달리
문자열로 데이터를 교환하기 때문에 속도가 매우 빠르다.
집합(수학적도구) > HashSet
중복을 허용하지 않는다.
인덱스가 존재하지 않는다.
ArrayList
새로운 패키지 ch14collectionframework 생성, 새로운 클래스 L01ArrayList.java 생성
package com.javalesson.ch14collectionframework;
//collection framework -> java.util 패키지 안에 있다.
//프로그래머가 가장 많이 쓰는 데이터 정렬 방식들을 지원하는 도구이다.
//array String[] array = {"A", "B", "C"}; -> ArrayList
//json{key:vlaue} -> HashMap
//집합(수학적 도구) -> HashSet
import java.util.ArrayList;//제네릭을 가진다.
import java.util.List;//ArrayList를 구현하기 위한 interface(설계도)
public class L01ArrayList {
public static void main(String[] args){
List list = new ArrayList();//아무것도 쓰지 않으면 generic은 Object
list.add("월");
list.add("화");
list.add("수");
list.add(4);
list.add(5.0);
list.add('토');
list.add("일");
String[] str_list = {"월", "화", "수","목","금","토","일"};
System.out.println(list); //출력결과 : [월, 화, 수, 4, 5.0, 토, 일]
System.out.println(str_list); //출력결과 : [Ljava.lang.String;@15db9742
for(String e: str_list){
System.out.print(e+","); //출력결과 : 월,화,수,목,금,토,일,
}
System.out.println();
for(int i=0; i<list.size(); i++){
System.out.print(list.get(i)+","); //출력결과 : 월,화,수,4,5.0,토,일,
}
}//main end
}//class end
list는 자료구조를 보조하는 Class
str_list는 단순한 자료구조
배열과 ArrayList의 차이
배열(array) | ArrayList |
데이터 타입이 한정적이다. | generic으로 유동적이다. |
초기 index가 고정이다. | .add( )로 계속 추가가 가능하다. |
index를 가진다. | size( )를 가진다. |
프로그래머가 출력 | System.out.println( )으로 출력 가능 |
HashMap
HashMap 클래스
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
ch14collectionframework 패키지에 새로운 클래스 L02HashMap.java 생성
package com.javalesson.ch14collectionframework;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;//List 같이 ArrayList의 주요 인터페이스
import java.util.Set;
import java.util.Iterator;//모든 컬렉션프레임워크가 가지고있는 정렬을 도와주는 인터페이스
public class L02HashMap {
public static void main(String[] args){
Map map = new HashMap();//Map<String,Object> map = new HashMap<String, Object>
map.put("id", "javalesson"); //(Key, Value)
map.put("name", "Kim");
map.put("gender", 1);
map.put("pw", 1234.3);
map.put("name", "Hong");
//put명령어는 같은 key값이 put()되면 기존의 key값은 밀려난다.
//컬렉션프레임워크는 철저히 프로그래머 중심 -> 출력을 쉽게 도와준다.
System.out.println(map);//객체자체를 호출하는 것은 .toString()을 호출하는 것과 같다
//출력결과 : {gender=1, pw=1234.3, name=Hong, id=javalesson}
System.out.println(map.get("id"));//key값으로 호출 : javalesson
System.out.println(map.get("id2"));//존재하지 않는 key값 호출은 null을 출력
//ArrayList의 정렬을 돕는 인터페이스는 Iterator
//HashMap의 정렬을 돕는 인터페이스는 Entry
//HashMap의 toString 따라잡기
Set<Map.Entry<String, Object>> entries = map.entrySet();//Map을 정렬
Iterator<Map.Entry<String, Object>> it = entries.iterator();//출력을 위해
while(it.hasNext()){
Map.Entry<String, Object> entry = it.next();
System.out.print(entry.getKey()+"="+entry.getValue()+", ");
}//출력결과 : gender=1, pw=1234.3, name=Hong, id=javalesson,
System.out.println("\n foreach 출력");
//forEach문으로 -> Iterator대신
for(Map.Entry<String, Object> entry : entries){
System.out.print(entry.getKey()+"="+entry.getValue()+", ");
}//출력결과 : gender=1, pw=1234.3, name=Hong, id=javalesson,
Map seafood = new HashMap();
List fish = new ArrayList();
List shellfish = new ArrayList();
fish.add("삼치");
fish.add("고등어");
fish.add("갈치");
fish.add("꽁치");
fish.add("광어");
shellfish.add("전복");
shellfish.add("가리비");
shellfish.add("홍합");
shellfish.add("굴");
seafood.put("물고기", fish);
seafood.put("조개", shellfish);
System.out.println();
System.out.println(seafood.get("조개")); //출력결과 : [전복, 가리비, 홍합, 굴]
Map allMap = new HashMap();
allMap.putAll(map);
allMap.putAll(seafood);
System.out.println(allMap);
//출력결과 : {name=Hong, 물고기=[삼치, 고등어, 갈치, 꽁치, 광어], id=javalesson,
gender=1, 조개=[전복, 가리비, 홍합, 굴], pw=1234.3}
}//main end
}//class end
HashSet
새로운 클래스 L03HashSet.java 생성
package com.javalesson.ch14collectionframework;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
public class L03HashSet {//집합
public static void main(String[] args){
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("two");
list.add("three");
list.add("three");
list.add("three");
list.add("four");
list.add("four");
list.add("four");
list.add("four");
System.out.println(list);
Set<String> set = new HashSet<String>();
set.add("one");
set.add("two");
set.add("two");
set.add("three");
set.add("three");
set.add("three");
set.add("four");
set.add("four");
set.add("four");
set.add("four");
System.out.println(set);
System.out.println(set.size());
Set<Integer> A = new HashSet<Integer>();
A.add(1);
A.add(2);
A.add(3);
Set<Integer> B = new HashSet<Integer>();
B.add(3);
B.add(4);
B.add(5);
Set<Integer> C = new HashSet<Integer>();
C.add(1);
C.add(2);
//부분집합인지 아닌지 확인하는 함수 containsAll()
System.out.println(A.containsAll(C));//boolean으로 반환(T or F)
//교집합을 만든다. (∩) A.retainAll(B); A와 B의 교집합을 A에 대입
A.retainAll(B);
System.out.println(A);
//합집합을 만든다. (∪) A.addAll(C);
A.addAll(C);
System.out.println(A);
//차집합을 만든다. (-) A-(A ∩ B)
A.removeAll(B);
System.out.println(A);
}//main end
}//class end
예외처리
새로운 패키지 ch15exception 생성, 새로운 클래스 L01TryCatch.java 생성
프로그램단에서 오류 해결
package com.javalesson.ch15exception;
import java.util.Scanner;
public class L01TryCatch {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a,b;
System.out.print("분자 값은: ");
a = scan.nextInt();
do{
System.out.print("분모 값은: ");
b = scan.nextInt();
if(b==0){
System.out.println("분모는 0이 될 수 없습니다.");
}
}while(b==0);
System.out.println("\na/b = "+(a/b)); //에러
int[] c = {0,1,2,3};
int i = 4;
int j = 0;
if((i>(c.length-1) && i>=0) || (j>(c.length-1) && j>=0)){
System.out.println("배열의 인덱스 범위를 초과하였습니다.");
System.out.println("(i: "+i+", j: "+j+") i와 j는 "+(c.length-1)+"을 초과할 수 없습니다.");
}else{
System.out.println(c[i]/c[j]); //에러
}
}//main end
}//class end
TryCatch문으로 예외처리하여 해결
package com.javalesson.ch15exception;
import java.util.Scanner;
public class L01TryCatch {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a,b;
System.out.print("분자 값은: ");
a = scan.nextInt();
System.out.print("분모 값은: ");
try{
b = scan.nextInt();
System.out.println("\na/b = "+(a/b));
}catch(ArithmeticException e){
System.out.println(e.toString()+" 예외발생");
}
int[] c = {0,1,2,3};
int i = 4;
int j = 0;
try{
System.out.println(c[i]/c[j]);
}catch(ArithmeticException e){
System.out.println(e.toString()+" 예외발생");
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(e.toString()+" 예외발생2");
}catch(Exception e){
System.out.println(e.toString()+" 모든예외의 조상");
}finally{
System.out.println("finally는 무조건 실행");
}
//예외가 발생하면 try catch 내부의 thread가 무시된다(밖으로 벗어난다)
//중복으로 예외처리 가능
//Exception은 모든 예외처리가 가능 but 다른 클래스로 예외처리하면
//try catch 내부에 어떤 오류가 발생할 수 있는지 참고할 수 있다.
//필요한 예외처리만 할 수 있기 때문에 가볍다.
//finally는 무조건 실행된다.
}//main end
}//class end
새로운 클래스 L02TryCatchEx.java 생성
package com.javalesson.ch15exception;
import java.io.IOException;
public class L02TryCatchEx {
public static void main(String[] args){
//Scanner가 얼마나 편한 클래스인지
//Scanner따라잡기
//Scanner클래스는 System.in(콘솔 input)을 사용하기 위해 보조하는 클래스
int[] input = new int[255];
int i;
try{
for(i=0;i<=255;i++){
input[i]=System.in.read();
System.out.print((char)input[i]);
}
}catch(IOException e){
System.out.println(e.toString());
}
}//main end
}//class end
while문으로 받아보기
package com.javalesson.ch15exception;
import java.io.IOException;
public class L02TryCatchEx {
public static void main(String[] args){
//Scanner가 얼마나 편한 클래스인지
//Scanner따라잡기
//Scanner클래스는 System.in(콘솔 input)을 사용하기 위해 보조하는 클래스
int[] input = new int[255];
int i;
try{
while((input=System.in.read())!=1){
System.out.print((char)input);
}
}catch(IOException e){
System.out.println(e.toString());
}//생각해 볼 점 : 왜 read()는 Byte 단위로만 입력받을 수 있는가? 데이터통신 때문!
//ISA : 8bit 또는 16bit 버스구조 방식(초기PC인 IBM모델에 사용된 병렬 데이터버스)
//read()는 왜 return값의 데이터 타입이 byte가 아닌 int인가?
byte일 경우 0~255까지 표현한 후에 -1을 return할 공간이 부족하기 때문.
}//main end
}//class end
'JAVA > 기본다지기' 카테고리의 다른 글
[JAVA] 간단한 영화관 예약프로그램 예제 (0) | 2016.08.25 |
---|---|
[JAVA] 가위바위보 게임 (1) | 2016.08.25 |
JAVA 13일차 필기 (0) | 2016.08.22 |
[JAVA] 0~100 숫자맞추기 게임 (0) | 2016.08.18 |
JAVA 12일차 필기 (0) | 2016.08.17 |