본문 바로가기

JAVA/기본다지기

JAVA 14일차 필기

컬렉션 프레임워크(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