Dev/Java

[java] ArrayList, List, Map, Generic, Exception

창문닦이 2019. 1. 27. 18:11

ArrayList와 list

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.ListIterator;

public class Test1 {

public static void main(String[] args) {

List<String> lists = new ArrayList<String>();

lists.add("서울");

lists.add("부산");

lists.add("대구");

Iterator<String> it = lists.iterator();

while(it.hasNext()){

String str= it.next();

System.out.print(str+" ");

}

System.out.println();

ListIterator<String> it2 = lists.listIterator();

while(it2.hasNext()){

System.out.print(it2.next() + " "); //위에 소스두줄이 하나로 표현 가능

}

System.out.println();

//출력 2번 진행하더라도 뜨지 않음. 출력후 데이터는 NULL

while(it2.hasNext()){

System.out.print(it2.next() + " ");

}

System.out.println();

//ListIterator<String> it3 = lists.listIterator();

//역순으로 출력. hasPrevious 기능

while(it2.hasPrevious()){

System.out.println(it2.previous());

}

List<String> lists1 = new ArrayList<String>();

lists1.addAll(lists); //collection을 add 할 수 있음

lists1.add("인천"); //마지막에 추가

int n = lists1.indexOf("부산");//1

lists1.add(n+1, "광주");//부산의 인덱스+1 위치에 광주를 삽입

for(String c : lists1){//확장for문으로 출력

System.out.print(c + " ");

}

List<String> lists2 = new ArrayList<String>();

lists2.add("자바프로그래머");

lists2.add("프레임워크");

lists2.add("스트럿츠");

lists2.add("서블릿");

lists2.add("스프링");

String str;

Iterator<String> it4 = lists2.iterator();

while(it4.hasNext()){

str = it4.next();

if(str.startsWith("서")){ //리스트값과 시작하는단어가 동일한 것을 찾으라는 메소드

System.out.println(str);

}

}

}

}


Map<키, 값> 인터페이스

- list와 Map이 가장 많이 사용됨. 속도는 Map이 더 빠름(고유값이 존재, key).

Hashtable : Vector와 동일

HashMap : ArrayList와 동일

키는 중복값을 가질 수 없다.(키는 Set이다.)

키가 중복값을 가지면 마지막 값이 저장된다. 1 이순신, 1 홍길동 -> 입력 시 1 홍길동만 남음

-> 키가 같으면 수정된다.

Map은 Iterator가 없다.(Set의 Iterator를 빌려 쓴다)

put(입력)

get(출력)

import java.util.Hashtable;

import java.util.Iterator;

public class Test2 {

public static final String tel[] = {"111-111","222-222","333-333","111-111","444-444"}; //key

public static final String name[] = {"배수지","박신혜","한지민","이효리","천송이"}; //value

public static void main(String[] args) {

Hashtable<String, String> h = new Hashtable<String, String>(); //Map중 Hashtable 객체 생성. 인터페이스. 맨처음 Hashtable -> Map으로 변경 가능

for(int i=0; i<name.length;i++){

h.put(tel[i], name[i]);

}

System.out.println(h);//Map은 출력시.. 컴퓨터에게 최적의 상태로... 자기맘대로 보여줌

//중복된 키 값 111-111 이므로 이효리만 남음

//-----------------------------------------------

String str;

str = h.get("111-111"); //key를 주면 value를 반환

System.out.println(str);

//키가 존재하는지 검사

if(h.containsKey("222-222")){

System.out.println("222-222 존재");

}else{

System.out.println("222-222 존재 안함");

}

//Value가 존재하는지 검사

if(h.containsValue("박 신혜")){ //띄어쓰기 존재하면 못찾아냄

System.out.println("있어요!");

}else{

System.out.println("없어요!");

}

//데이터삭제

h.remove("222-222"); //키값을 매개변수로 사용. 해당 키값과 value를 삭제

if(h.containsKey("222-222")){

System.out.println("222-222 존재");

}else{

System.out.println("222-222 존재 안함");

}

//키는 Set이며, Map의 Set은 중복을 허용하지 않는 자료구조이다.

//Set은 Iterator가 존재하므로 Hashtable 또는 HashMap의

//keyset()메소드로 Iterator를 사용한다.

Iterator<String> it = h.keySet().iterator(); //key의 자료형으로 작성

//Set도 인터페이스

while(it.hasNext()){

String key = it.next();//key

String value = h.get(key);//Map에 key값을 넣으면 value 반환

System.out.println(key + ":" + value );

}

}

}


범용적인 데이터는 리스트, key와 value를 구분해야할 때에는 map 사용

[List]

동기화를 지원하냐에 따라 속도차이가 많이남. ArrayList : 동기화지원안함. 그래서 속도 더 빠름

List<저장할 자료형> lists = new ArrayList<저장할 자료형>();

List<저장할 자료형> lists = new Vector<저장할 자료형>();

ArrayList<저장할 자료형> lists = new ArrayList<저장할 자료형>();

Vector<저장할 자료형> lists = new Vector<저장할 자료형>();

**메소드

add : 추가

size : 요소갯수

remove(index) : 삭제

clear : 전체데이터 삭제

trimtoSize : 빈공간 삭제

Iterator<저장된 자료형> it = lists.iterator();

while(it.hasNext()){

저장된자료형 value = it.next();

}


[Map]

hashmap과 hashtable은 속도차이가 거의 나지 않음

Map<키자료형, 저장할자료형> map = new HashMap<키자료형, 저장할자료형>();

Map<키자료형, 저장할자료형> map = new Hashtable<키자료형, 저장할자료형>();

HashMap<키자료형, 저장할자료형> map = new HashMap<키자료형, 저장할자료형>();

Hashtable<키자료형, 저장할자료형> map = new Hashtable<키자료형, 저장할자료형>();

**메소드

put(key,value) : 추가

remove : 삭제

clear : 전체삭제

Iterator<저장된 자료형> it = map.keySet().iterator();

while(it.hasNext()){

키자료형 key = it.next();

저장된자료형 value = map.get(key);

}

import java.util.Arrays;

import java.util.HashSet;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

import java.util.Queue;

import java.util.Set;

import java.util.Stack;

public class Test3 {

public static void main(String[] args) {

//Set : 중복을 허용하지 않는다.

//Set이라는 인터페이스를 구현한 HashSet 클래스

Set<String> s = new HashSet<String>();

s.add("서울");

s.add("부산");

s.add("대구");

System.out.println(s);

Iterator<String> it = s.iterator();

while(it.hasNext()){

String str= it.next();

System.out.print(str + " ");

}

System.out.println();

//중복허용안함

s.add("서울"); //중복값을 추가해도 덮어씌워짐.

System.out.println(s);

System.out.println("---------------------------");

//Stack

System.out.print("스택: ");

Stack<String> st = new Stack<String>();

//입력시 push, add 메소드 가능. push를 더 많이 사용. 스택에서 이 메소드들은 move의 개념

st.push("서울");

st.add("부산");

st.push("대구");

st.push("광주");

//시작과 끝이 정해져있을땐 for, 끝을 모를땐 while, 한번은 무조건 실행해야되면 Do~while

while(!st.empty()){ //stack이 비어있을때까지 반복 진행.(끝까지 진행해라

System.out.print(st.pop()+ " "); //stack은 데이터를 꺼내게 되면 삭제됨

}

//출력한 데이터는 삭제됨

while(!st.empty()){

System.out.print(st.pop()+ " ");

}

System.out.println("\n------------------------------");

//Queue

Queue<String> q = new LinkedList<String>();

q.add("서울");

q.offer("부산");

q.offer("대구");

q.offer("광주");

System.out.print("Queue : ");

while(q.peek()!=null){

System.out.print(q.poll() + " ");

}

System.out.println("\n------------------------------");

List<String> list1 = new LinkedList<String>();

list1.add("A");

list1.add("B");

list1.add("C");

list1.add("D");

list1.add("E");

list1.add("F");

list1.add("G");

list1.add("H");

List<String> list2 = new LinkedList<String>();

list2.add("서울");

list2.add("부산");

list2.add("대구");

list2.addAll(list1); //컬렉션안에 컬렉션을 집어 넣을 수 있다.

System.out.print("LinkedList : ");

for(String ss:list1){

System.out.print(ss + " ");

}

System.out.println();

System.out.print("컬렉션에 컬렉션을 넣은 LinkedList : ");

for(String ss:list2){

System.out.print(ss + " ");

}

System.out.println("\n------------------------------");

//범위삭제

list2.subList(2, 5).clear();

for(String ss:list2){

System.out.print(ss + " ");

}

System.out.println("\n------------------------------");

String[] str = {"다","바","나","가","마","라"};

System.out.print("기존배열: ");

for(String ss : str){

System.out.print(ss + " ");

}

System.out.println();

//배열 정렬

Arrays.sort(str);

System.out.print("정렬된 배열: ");

for(String ss : str){

System.out.print(ss + " ");

}

System.out.println();

}

}


Generic 개념

class Box<T>{

private T t; //T의 자료형이 결정되지 않음

public void set(T t){//초기화메소드

this.t = t;

}

public T get(){//반환값호출메소드

return t;

}

}

public class Test4 {

public static void main(String[] args) {

//느려서 많이 쓰지는 않음. 제너릭 구조

Box<Integer> b1 = new Box<Integer>();

b1.set(new Integer(10)); //T는 클래스. 매개변수 입력 시 객체를 생성해줘야 함. 참조형 자료형의 객체생성

Integer i = b1.get();

System.out.println(i);

//-----------------------------------------

Box<String> b2 = new Box<String>();

b2.set("서울");

String s = b2.get();

System.out.println(s);

//-----------------------------------------

Box b3 = new Box(); //Box의 자료형 선언 안한 상태. Object로 만들어짐

b3.set(30); //제일 큰 클래스 Object로 box에 30입력. upcast

Integer ii = (Integer)b3.get(); //downcast

}

}


제너릭의 기본적인 구조 이해. 컬렉션이 이 형태로 이루어져 있음

class Box2<T>{

private T t;//T는 전역변수 개념

public void set(T t){

this.t = t;

}

public T get(){

return t;

}

public <U> void print(U u){// 메소드에도 제너릭 사용가능. U는 print 메소드에서만 사용 가능한 자료형

System.out.println(u);

System.out.println("t클래스의 자료형: "+ t.getClass().getName());

//.getClass().getName() 어떤 클래스건간에 공통적으로 가지고 있는 메소드

System.out.println("u메소드의 자료형: "+ u.getClass().getName());

}

}

public class Test5 {

public static void main(String[] args) {

Box2<Integer> b = new Box2<Integer>();

b.set(new Integer(30)); //T를 초기화. T -> Integer

b.print("test"); //메소드초기화(String). print 메소드의 매개변수로 test라는 문자열을 줌. 반환값도 문자열을 줌

b.print(50); //메소드초기화(Integer). T의 클래스는 고정.

//각각 메소드의 자료형을 지정해 줄 수 있음. U의 자료형 정수형으로 바뀌어서 Integer 보임

}

}


Exception 클래스 (예외처리)

코딩상에는 에러가 없는 데 실행하다가 오류가 발생하는 것을 Runtime Error

숫자 입력해야되는데 문자 입력 or 연산자 잘못 입력

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class Test6 {

public static void main(String[] args) {

int a, b, result;

String oper;

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

// try{}에서 에러가 발생하게 되면 catch 가 잡아냄.

// Exception이 오류처리한 결과를 매개변수 e 에 할당

// 내가 사용자에러를 발생시키는 경우도 있음

try {

System.out.print("첫번째 수? ");

// a = sc.nextInt();

// b = sc.nextInt();

a = Integer.parseInt(br.readLine());

System.out.print("두번째 수? ");

b = Integer.parseInt(br.readLine());

System.out.print("연산자? ");

// oper = sc.next();

oper = br.readLine();

result = 0;

if (oper.equals("+"))

result = a + b;

else if (oper.equals("-"))

result = a - b;

else if (oper.equals("/"))

result = a / b;

else if (oper.equals("*"))

result = a * b;

System.out.printf("%d %s %d  = %d \n", a, oper, b, result);

} catch (NumberFormatException e) {

System.out.println("정수를 입력해라!");

} catch (ArithmeticException e) {

System.out.println("0으로 나누면 안돼!");

} catch (Exception e) {

System.out.println("숫자가 아니야!");

// System.out.println(e.toString());

e.printStackTrace();// 원래 뜨던 에러 화면. default였는데 try catch 사용한 것

} finally {//에러발생시 해당하는 에러부분의 catch문이 실행되고 finally가 항상 실행.

System.out.println("난 항상 보인다");

}

System.out.println("여기는 try밖...");

}

}


예외처리를 활용한 계산기 만들기

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class Test7 {

public static String getOper() throws Exception{

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String oper = null;

try {

System.out.println("연산자?");

oper =br.readLine();

if(!oper.equals("+") && !oper.equals("-") && !oper.equals("/") && !oper.equals("*")){

//throw로 예외를 의도적으로 발생 시킴

//throw를 사용할려면 반드시 throws Exception을 기술한다

//try.. catch문으로 감싸준다.

throw new Exception("연산자 입력 오류!");//이 메세지를 Exception에 전달

}

} catch (Exception e) {

System.out.println(e);

}

return oper;

}

public static void main(String[] args) {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int a, b, result;

String oper;

try {

System.out.print("첫번째 수? ");

a = Integer.parseInt(br.readLine());

System.out.print("두번째 수? ");

b = Integer.parseInt(br.readLine());

oper = Test7.getOper();

result = 0;

if (oper.equals("+"))

result = a + b;

else if (oper.equals("-"))

result = a - b;

else if (oper.equals("/"))

result = a / b;

else if (oper.equals("*"))

result = a * b;

System.out.printf("%d %s %d  = %d \n", a, oper, b, result);

} catch (Exception e) { //Try문에서 에러 발생시 catch가 잡아냄

System.out.println(e.toString());

}

}

}