[JAVA]21일차(컬렉션 프레임워크(Collection Framework)/Vecotr(벡터))

정효진·2021년 8월 12일
0

Developer Study

목록 보기
38/47
post-thumbnail

8월12일(목)

Test152~Test159

◼ Vecotr(벡터)

//배열을 떠올리고 배열의 제한사항 2개가 허물어져 있다고 생각하면됨! 
//배열의 같은요소로 구성해야한다는 제한사항이 있었는데 벡터는 상관없음
// 배열은 크기가 정해져 있는데 벡터는 길기가 변할 수 있다.

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

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

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

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

▪ Vecotr(벡터) 메소드

  • void add(int index, E element) // add랑 insertElementAt은 매개변수 넣는 위치 반대!!check~!!

  • 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 remone(Objext 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 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)를 반환한다.

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

▪ 벡터 코드 설명📝

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

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

	public static void main(String[] args)
	{
		int i;
		String str;

		//Vector(벡터) 자료구조 v 생성
		Vector<Object> v = new Vector<Object>();

		// v 라는 Vector(벡터) 자료구조에
		// color 배열에 담겨있는 데이터 담아내기
		// add()
		for (i=0; i<colors.length; i++)
		{
			v.add(colors[i]);
		}

		// 데이터(요소) 추가
		// v.addElement()
		v.addElement("하양");  //가장 뒤에 추가됨!
		

		// firstElement()
		str = (String)v.firstElement();
		System.out.println("첫 번째 요소 : " + str);
		//--==>> 첫 번째 요소 : 검정

		// get()  두번째 요소를 꺼내는 메소드는 없기때문에1
		str = (String)v.get(1);  // v.get(0) 1번째요소 ~~
		System.out.println("두 번째 요소 : " + str);
		//--==>> 두 번째 요소 : 노랑

		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);
		//--==>> 마지막 요소 : 연두

		// ※ 데이터 요소 추가 후 
		//--==>> 마지막 요소 : 하양

		// ※ 벡터 자료구조에 요소 추가시(→ add() / addElement())
		//		인덱스 마지막(가장 끝)의 위치에 추가되는 것을 확인할 수 있다.

		// 전체 요소 출력 → 전체 요소 접근 → check~!!!
		// 『Iterator(이터레이터 or 아이터레이터)』를 통해 전체 요소에 순차적 접근
		//  util패키지에 있음~!!
		//  『hasNext()』 :  다음 데이터 요소가 있는지의 여부를 확인하여 반환
		//  『next()』    :  다음 데이터 요소를 직접적으로 반환

		Iterator<Object> it = v.iterator();

		while (it.hasNext())
		{
			str = (String)it.next();
			System.out.print(str +  " ");
		}
		System.out.println();
		//--==>> 검정 노랑 초록 파랑 빨강 연두 하양

	}
}

『Iterator(이터레이터 or 아이터레이터)』

util패키지에 있음~!!

  • 『hasNext()』 : 다음 데이터 요소가 있는지의 여부를 확인하여 반환
  • 『next()』 : 다음 데이터 요소를 직접적으로 반환

▪ .copyValueOf((char[])o))사용 벡터 코드 설명📝

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

class MyVector extends Vector<Object>	// <Object>형태로 상속받을때 <Object>를 붙인다.

{
	// 생성자
	MyVector()
	{
		//--Vector(1,1) : 부모 생성자에 두 개의 매개변수를 넣음 (슈퍼 클래스)
		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 write()
	{

		Object o;
		int length = size();
		System.out.println("벡터의 요소 갯수 : " + length);



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

			o = elementAt(i);   //elementAt(0) : 0번째꺼 가지고 오겠다!

			// 『instanceof』 연산자    check~!!!
			//-- 처리해야 하는 대상의 객체 타입 확인  // 오브젝트는 오브젝트인데 무슨 타입이니?


			if (o instanceof String)	//-- o가 String타입인지 확인하는 연산자
			{
				System.out.println("문자열 : " + o.toString());
			}

			else if (o instanceof Integer)
				  // ------------ o 가 인티저타입으로 만들어진 객체(오브젝트)   백터는 기본자료형은 취할 수 없음!
			{

			System.out.println("정수형 : " + o);
										  //--- 객체를 출력하면 클래스명@해시코드가 나옴 근데 왜 잘나와? (오토박싱)
										  //  모르겠으면 래퍼클래스 가서 다시 복습하자!
			}

			else if (o instanceof Float)
			{
				System.out.println("실수형 : " + o);
			}
			else if (o instanceof char[])     //캐릭터타입은 래퍼클래스가아니기때문에 오토박싱 안댄다.
			{
				/* 이러면 너무너무 복잡 그래서 밑에처럼
				for (int i; i<(char[])o.length; i++)
				{
					System.out.println(((char[])o)[i]);
				}
				*/
				
				// System.out.println("문자배열 : " + o);
				// System.out.println("문자배열 : " + o.toString());
				//System.out.println("문자배열 : " + String.copyValueOf(문자배열);
				//System.out.println("문자배열 : " + String.copyValueOf({'s','t','u','d','y'});
				System.out.println("문자배열 : " + String.copyValueOf((char[])o));	//check~!!!
												//       ------------ char 배열값을 연결해 문자열로 반환

												//객체를 출력하면 클래스명@해시코드가 나옴
			}
			else
			{
				System.out.println("타입 확인 불가~!!!");
			}

		}
		//--==>> 벡터의 크기 : 4
		//       정수형 : 5
		//       실수형 : 3.14
		//       문자배열 : 안녕하세요
		//       문자배열 : study



		//-------------------------------------------------------------------------

		System.out.println();

		Iterator<Object> it = this.iterator();	//<Object> 확인
		while (it.hasNext())
		{
			System.out.println(it.next());
		}

		//--==>> 5
		//       3.14
		//       안녕하세요
		//       [C@6d06d69c           //--> 이게 문제 그래서 위에 만듬

	}

}



public class Test155
{
	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();
		//--==>> 벡터 요소 개수 : 0
	}

	
}

▪ 벡터 추가, 변경, 정렬, 검색 코드 설명📝

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

public class Test156
{

	// 정적 문자열 배열 선언 및 초기화
	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.println("첫 번째 요소 : " + v.firstElement());
		System.out.println("두 번째 요소 : " + v.get(1));
		System.out.println("요소의 갯수  : " + v.size());
		//첫 번째 요소 : 주황
		//두 번째 요소 : 하양
		//요소의 갯수  : 7

		// ○ 전체 출력
		System.out.print("전체 출력 : ");
		for (String str : v)
			System.out.print(str + " ");
		System.out.println();

		
		/* 나의 시도
		Iterator<Object> it = v.iterator();

		while (it.hasNext())
		{
			str = (String)it.next();
			System.out.print("전체 출력 : " + 

		}

		Iterator<Object> it = v.iterator();

		while (it.hasNext())
		{
			str = (String)it.next();
			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 번째 인덱스에 위치하고 있다.", idxBlue);
		System.out.println();
		//--==>> 파랑 : 5 번째 인덱스에 위치하고 있다.

		int idxNavi = Collections.binarySearch(v,"남색");
		System.out.printf("남색 : %d 번째 인덱스에 위치하고 있다.", idxNavi);
		System.out.println();
		//--==>> 남색 : -1 번째 인덱스에 위치하고 있다.   //--음수 나오면 남색은 없는거다!  → 검색 결과 없음


		// ○ 내림차순 정렬 → 별도의 메소드가 존재하지 않는다! 매개변수를 하나더 추가
		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 번째 인덱스에 위치하고 있다.", idxBlue);
		System.out.println();
		//--==>> 파랑 : -8 번째 인덱스에 위치하고 있다.  → 못찾았음... 
		
		
		idxBlue = Collections.binarySearch(v,"파랑", Collections.reverseOrder());
		System.out.printf("파랑 : %d 번째 인덱스에 위치하고 있다.", idxBlue);
		System.out.println();
		//--==>> 파랑 : 1 번째 인덱스에 위치하고 있다.


	}
}

▪ 벡터 검색 및 삭제 코드 설명📝

//앞에는 인덱스를 가지고 값을 확인했다면 이제는 값을 가지고 인덱스를 확인

import java.util.Vector;

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

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

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

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

		// indexOf()
		String s1 = "분홍";

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

		String s2 = "노랑";
		
		// 『v.conrains(s)』 
		//  벡터 자료구조 v 에 찾고자 하는 s가 포함되어 있다면....
		if (v.contains(s2))     
		{
			// 벡터 자료구조 v 에서 s2의 인덱스 위치 확인하고!
			i = v.indexOf(s2);
			System.out.println(s2 + "-> index 위치 : " + i);


			// 우선 위의 코드를 통해 제거하고자 하는 대상의 위치를 찾고
			// 찾았으면 삭제해라~!!!
			v.remove(i);
		}

		// 찾아서 삭제한 후 전체 요소 출력
		System.out.print("삭제한 후 전체 요소 출력 : ");
		for (String str : v)
		{
			System.out.print(str + " ");
		}
		System.out.println();
		//--==>> 삭제한 후 전체 요소 출력

		//추가 테스트
		System.out.println(colors);
		//--==>> [Ljava.lang.String;@15db9742    //colors배열의 해시코드

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

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


	}
}

▪ 벡터 자료구조 객체 선언 및 생성 시 코드 설명📝

//  벡터 자료구조 객체 선언 및 생성 시
//  사용자 정의 클래스 활용 → 자료형


import java.util.Vector;

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

	// getXxx() → getter
	// setXxx() → setter
	//Setter는 Main 함수에서 인스턴스 필드에 접근해서 사용하는 함수
	//Getter도 Main 함수에서 인스턴스 필드에 접근해서 사용하는 함수


	//  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;
	}

	// 생성자 (매개변수 없는 생성자) → 사용자 정의 생성자
	public MyData()
	{
		name = "";
		age = 0;
	}


}

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

		// 벡터 자료구조 v 에
		// 황선우 13세 / 김연경 7세 / 김제덕 50 세
		// 담아내기

		/*
		// 방법① 
		MyData st1 = new MyData();
		st1.setName("황선우");
		st1.setAge(13);
		v.add(st1);

		MyData st2 = new MyDate();
		st2.setName("김연경");
		st2.setAge(7);
		v.add(st2);

		MyData st3 = new MyDate();
		st3.setName("김제덕");
		st3.setAge(50);
		v.add(st3);
		*/

		/*
		// 방법②
		// 마이데이터 타입 인스턴스 생성
		MyData st1 = new MyData("황선우",13);
		v.add(st1);
		MyData st2 = new myData("김연경",7);
		v.add(st2);
		MyData st3 = new myData("김제덕",50);
		v.add(st3);
		*/

		// 방법③
		v.add(new MyData("황선우",13));
		v.add(new MyData("김연경",7));
		v.add(new MyData("김제덕",50));

		/* 내가 푼 추가하는 법
		v.addElement(new MyData("황선우",13));
		v.addElement(new MyData("김연경", 7));
		v.addElement(new MyData("김제덕", 50));
		System.out.println("벡터의 요소 갯수 : " + length);


		// 벡터 자료구조 v 의 전체 요소 출력
		System.out.print("전체 요소 출력 : ");
		for (MyData str :v )
		{
			System.out.print(str +  " ");
		}
		System.out.println();
		//--==>> 
		*/

		// 벡터 자료구조 v 에 담긴 내용(요소) 전체 출력하기
		// 실행 예)
		// 이름 : 황선우, 나이 : 13세
		// 이름 : 김연경, 나이 : 7세
		// 이름 : 김제덕, 나이 : 50세
		

		// 방법① 
		for (MyData m : v)
		{
			//System.out.println("이름 : " + m.getName() + ", " + "나이 : " + m.getAge() + "세");  //m.name 못하게 막아놔서 m.getName()
			System.out.printf("이름:%s, 나이:%d세\n",m.getName(),m.getAge());
		}
		System.out.println();
		//이름:황선우, 나이:13세
		//이름:김연경, 나이:7세
		//이름:김제덕, 나이:50세

		//예전 Record클래스를 배열에 인스턴스 넣어서 했던것처럼 생각 벡터 하나의 요소마다 각각의 MyData 인스턴스가 들어가 있다고 생각


		// 방법②
		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();
		//이름:황선우, 나이:13세
		//이름:김연경, 나이:7세
		//이름:김제덕, 나이:50세

		// 방법③
		for (Object temp : v)
		{
			System.out.printf("이름:%s, 나이:%d세\n",((MyData)temp).getName(), ((MyData)temp).getAge());
													//------------ 다운 캐스팅
		}
		System.out.println();
		//이름:황선우, 나이:13세
		//이름:김연경, 나이:7세
		//이름:김제덕, 나이:50세
		
 	}
}
profile
개발새발

0개의 댓글