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());
}
}
}
'Dev > Java' 카테고리의 다른 글
[java] Stream (0) | 2019.01.30 |
---|---|
[java] 스레드 (0) | 2019.01.28 |
[java] 내부클래스, 익명의클래스(Annonymous), Vector (0) | 2019.01.27 |
[java] 추상클래스, 인터페이스 (0) | 2019.01.25 |
[java] Calendar 클래스, Wrapper 클래스, Singleton, final (0) | 2019.01.24 |