티스토리 뷰

IT/JAVA

8. Java 유용한 API

a-toz 2017. 11. 9. 19:02

**iterator(enumeration, cursor, 반복자)

=>컬렉션(데이터의 모임)에서 저장되는 데이터 크기에 상관없이 다음 데이터를 가리킬 수 있도록 해주는 포인터

=>배열은 인덱스를 이용해서 다음 데이터로 진행하지만 배열을 제외한 컬렉션들은 인덱스를 이용해도 되고 반복자의 next를 이용해서 다음 데이터를 가리키게 됩니다.

=>반복자 때문에 개발자는 컬렉션에 저장되는 요소의 크기에 상관없이 다음 데이터를 접근할 수 있게 됩니다.

=>데이터베이스에서 이러한 기능을 수행하는 것을 cursor라고 합니다.


java에서는 예전에 만들어진 Collection 들은 Enumeration을 이용하고 최근에 만들어진 Collection 들은 Iterator를 이용합니다.


1.Enumeration

=>boolean hasMoreElements() : 다음 데이터의 존재여부를 리턴해주는 메소드

=>E nextElement() : 다음 데이터를 리턴해주는 메소드


//Vector는 Enumeration 인터페이스를 implements

Vector<String> vector = new Vector<String>();


//vector의 모든 요소를 순차적으로 접근

while(true){

//다음 데이터가 없을 때까지

if(vector.enumerable().hasMoreElements() == false){

break;

}

String imsi = vector.enumerable().nextElement();

}


2.Iterator

=>boolean hasNext(): 다음 데이터의 존재 여부를 리턴

=>E next(): 다음 데이터를 리턴 - 없으면 예외 발생

=>iterator()라는 메소드를 만들 수 있습니다.


ArrayList<Integer>list = new ArrayList<Integer>();


//Iterator를 이용해서 list의 모든 데이터 접근

=>hasNext가 false를 리턴할 때 까지 next()를 호출

while(true){

if(list.iterator().hasNext() == false){

break;

}

Integer imsi = list.iterator().next();

}



**List 인터페이스

=>데이터를 순서대로 저장하는 자료구조


메소드

boolean add(E e): 데이터를 마지막 위치에 삽입하고 성공하면 true 실패하면 false를 리턴


void add(int index, E e): index 번째에 데이터를 끼워넣는 메소드


E get(int index): index 번째에 해당하는 데이터를 리턴해주는 메소드


E remove(int index): index 번째의 데이터를 삭제하고 리턴해주는 메소드


int size(): 데이터 개수를 리턴해주는 메소드


1.Vector 클래스

=>데이터를 입력한 순서대로 연속해서 저장하는 가변배열

=>처음 설정한 크기보다 더 많은 데이터가 삽입되면 자동으로 크기를 늘려서저장합니다.

=>빠른 열거를 사용할 수 있습니다.

=>제너릭을 적용

=>toString 이 재정의 되어 있어서 모든 데이터의 toString을 호출한 결과를 리턴합니다.


생성자

Vector()

Vector(int 초기사이즈)

Vector(int 초기사이즈, int 한 번에 늘려줄 크기) 

Vector(Collection 다른 리스트)


문자열을 저장하는 벡터를 생성하고 데이터를 삽입한 후 벡터에 저장된 모든 데이터를 출력

import java.util.Vector;


public class VectorMain {


public static void main(String[] args) {

//문자열을 여러 개 묶어서 저장할 수 있는 Vector를 생성

Vector<String>vec = new Vector<String>();

//데이터를 삽입

vec.add("데이터 수집 - 프로그래밍 언어");

vec.add("데이터 저장 - 하둡,데이터베이스,파일");

vec.add("데이터 전처리 - 프로그래밍 언어");

vec.add("데이터 저장 - 하둡,데이터베이스,파일");

vec.add("데이터 분석 - 프로그래밍 언어");

vec.add("데이터 저장 - 하둡,데이터베이스,파일");

vec.add("데이터 시각화 - 프로그래밍언어");

//Vector의 모든 내용을 출력

//일반 for를 이용해서

int size = vec.size();

for(int i=0; i<size; i++){

String imsi = vec.get(i);

System.out.println(imsi);

}

//빠른 열거를 이용

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

for(String imsi : vec){

System.out.println(imsi);

}

//값만 확인

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

System.out.println(vec);

}


}


=>Vector는 기본적으로 멀티스레드에 동기화가 되어 있습니다.

=>데이터를 사용할 때 마다 다른 스레드가 사용 중인지 확인해가면서 데이터를 사용합니다.

=>멀티스레드 프로그램이 아닌 경우에는 시간낭비가 발생하게 됩니다.

=>이러한 문제를 해결해서 나온 클래스가 ArrayList입니다.


2.ArrayList

=>구조가 Vector 와 같음

=>Vector와 동일하게 사용

=>데이터베이스의 데이터를 읽어서 저장할 때 가장 많이 사용

=>데이터를 순서대로 연속해서 저장하기 때문에 연속된 빈 공간이 없으면 데이터를 저장할 수 없고 중간에 데이터를 추가하게 되면 다른 데이터들의 이동이 발생하게 되기 때문에 중간에 데이터를 삽입하면 느려집니다.

=>중간에 위치한 데이터를 삭제하게 되면 뒤에 있는 데이터들이 이동을 해야 합니다.


3.LinkedList

=>데이터를 논리적인 순서대로 연속해서 저장하는 자료구조

=>다음 데이터가 실제 물리적인 다음이 아닌 포인터를 이용해서 가리키는 구조

=>데이터를 삽입하거나 삭제할 때 물리적인 이동이 발생하지 않기 때문에 삽입이나 삭제가 빈번한 경우에는 유리한 자료구조

=>데이터를 순서대로 접근해가면서 읽기 때문에 읽는 속도가 느립니다.

=>응용프로그램의 데이터를 저장할 때 주로 이용

=>운영체제의 파일 시스템도 이 자료구조를 이용합니다.

=>사용법은 ArrayList와 동일합니다.


정수를 저장할 수 있는 ArrayList 와 LinkedList를 만들어서 중간에 데이터를 100000개 삽입하는 시간 비교

import java.util.ArrayList;

import java.util.LinkedList;


public class ArrayListMain1 {

public static void main(String [] args){

//정수를 저장할 수 있는 ArrayList를 만들고

//3개의 저장

//정수를 저장할 때 자료형은 int 가 아니고 Integer

//제너릭은 참조형만 가능:<>안에는 참조형만 가능

ArrayList<Integer> al = 

new ArrayList<Integer>();

al.add(1);

al.add(3);

al.add(9);

//정수 3개 저장한 LinkedList 생성

LinkedList<Integer> li = 

new LinkedList<Integer>();

li.add(1);

li.add(3);

li.add(9);

//ArrayList에 2를 1번째 위치에 100000개 넣는데 

//걸리는 시간 측정

long start = System.currentTimeMillis();

for(int i=0; i<1000000; i++){

al.add(1, 2);

}

long end = System.currentTimeMillis();

System.out.println("ArrayList:" + (end-start));

//LinkedList에 2를 1번째 위치에 100000개 넣는데

//걸리는 시간 측정

start = System.currentTimeMillis();

for(int i=0; i<1000000; i++){

li.add(1, 2);

}

end = System.currentTimeMillis();

System.out.println("LinkedList:" + (end-start));

}

}


=>데이터를 중간에 빈번히 추가하거나 삭제하는 경우는 LinkedList가 좋고 데이터를 마지막에만 추가하거나 읽기만 하는 경우에는 ArrayList가 좋습니다.

=>ArrayList 나 LinkedList에 사용자가 만든 클래스의 객체도 저장 가능


4.Stack

=>마지막에 삽입된 데이터가 먼저 출력되는 자료구조

=>LIFO(Last In First Out)

=>복귀 주소 저장에 이용 : 모바일에서 화면 전환을 할 때 각각의 화면을 Stack에 저장해서 현재 화면에서 뒤로를 할 때 이전 화면으로 넘어갈 수 있도록 해줍니다.

=>웹 브라우저에서 주소 창에 입력한 주소도 스택에 저장됩니다.


E push(E e): 데이터 저장

E pop(): 마지막에 저장된 데이터를 리턴하고 삭제

E peek(): 마지막에 저장된 데이터를 리턴하고 삭제하지 않음

int size(): 저장된 데이터 개수


데이터가 없는데 pop 을 하는 경우를 Underflow

스택에 데이터가 차서 더 이상 삽입할 수 없는데 삽입하는 경우를 Overflow


import java.util.Stack;


public class StackMain {


public static void main(String[] args) {

//실수를 저장하는 Stack 을 생성

Stack<Double>stack = new Stack<Double>();

//Stack에 데이터를 삽입할 때는 push를 이용

stack.push(1.9);

stack.push(2.8);

stack.push(9.8);

//Stack의 모든 데이터 출력하기

//pop을 이용하면 마지막 데이터를 삭제하고 리턴받을 수 

//있습니다.

int size = stack.size();

for(int i=0; i<size; i++){

Double d = stack.pop();

System.out.println(d);

}


}


}


스택은 pop을 하면 저장한 역순으로 리턴됩니다.


5.Queue

=>First In First Out: 먼저 삽입된 데이터가 먼저 출력되는 자료구조

=>스케쥴링에 주로 이용

=>Java에서는 인터페이스라서 직접 객체 생성은 안되고 Queue를 implements 한 LinkedList 나 PriorityQueue 클래스를 이용해서 생성


6.Deque

=>양쪽에서 삽입과 삭제가 가능한 자료구조

=>모바일에서 스크롤 뷰(지도, 테이블, 웹 뷰)에 사용

=>Java에서는 인터페이스라서 직접 객체 생성은 안되고 Deque를 implements 한 ArrayDeque 클래스를 이용해서 생성


**List를 이용한 1-45까지의 숫자 중복없이 입력받아서 저장하기

1.정수를 저장할 수 있는 List 생성

2.6개의 숫자를 입력받아서 List에 저장하고 List의 모든 데이터 출력하기

3.1-45까지만 입력받을 수 있도록 코드 추가

4.중복없이 저장할 수 있도록 코드 추가

5.List의 데이터를 정렬하기


import java.util.ArrayList;

import java.util.Comparator;

import java.util.List;

import java.util.Scanner;


public class LottoList {


public static void main(String[] args) {

//정수를 저장할 수 있는 List 객체 생성

List<Integer> lotto = 

new ArrayList<Integer>();

//1-45까지 중복없이 입력받아서 lotto에 6개 저장

//키보드로부터 입력받을 수 있는 객체 생성

Scanner sc = new Scanner(System.in);

for(int i=0; i<6; i++){

System.out.print("숫자를 입력하세요(1-45):");

//정수 1개를 입력받아서 input에 저장

int input = sc.nextInt();

//1-45사이의 숫자만 저장되도록

if(input < 1 || input > 45){

System.out.println(

"1부터 45사이의 숫자만 입력하세요!!!");

//이번에 수행한 내용은 무효

i = i - 1;

continue;

}

//중복검사

if(i>0){

//중복된 데이터가 있는지 확인하기 위한 변수

boolean flag = false;

for(int j=0; j<= i-1; j++){

//중복된 데이터가 있을 때 변수의 값을 true로 변경

if(input == lotto.get(j)){

flag = true;

break;

}

}

//중복된 값이 있을 때 이번 반복은 무효

if(flag == true){

System.out.println("중복된 숫자는 안됨");

i = i - 1;

continue;

}

}

//input을 List에 저장

lotto.add(input);

}

//사용한 스트림 닫기

sc.close();

//Integer, Double 과 같은 Wrapper 클래스와 String, Date 클래스는

//Comparable 인터페이스를 implements 해서 크기 비교를 compareTo 라는 메소드를 가지고 수행합니다.

//컬렉션의 데이터 크기 비교를 위한 Comparator 만들기

Comparator <Integer> comp = new Comparator<Integer>(){

@Override

public int compare(Integer o1, Integer o2){

return o1.compareTo(o2);

}

};


//lotto 리스트 정렬 - comp를 가지고 비교

lotto.sort(comp);

//데이터 출력

for(Integer imsi : lotto){

System.out.print(imsi + "\t");

}


}


}

 

**Set - 인터페이스

=>데이터를 중복없이 저장하는 자료구조

=>중복된 데이터를 삽입하려고 하면 삽입하지 않습니다.

=>Generic 적용

=>데이터 1개를 가져오는 메소드가 없으므로 빠른 열거 나 iterator를 이용해서 데이터를 가져와야 합니다.

=>toString은 재정의 되어 있어서 toString을 호출하면 각 데이터의 toString을 호출해서 결합한 결과를 리턴합니다.


1.implements 한 클래스

1)HashSet : 데이터의 저장 순서를 알 수 없는 Set

2)LinkedHashSet : 데이터의 저장 순서를 알 수 있는 Set

3)TreeSet : 데이터를 크기 순으로 재배치한 Set, 크기 순으로 배치해야 하기 때문에 저장되는 요소는 반드시 Comparable 인터페이스를 implements 해야 합니다.


2.Method

1)boolean add(E e): e를 삽입하려고 하고 삽입에 성공하면 true 실패하면 false 리턴 - 중복된 데이터를 삽입하려고 하면 false

2)Iterator<E> iterator(): Iterator 리턴

3)int size(): 저장된 데이터 개수 리턴


ex)Set 테스트

import java.util.HashSet;

import java.util.Iterator;

import java.util.LinkedHashSet;

import java.util.Set;

import java.util.TreeSet;


public class SetText {


public static void main(String[] args) {

//Set 객체 만들기 - 문자열

//데이터의 저장 순서를 알 수 없습니다.

//Set<String> set = new HashSet<String>();

//LinkedHashSet : 데이터의 저장순서대로 저장하는 Set

//Set<String> set = new LinkedHashSet<String>();

//TreeSet : 데이터를 크기 순서대로 저장하는 Set

Set<String>set = new TreeSet<String>();

set.add("프로그래밍언어");

set.add("데이터베이스");

//위에 있는 데이터와 동일한 데이터이므로 삽입을 안함

set.add("프로그래밍언어");

set.add("운영체제");

set.add("자료구조");

set.add("알고리즘");

//System.out.println(set.size());

//Set의 모든 데이터 접근 - 빠른 열거 이용

for(String imsi : set){

System.out.print(imsi + "\t");

}

System.out.println();

//Set의 모든 데이터 접근 - Iterator 이용

Iterator<String> iter = set.iterator();

while(true){

if(iter.hasNext() == false){

break;

}

String imsi = iter.next();

System.out.print(imsi + "\t");

}


}


}


ex)숫자를 입력받아서 1-45 사이의 숫자를 중복없이 저장하기 - Set 이용

import java.util.Scanner;

import java.util.Set;

import java.util.TreeSet;


public class LottoSet {


public static void main(String[] args) {

//1-45까지의 숫자 6개를 중복없이 입력받아서 저장

//중복없이 크기 순서대로 정수를 저장하는 Set 을 생성

Set<Integer> lotto = 

new TreeSet<Integer>();

Scanner sc = new Scanner(System.in);

//TreeSet의 데이터 개수가 6개 될 때 까지 작업

while(true){

System.out.print("숫자를 입력(1-45):");

int input = sc.nextInt();

if(input < 1 || input > 45){

System.out.println(

"1-45까지 숫자를 입력하세요");

continue;

}

//데이터 삽입 - 중복된 숫자가 오면 삽입되지 않음

lotto.add(input);

//lotto에 6개가 저장되면 종료

if(lotto.size() == 6){

break;

}

}

//데이터 출력

for(Integer imsi : lotto){

System.out.print(imsi + "\t");

}

sc.close();

}

}


 

'IT > JAVA' 카테고리의 다른 글

10. Java Thread  (0) 2017.11.09
9. Java Map,Set  (0) 2017.11.09
7. Java 유용한 API  (0) 2017.11.09
6. Java 주요 클래스  (0) 2017.11.09
5. Java 상속과 다형성  (0) 2017.11.09
댓글