수업끄적끄적_7MONTH/Java

12/04 수업 (23일차) _ Vector / Stack & Queue / LinkedList

개미의 베짱이 2023. 12. 4. 14:27

** 예제 1204 (Vector) **

package etc;

import java.util.Vector;

public class MySample1204 {

	public static void main(String[] args) {
		// 벡터
		Vector v = new Vector(5);
		v.add("1");
		v.add("2");
		v.add("3");
		print(v);
		
		//빈 공간 없애기.(용량과 크기가 같게)
		v.trimToSize();
		System.out.println("v.trimToSize()...");
		print(v);
		
		//벡터 용량 증가
		v.ensureCapacity(6);
		System.out.println("v.ensureCapacity...");
		print(v);
		
		v.setSize(7);	//총 7개 중 3개가 이미 값이 있으므로 4개는 null로 채움
		System.out.println("v.setSize()...");
		print(v);		//6개를 다사용해서 2배로늘어난다. -> capacity : 12
		
		//벡터의 data만 삭제됨. 기존 벡터의 size는 유지.
		v.clear();
		System.out.println("v.clear()...");
		print(v);
	}

	public static void print(Vector v) {
		System.out.println(v);
		System.out.println("size : " + v.size());
		System.out.println("capacity : " + v.capacity());		
	}
}



** Stack / Queue **

- 스택은 마지막에 저장한 데이터를 가장먼저 꺼내게 되는  LIFO(Last In First Out)

- 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)

- 큐는 인터페이스 -> 큐를 상속받은 LinkedList클래스

Stack 메소드 설 명
boolea empty() Stack이 비어 있는지 알려줌
Object peek() Stack 의 맨 위에 저장된 객체 반환  //다음주소값이 null이면 가장 위에있는 객체
Object pop() 맨 위에 저장된 객체를 꺼낸다.
Object push(Object item) Stack 에 객체를 저장
int search(Object o) 주어진 객체를 찾아 위치를 반환, 실패시 -1반환(위치는 1부터 시작)

 

Queue 메소드 설 명
boolean add(Object o) Queue에 추가 (성공하면 true)반환
Object remove() Queue 에서 객체를 꺼내 반환
Object element() 삭제없이 요소를 읽어옴
boolean offer(Object o) 객체를 저장. 성공하면  true
Object poll() 객체를 꺼내서 반환 (비어있으면 null반환)
Object peek() 삭제없이 욧를 읽어옴 (비어있으면 null반환)

 

 

** LinkedList 생성자와 메소드 **

생성자 또는 메소드 설 명
LinkedList(); LinkedList 객체생성
boolean add(Object) 지정된 객체를 LinkedList끝에 추가, 성공 true 실패false
void add(int index, Object element) 지정된 위치에 객체 추가
boolean addAll(int index, Collection c) 지정된 위치에 주어진 컬렉션에 포함된 모든 요소를추가, 성공 true 실패false
boolean contains(Object o) 지정된 객체가 LinkedList에 포함되었는지 알려줌
boolean containsAll(Collection o) 지정된 컬렉션의 모든 요소가 포함되었는지 알려줌
Object get(int index) 지정된 위치의 객체를 반환
boolean isEmpty() LinkedList가 비어 있는지 알려줌. 비어있으면 true
boolean remove (Object o) 지정된 객체 제거, 성공 true 실패false
int size() LinkedList에 저장된 객체 수 반환
boolean retainAll(Collection c) 지정된 컬렉션의 모든 요소가 포함되어 있는지 확인
Object set(int index, Object element) 지정된 위치에 객체를 주어진 객체로 바꿈

 


** 예제 MySample1204_2 **

package etc;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class MySample1204_2 {

	public static void main(String[] args) {
		// Stack / Queue
		Stack st = new Stack();
		Queue  q = new LinkedList();		//Queue인터페이스의 구혀네인 LinkedList사용
		
		st.push("0");
		st.push("1");
		st.push("2");
		
		q.offer("3");
		q.offer("4");
		q.offer("5");
		
		System.out.println("Stack()------------");
		while(!st.empty()) {
			System.out.println(st.pop());
		}
		
		System.out.println("Queue()------------");
		while(!q.isEmpty()) {
			System.out.println(q.poll());
		}
	}
}

** 예제 MySample1204_3 **

package etc;

import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class MySample1204_3 {

	public static void main(String[] args) {
		// ArrayList 와 LinkedList비교 (시간)
		ArrayList a = new ArrayList(2000000);
		LinkedList t = new LinkedList();
		
		System.out.println("순차적으로 추가...");
		System.out.println("ArrayList : " + add1(a));
		System.out.println("LinkedList : " + add1(t) + "\n");
		
		System.out.println("중간에 추가...");
		System.out.println("ArrayList : " + add2(a));
		System.out.println("LinkedList : " + add2(t) + "\n");
		
		System.out.println("중간 삭제...");
		System.out.println("ArrayList : " + remove2(a));
		System.out.println("LinkedList : " + remove2(t) + "\n");
		
		System.out.println("순차적으로 삭제...");
		System.out.println("ArrayList : " + remove1(a));
		System.out.println("LinkedList : " + remove1(t) + "\n");
	}
	
	//순차적으로 추가 
	public static long add1(List list) {			//모든클래스의 부모인 List로 매개변수 받음
		long start = System.currentTimeMillis();	//현재 시간을 밀리세컨드단위
		
		for(int i = 0 ; i < 1000000 ; i++) {
			list.add(i + "");
		}
		
		long end = System.currentTimeMillis();
		return end - start;
	}
	
	//중간에 추가
	public static long add2(List list) {
		long start = System.currentTimeMillis();
		
		for(int i = 0 ; i < 1000 ; i++) {
			list.add(500, "X");
		}
		
		long end = System.currentTimeMillis();
		return end - start;
	}
	
	//순차적으로 삭제
	public static long remove1(List list) {
		long start = System.currentTimeMillis();
		
		for(int i = list.size()-1 ; i >= 0 ; i --) {
			list.remove(i);
		}
		
		long end = System.currentTimeMillis();
		return end - start;
	}
	
	//중간 삭제
	public static long remove2(List list) {
		long start = System.currentTimeMillis();
		
		for(int i = 0 ; i < 10000 ; i++) {
			list.remove(i);
		}
		
		long end = System.currentTimeMillis();
		return end - start;
		
	}	
}

 

결론 :  순차적으로 추가/삭제하는 것은 ArrayList가 LinkedList 보다 빠르다.

결론 : 중간 데이터를 추가/삭제하는 것은 LinkedList가 ArrayList보다 빠르다.

 


** 예제 MySample1204_4 **

package etc;

import java.io.File;
import java.io.IOException;

public class MySample1204_4 {

	public static void main(String[] args) throws IOException {
		// File 클래스
		
		//절대경로와 상대경로
		File directory = new File("./tmep");		//상대경로 (./temp -> 상대경로의미) | ./ -> 현재디렉토리(.) 아래에있는(/) temp 라는 의미.
		//File directory = new File("C:\\project\\JAVA\\MyProject\\temp");	//절대경로(풀경로를 다적어준다.)
		directory.mkdir();		//디렉토리 생성
		
		//temp디렉토리에 temp_file.txt 파일 생성
		File file = new File(directory, "temp_file.txt");	//아직 파일이 만들어지지 않음.
		file.createNewFile();
		
		//생성file 객체가 디렉토리인지 파일인지 확인
		if(directory.isDirectory()) {
			System.out.println(directory.getName() + "은 디렉토리 입니다.");
		}
		
		if(file.isFile()) {
			System.out.println(file.getName() + "은 파일입니다.");
			System.out.println("파일 경로 : " + file.getPath());
			System.out.println("파일 크기 : " + file.length() + "(bytes)");
			
			System.out.println("쓰기 가능 여부 : " + file.canWrite());
			System.out.println("읽기 가능 여부 : " + file.canRead());
		}
		
		//파일 삭제
		if(file.delete()) {
			System.out.println(file.getName() + "이 삭제되었습니다.");
			
		}
		
		//디렉토리 삭제
		if(directory.delete()){
			System.out.println(directory.getName() + "디렉토리가 삭제되었습니다.");
		}
	}
}

** 예제 MySample1204_5 **

package etc;

import java.io.File;
import java.util.Scanner;
import java.io.IOException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.BufferedWriter;

public class MySample1204_5 {

	public static void main(String[] args) throws IOException {
//		// File객체를 이용하여 Scanner생성
//		File file = new File("./temp/source_data.txt");
//		
//		Scanner scn = new Scanner(file);
//		
//		//파일의 내용을 라인 단위로 출력
//		System.out.println(file.getName() + "파일의 데이터 내용.");
//		
//		while(scn.hasNextLine()) {
//			System.out.println(scn.nextLine());
//		}
//		
//		scn.close();	//->파일은 사용하고나면 닫아줘야한다.
		
		
//		//BufferedReader 이용
//		File file = new File("./temp/source_data.txt");
//		FileReader reader = new FileReader(file);
//		BufferedReader buffReader = new BufferedReader(reader);
//		
//		//파일 내용을 라인 단위로 출력
//		System.out.println(file.getName() + "파일 데이터 내용.");
//		String data = null;
//		
//		while((data = buffReader.readLine()) != null) {
//			System.out.println(data.toString());
//		}
//		
//		//입력스트림 종료
//		reader.close();
//		buffReader.close();
		
		
		String filePath = "./temp/source_data.txt";
		
		File file = new File(filePath);
		if(!file.exists()) {		//파일의 존재하는지 확인 후 해당파일이 없는경우 파일생성
			file.createNewFile();	//신규생성
		}
		
		//BufferedWriter 생성
		BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
		
		//파일에 쓰기
		writer.newLine();
		writer.write("앗 월요일이다.");
		writer.newLine();
		writer.write("즐거운 점심시간입니다.");
		writer.newLine();
		
		//버퍼 및 스트림 정리
		writer.flush();		//버퍼에 남은 데이터를 모두 쓰기
		writer.close();		//스트림 종료
	}
}