📚 Study/Java

JAVA :: Test158~162_컬렉션 프레임워크(Collection Framework)_벡터(Vector)

bono-hye 2023. 9. 24. 23:05

▼ Vector에 대한 설명 ①

/*
○ Vector (벡터)

   자바의 자료구조 기능을 제공하는 클래스들 중 가장 기본적인 클래스로
   배열과 비슷하지만, 배열과 달리 다른 종류의 데이터 형을 가진
   데이터 요소들을 가질 수 있으며, 데이터가 가득 차면 자동으로 저장 영역을
   확장시키게 된다.

   또한, 객체 레퍼런스를 저장하기 때문에
   JDK 1.5 이전에는 자바 기본형 데이터는 저장할 수 없었으나
   JDK 1.5 이후부터는 오토박싱 / 오토언박싱 기능이 지원되면서
   기본 데이터형도 저장할 수 있게 되었다.

   벡터 클래스의 기본 구조는
   시퀀스(Sequence) 데이터 구조에 기반하며
   시퀀스 데이터 접근을 순차적인 인덱스 값에 대한 위치로 접근하게 된다.
   따라서 자료구조의 양 끝단에서만 접근이 가능한 큐나
   한쪽 끝에서만 접근이 가능한 스택과 달리
   시퀀스 개념의 인덱스 값을 이용하여 자료구조의 임의의 지점에서
   저장 및 접근이 가능하다.

   벡터의 시퀀스 구조는
   List 인터페이스를 통해 제공받고 있기 때문에
   List 인터페이스의 모든 메소드를 사용할 수 있다.
	

   - void add(int index, E element)
   - void insertElementAt(E obj, int index)
     주어진 위치에 객체를 저장한다.
	 주어진 위치의 객체부터 오른쪽으로 하나씩 이동한다.

   - void addElement(E obj)
   - boolean add(E e)
     객체를 벡터 끝에 추가한다.

   - void removeElementAt(int index)
   - E remove(int index)
     주어진 위치의 객체를 제거한다.
	 제거 후 주어진 위치 다음의 객체부터 하나씩 왼쪽으로 이동한다.
	 E remove(int index) 메소드는 저장되었던 객체를 반환한다.

   - boolean removeElement(Object obj)
   - boolean remove(Object obj)
     대상 객체를 제거한다.
	 제거 후 주어진 위치 다음의 객체부터 하나씩 왼쪽으로 이동한다.
	 객체가 정상적으로 제거되었으면 true를 반환한다.

   - void removeAllElement()
   - void clear()
     벡터의 모든 요소를 제거한다.

   - void setElementAt(E obj, int index)
   - E set(int index, E element)
     벡터의 index 위치에 주어진 객체를 저장한다.
	 주어진 위치에 저장되어 있던 객체는 소멸한다. (→ 덮어쓰기 개념)

   - E elementAt(int index)
   - E get(int index)
     주어진 위치에 저장된 객체를 반환한다.

   - Enumeration<E> elements()
	 벡터의 모든 요소를 반환한다.

   - int indexOf(Object o)
     주어진 객체가 저장된 위치를 반환한다.
	 존재하지 않을 경우 『음수』를 반환한다.
 
   - int indexOf(Object o, int index)
     주어진 객체가 저장된 위치를 index 위치부터 찾아서 반환한다.
	 여기서 index  위치는 스캔을 시작하는 위치

   - boolean contains(Object o)
     벡터가 주어진 객체를 포함하고 있는지의 여부를 반환한다.

   - void ensureCapacity(int minCapacity)
     벡터의 용량을 주어진 크기보다 크도록 조절한다.
	 (주어진 크기를 수용할 수 있도록 조절한다.)

  - E firstElement()
    벡터의 첫 번째 요소의 데이터를 반환한다.

  - E lastElement()
    벡터의 마지막 요소의 데이터를 반환한다.
  
  - void setSize(int newSize)
    벡터의 크기를 조절한다.
	만약 주어진 크기가 현재 크기보다 작다면 나머지는 버린다.
	반대로 주어진 크기가 현재 크기보다 크다면
	빈 공간은 null 객체로 채우게 된다.
	(객체를 참조하지 않음을 의미)

  - int capacity()
    현재 벡터의 용량을 반환한다.

  - int size()
    현재 벡터에 저장된 객체의 갯수(size)를 반환한다.

  - trimToSize()
    벡터의 용량을 저장된 객체의 갯수에 맞도록 최소화한다.

*/

▼ Test158_Vector 기초 ① (Iterator, addElement, firstElement, get, elementAt, lastElement, hasNext, next)

import java.util.Vector;
import java.util.Iterator;

public class Test158
{
	// 정적 문자열 배열 선언 및 초기화
	private static final String[] colors = {"검정", "노랑", "초록", "파랑", "연두"};
	
	public static void main(String[] args)
	{
		int i;
		String str;
		
		// Vector(벡터) 자료구조 v 생성
		Vector<Object> v = new Vector<Object>();
		
		// v 라는 벡터 자료구조에 colors 배열에 담겨있는 데이터 담아내기
		// add()
		
		for (i=0; i<colors.length; i++)
			v.add(colors[i]);
		
		// addElement()
		v.addElement("하양");
		
		// firstElement()
		str = (String)v.firstElement();
		System.out.println("첫 번째 요소 : " + str);
		//--==>> 첫 번째 요소 : 검정
		
		// get()
		str = (String)v.get(1);
		System.out.println("두 번째 요소 : " + str);
		//--==>> 두 번째 요소 : 노랑
		
		// get
		str = (String)v.get(0);
		System.out.println("첫 번째 요소 : " + str);
		//--==>> 첫 번째 요소 : 검정
		
		// elementAt()
		str = (String)v.elementAt(1);
		System.out.println("두 번째 요소 : " + str);
		//--==>> 두 번째 요소 : 노랑
		
		// lastElement()
		str = (String)v.lastElement();
		System.out.println("마지막 요소 : " + str);
		//--==>> 마지막 요소 : 연두
		
		// ※ addElement 활용하여 요소 추가 후 다시 확인
		//--==>> 마지막 요소 : 하양
		
		// ※ 벡터 자료구조에 요소 추가 시(→ add() / addElement())
		//   인덱스 마지막(가장 끝)의 위치에 추가되는 것을 확인할 수 있다.
		
		// 전체 요소 출력
		// 『Iterator(이터레이터 or 아이터레이터)』
		// 『hasNext()』 : 다음 데이터 요소가 있는지 없는지의 여부를 확인
		// 『next()』	 : 다음 데이터 요소를 직접적으로 반환
		
		Iterator<Object> it = v.iterator();
		
		while (it.hasNext())
		{
			str = (String)it.next();		// true true ... true true false	// str은 스트링, it는 오브젝트니까 String으로 형 변환
			System.out.print(str + " ");	// 검정 노랑 ... 연두 하양					
		}
		System.out.println();
		
		/*
		                      ▼
		------------------------
		검정 노랑 초록 파랑 연두 하양 
		------------------------
		*/
			
	}
}

▼ Vector에 대한 설명 ② (Vector 자료구조 생성)

/*
Vector v = new Vector();
비어있는 Vector 자료구조 v 생성

Vector v = new Vector(8);
8개의 초기 elements를 가진 Vector 자료구조 v 생성
이 자료구조를 활용하는 과정에서
8개가 모두 채워지게 되면(모두 사용되어 모자라게 되면) 자동으로 확장된다.

Vector v = new Vector(3, 5);
3개의 초기 elements 를 가진 Vector 자료구조 v 생성
이 자료구조를 활용하는 과정에서
3개가 모두 채워지게 되면(모두 사용되어 모자라게 되면) 자동으로 5개 증가(확장)된다.

※ 벡터는 데이터 요소로 정수형, 실수형, 문자열... 등을
  담아내는 것이 가능하다.(→ 가능해졌다.)
  → 데이터 안정성 확보 check~!!!!
  */

▼   Test159_Vector 기초 ② (벡터 자료구조에 자료형 저장)

import java.util.Vector;
import java.util.Iterator;

// MyVector 클래스 설계 → Vector 클래스 상속
class MyVector extends Vector<Object>
{
	// 생성자 → 사용자 정의 생성자
	MyVector()
	{
		// Vector(슈퍼 클래스) 생성자 호출
		// super();
		// → Vector();
		super(1, 1);
		//-- 첫 번째 인자 : 주어진 용량
		//   두 번째 인자 : 증가량
	}
	
	void addInt(int i)
	{
		addElement(new Integer(i));
	}
	
	void addFloat(float f)
	{
		addElement(new Float(f));
	}
	
	void addString(String s)
	{
		addElement(s);
	}
	
	void addCharArray(char[] a)
	{
		addElement(a);
	}
	
	void addObject(Record rec)
	{
		addElement(rec);
	}
	
	void write()
	{
		/*
		Iterator<Object> it = iterator();
		
		while (it.hasNext())
			System.out.println(it.next());
				
	//--==>> 5
	//		 3.14
	//		 안녕하세요
	//		 [C@6b95977
	*/
		
		/*
		Object o;
		int length = size();		// super.size(), this.size() 다 된다!
		
		System.out.println("벡터 요소의 갯수 : " + length);
		//--==>> 벡터 요소의 갯수 : 4
		
		for (int i=0; i<length; i++)
		{
			o = elementAt(i);
			System.out.println(o);
		}
		//--==>> 5
		//		 3.14
		//	 	 안녕하세요
		//		 [C@18b4aac2
		 */
		
		//  『instanceof』 연산자	check~!!!
		//-- 처리해야 하는 대상의 객체 타입 확인
		
		Object o;
		int length = size();
		
		System.out.println("벡터 요소 갯수 : " + length);
		
		for (int i=0; i<length ; i++)
		{
			o = elementAt(i);
			/*
			if (o instanceof char[])
				System.out.println("문자배열");
			else
				System.out.println("다른형태");
			*/
			
			if (o instanceof char[])
				// System.out.println("문자배열");
				System.out.println("문자배열 : " + String.copyValueOf((char[])o));
			else if (o instanceof String)
				System.out.println("문자열 : " +o.toString());
			else if (o instanceof Integer)
				System.out.println("정수형 : " + o);
			else if (o instanceof Float)
				System.out.println("실수형 : " + o);
			else
				System.out.println("타입 확인 요망~!!!");
			
		}
	}
		
		
}
public class Test159
{
	public static void main(String[] args)
	{
		// MyVector 클래스 기반 인스턴스 생성
		MyVector v = new MyVector();
		
		// 주요 변수 선언 및 초기화
		int digit = 5;
		float real = 3.14f;
		String s = new String("안녕하세요");
		char[] letters = {'s', 't', 'u', 'd', 'y'};
		
		v.addInt(digit);			//-- 벡터 자료구조에 정수 저장
		v.addFloat(real);			//-- 벡터 자료구조에 실수 저장
		v.addString(s);				//-- 벡터 자료구조에 문자열 저장
		v.addCharArray(letters);	//-- 벡터 자료구조에 문자 배열 저장
		
		v.write();
	}
}
// 실행 결과
/*
정수형 : 5
실수형 : 3.14
문자열 : 안녕하세요
문자배열 : study
 */

▼ Test160 (요소 변경(set), 오름차순 정렬(Collections.sort(), 검색(Collections.binarySearch), 내림차순 정렬(Coeections.srt(v, Collections.reverseOrder()))

import java.util.Vector;
import java.util.Collections;

public class Test160
{
	// 정적 문자열 배열 선언 및 초기화
	private static final String[] colors = {"검정", "노랑", "초록", "파랑", "빨강", "연두"};
			
	public static void main(String[] args)
	{
		// 벡터 자료구조 생성
		Vector<String> v = new Vector<String>();
		
		// 벡터 자료구조 v에 colors 배열 데이터를 요소로 추가
		for (String color : colors)
			v.add(color);
		System.out.println("첫 번째 요소 : " + v.firstElement());
		System.out.println("두 번째 요소 : " + v.get(1));
		System.out.println("마지막 요소 : " + v.lastElement());
		System.out.println("요소의 갯수 : " + v.size());
		//--==>> 첫 번째 요소 : 검정
		//		 두 번째 요소 : 노랑
		//		 마지막 요소 : 연두
		//		 요소의 갯수 : 6
		
		// ○ 첫 번째 요소를 "하양"으로 변.경. → set()
		v.set(0, "하양");
		
		System.out.println("첫 번째 요소 : " + v.firstElement());
		System.out.println("두 번째 요소 : " + v.get(1));
		System.out.println("요소의 갯수 : " + v.size());
		//--==>> 첫 번째 요소 : 하양
		//		 두 번째 요소 : 노랑
		//		 요소의 갯수 : 6
		
		// ○ 첫 번째 요소에 "주황"을 추.가. → insertElementAt()
		v.insertElementAt("주황", 0);
		
		// ○ 전체 출력
		System.out.print("전체 출력 : ");
		for (String str : v)
			System.out.print(str + " ");
		System.out.println();
		//--==>> 전체 출력 : 주황 하양 노랑 초록 파랑 빨강 연두 
		
		// ○ 오름차순 정렬
		Collections.sort(v);
		
		// ○ 오름차순 정렬 후 전체 출력
		System.out.print("오름차순 정렬 후 전체 출력 : ");
		for (String str : v)
			System.out.print(str + " ");
		System.out.println();
		//--==>> 오름차순 정렬 후 전체 출력 : 노랑 빨강 연두 주황 초록 파랑 하양 
		
		// ○ 검색
		// Collections.binarySearch();
		// 검색 기능 수행.
		// 단, 오름차순 정렬이 수행되어 있는 자료에 대해서만 사용이 가능하다. check~!!!
		// 검색 결과가 존재하지 않을 경우 음수를 반환한다.
		
		int idxBlue = Collections.binarySearch(v, "파랑");
		System.out.printf("파랑 : %d번째 인덱스에 위치하고 있다.\n", idxBlue);
		//--==>> 파랑 : 5번째 인덱스에 위치하고 있다.
		
		int idxPink = Collections.binarySearch(v, "분홍");
		System.out.printf("분홍 : %d번째 인덱스에 위치하고 있다.\n", idxPink);
		//--==>> 분홍 : -2번째 인덱스에 위치하고 있다.
		//		→ 즉, 분홍은 v에 존재하지 않는다.
		
		// ○ 내림차순 정렬
		Collections.sort(v, Collections.reverseOrder());
		
		// ○ 내림차순 정렬 후 전체 출력
		System.out.print("내림차순 정렬 후 전체 출력 : ");
		for (String str : v)
			System.out.print(str + " ");
		System.out.println();
		//--==>> 내림차순 정렬 후 전체 출력 : 하양 파랑 초록 주황 연두 빨강 노랑 
		
		// ※ 내림차순 정렬 후 검색 테스트
		idxBlue = Collections.binarySearch(v, "파랑");
		System.out.printf("파랑 : %d번째 인덱스에 위치하고 있다.\n", idxBlue);
		System.out.println();
		//--==>> 파랑 : -8번째 인덱스에 위치하고 있다.		서치메소드는 오름차순 정렬에서만 자료에 대한 검색이 가능하다.
		
		// ※ 내림차순 정렬 후 검색 테스트
		idxBlue = Collections.binarySearch(v, "파랑", Collections.reverseOrder());
		System.out.printf("파랑 : %d번째 인덱스에 위치하고 있다.\n", idxBlue);
		//--==>> 파랑 : 1번째 인덱스에 위치하고 있다.
		
	}
}

▼ Test161_검색 및 삭제(indexOf(), remove())

// 검색 및 삭제

import java.util.Vector;

public class Test161 {
// 정적 문자열 배열 선언 및 초기화
    private static final String[] colors = {"검정", "노랑", "초록", "파랑", "빨강", "연두"};

    public static void main(String[] args)
    {
        // 벡터 자료구조 생성
        Vector<String> v = new Vector<String>();

        // 벡터 자료구조 v에 colors 배열 데이터를 요소로 추가
        for (String color : colors)
            v.add(color);

        // 벡터 자료구조 v 의 전체 요소 출력
        for (String str : v)
            System.out.print(str + " ");
        System.out.println();
        //--==>> 검정 노랑 초록 파랑 빨강 연두

        String s1 = "분홍";

        // indexOf();
        int i = v.indexOf(s1);
        System.out.println(s1 + " → index 위치 : " + i);
        System.out.println();
        //--==>>분홍 → index 위치 : -1

        String s2 = "노랑";

        // 『v.contains(s)』
        //-- 벡터 자료구조 v에 찾고자 하는 s가 포함되어 있는지의 여부
        // → 포함되어 있다면 index 위치 확인
        if (v.contains(s2))
        {
            i = v.indexOf(s2);
            System.out.println(s2 + " → index 위치 : " + i);

            // ① 존재하는지의 여부를 확인하고
            // ② 존재한다면 어디에 있는지 확인하고
            // ③ 확인한 위치의 요소를 제거해라 (삭제해라)
            v.remove(i);
        }
        System.out.println();
        //--==>> 노랑 → index 위치 : 1

        // 찾아서 삭제한 후 전체 요소 출력
        System.out.print("삭제 후 전체 요소 출력 : ");
        for (String str : v)
            System.out.print(str + " ");
        System.out.println();
        //--==>> 삭제 후 전체 요소 출력 : 검정 초록 파랑 빨강 연두

        System.out.println(v);
        //--==>> [검정, 초록, 파랑, 빨강, 연두]

        // ※ 점검 확인용 더미 데이터는
        //   실제 요소(데이터)가 아니기 떄문에
        //   이를 활용하여 연산을 진행하고 처리해서는 안된다.  check~!!!
    }
}

▼ Test162 (★★★★★★★중요★★★★★★★)

/*==================================
  ■■■ 컬렉션 (Collection) ■■■
===================================*/
//★★★★★★★★★★★★★★★Test162 중요!!!★★★★★★★★★★★★★★★★★★★★★★★★★★★
// 자료구조 객체 선언 및 생성 시
// 사용자 정의 클래스 활용
// → 자료형

import java.util.Vector;

// 클래스 → 사용자 정의 자료형으로 활용
class MyData
{
    // 주요 속성 구성 → 주요 변수 선언(멤버 변수)
    private String name;    //-- 이름
    private int age;        //-- 나이

    // getter → getXxx()
    // setter → setXxx()

    // getter → setter 구성
    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    // 생성자 → 사용자 정의 생성자(매개변수 2개인 생성자
    public MyData(String name, int age)
    {
        this.name = name;
        this.age = age;
    }

    // ※ 사용자 정의 생성자가 구성될 경우
    //   default 생성자가 자동으로 삽입되지 않기 때문에
    //   default 생성자 형태의 생성자를 사용자 정의 생성자로
    //   추가 구성하게 되는 것이 일반적인 클래스 설계 과정
    //   (반드시 설계해야 한다는 문법적인 규칙은 없다.)

    // 생성자 → 사용자 정의 생성자(매개변수 없는 생성자)
    public MyData()
    {
        // this("", 0);     // 아래 2줄이랑 같은 코드
        name = "";
        age = 0;
    }
}
public class Test162 {
    public static void main(String[] args)
    {
        // 벡터 자료구조 생성
        Vector<MyData> v = new Vector<MyData>();            // MyData 타입은 요소만 취할거야

        // 벡터 자료구조 v에
        // 홍길동 73세 / 김영희 7세 / 김철수 3세
        // 담아내기

        // ①
        /*
        MyData st1 = new MyData();
        st1.setName("홍길동");
        st1.setAge(73);
        v.add(st1);

        MyData st2 = new MyData();
        st2.setName("김영희");
        st2.setAge(7);
        v.add(st2);

        MyData st3 = new MyData();
        st3.setName("김철수");
        st3.setAge(3);
        v.add(st3);
         */

        // ②
        /*
        MyData st1 = new MyData("홍길동", 73);
        v.add(st1);
        MyData st2 = new MyData("김영희", 7);
        v.add(st2);-
        MyData st3 = new MyData("김철수", 3);
        v.add(st3);
         */

        // ③
        v.add(new MyData("홍길동", 73));
        v.add(new MyData("김영희", 7));
        v.add(new MyData("김철수", 3));

        // ①
        for (MyData obj : v)
            System.out.printf("이름 : %s, 나이 : %d세\n", obj.getName(), obj.getAge());
        System.out.println();
        //--==>> 이름 : 홍길동, 나이 : 73세
        //       이름 : 김영희, 나이 : 7세
        //       이름 : 김철수, 나이 : 3세

        // ②
        for (int i = 0; i < v.size(); i++)
            System.out.printf("이름 : %s, 나이 : %d세\n", v.elementAt(i).getName(), v.elementAt(i).getAge());
        System.out.println();

        // ③
        for (int i = 0; i < v.size(); i++)
            System.out.printf("이름 : %s, 나이 : %d세\n", v.get(i).getName(), v.get(i).getAge());
        System.out.println();

        // ④
        for (Object obj : v)
            System.out.printf("이름 : %s, 나이 : %d세\n", ((MyData)obj).getName(), ((MyData)obj).getAge());
        System.out.println();
    }
}