본문 바로가기

자바

Day11

package com.test2;
import java.util.*;
public class MyVector implements List{
	Object[] data = null; //객체를 담기 위한 객체배열을 선언한다.
	int capacity = 0; // 용량
	int size = 0; // 크기
	public MyVector(int capacity) {
		if(capacity < 0)
			throw new IllegalArgumentException("유효허자 않은 값이다. :"+capacity);
		this.capacity = capacity;
		data = new Object[capacity];
	}
	public MyVector() {
		this(10); //크기를 지정하지 않으면 크기를 10으로 한다. 
	}
    // 최소한의 저장공간(capacity)를 확보하는 메서드
	public void ensureCapacity(int minCapacity) {
		if(minCapacity - data.length > 0) 
			setCapacity(minCapacity);
	}
	public int capacity() {
		return capacity;
	}
	private void setCapacity(int minCapacity) {
		if(this.capacity==capacity) return; //크기가 같으면 변경하지 않는다.
		Object[] tmp = new Object[capacity];
		System.arraycopy(data, 0, tmp, 0, size);
		data = tmp;
		this.capacity =capacity;
	}
	public void trimToSize() {
		setCapacity(size);
	}
	@Override
	public Object[] toArray() {
		Object[] result = new Object[size];
		System.arraycopy(data, 0, result, 0, size);
		return result;
	}
	@Override
	public Object[] toArray(Object[] a) {	return null;	}
	@Override
	public boolean add(Object e) {
    // 새로운 객체를 저장하기 전에 저장할 공간을 확보한다.
		ensureCapacity(size+1);
		data[size++] = e;
		return true;
	}
	@Override
	public boolean remove(Object o) {
		for(int i = 0; i < size; i++) {
			if(o.equals(data[i])) {
				remove(i);				
			}
		}
		return false;
	}
	@Override
	public Object remove(int index) {
		Object oldObj = null;
		if(index < 0 || index >= size) 
			throw new IndexOutOfBoundsException("범위를 벗어났습니다.");
		oldObj = data[index];	
        // 삭제하고자 하는 객체가 마지막 객체가 아니라면, 배열복사를 통해 빈자리를 채워줘야 한다.
		if(index != size-1) {
        //삭제할 데이터의 아래에 있는 데이터를 한 칸씩 위로 복사해서 삭제할 데이터를 덮어쓴다.
			System.arraycopy(data, index+1, data, index, size-index-1);
		}
        // 마지막 데이터를 null로 한다. 배열은 0부터 시작하므로 마지막요소는 index가 size -1이다.
		data[size-1] =null;
        // 데이터가 삭제되어 데이터의 개수가 줄었으므로 size의 값을 1 감소시킨다.
		size--;		
		return oldObj;
	}
	@Override
	public void clear() {
		for(int i = 0; i<size; i++) 
			data[i]	= null;
		size = 0;
	}
	@Override
	public Object get(int index) {
		if(index < 0 || index >= size)
			throw new IndexOutOfBoundsException("범위를 벗어났습니다.");
		return data[index];
	}
    // List인터페이스로부터 상속받은 메서드들
	@Override
	public boolean containsAll(Collection c) {	return false;	}
	@Override
	public boolean addAll(Collection c) {	return false;	}
	@Override
	public boolean addAll(int index, Collection c) {	return false;	}
	@Override
	public boolean removeAll(Collection c) {	return false;	}
	@Override
	public boolean retainAll(Collection c) {	return false;	}
	@Override
	public int size() {	return size;	}
	@Override
	public boolean isEmpty() {	return size == 0;	}
	@Override
	public boolean contains(Object o) {	return false;	}
	@Override
	public Iterator iterator() { return null;	}
	@Override
	public Object set(int index, Object element) {	return null; }
	@Override
	public void add(int index, Object element) {}
	@Override
	public int indexOf(Object o) {	return 0;	}
	@Override
	public int lastIndexOf(Object o) {	return 0;	}
	@Override
	public ListIterator listIterator() {	return null;	}
	@Override
	public ListIterator listIterator(int index) {	return null;	}
	@Override
	public List subList(int fromIndex, int toIndex) {	return null;	}}​
Vector 클래스의 실제코드를 살펴보고 간단하게 예제를 정의 한것이다.
getClass() , getName() ; 자신이 속한 클래스의 class 객체를 반환하는 메서드 / class 객체는 클래스의 모든 정보를 담고 있으며, 클래스당 단 1개만 존재 클래스파일(*class)에 로드될때 메모리에 생성된다
LinkedList : 불연속적으로 존재하는 데이터를 서로 연결(link)한 형태로 구성되어 있다.
링크드 리스트의 각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있다.
컬렉션 읽기(접근시간) 추가/삭제 비고
ArrayList 빠르다 느리다 순차적인 추가삭제는 더빠름.
비효율적인 메모리사용
LinkedList 느리다 빠르다 데이터가 많을수록 접근성이 떨어짐

 

Stack과 Queue: Stack은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last in First out)구조이고,
큐(Queue)는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First in First Out)구조이다
스택의 활용 예 - 수식계산,수식괄호검사,워드프로세서의 undo/redo,웹브라우저의 뒤로/앞으로
큐의 활용 예 - 최근사용문서, 인쇄작업 대기목록, 버퍼

 

package com.test1;
import java.util.*;
public class Sample07 {
	public static void main(String[] args) {
		Stack st = new Stack();
		Queue q = new LinkedList();	// Queue 인터페이스의 구현체인 LinkedList를 사용
		st.push("0"); // Stack에 객체(item)를 저장한다.
		st.push("1");
		st.push("2");		
		q.offer("0"); // 큐에 객체를 저장,성공하면 true,실패하면 false를 반환
		q.offer("1");
		q.offer("2");		
		System.out.println("=stack=");
		while(!st.empty()) {
			System.out.println(st.pop()); // stack의 맨 위에 저장된 객체를 꺼낸다.
		}
		System.out.println("=Queue");
		while(!q.isEmpty()) {
			System.out.println(q.poll()); //큐에서 객체를 꺼내서 반환, 비어있으면 null을 반환
		}
	}
}

 

'자바' 카테고리의 다른 글

Day13  (0) 2021.05.21
Day12  (0) 2021.05.20
Day10-1  (0) 2021.05.17
2주차 은행 계좌 예제 수정  (0) 2021.05.16
Day09  (0) 2021.05.14