Test152~Test159
//배열을 떠올리고 배열의 제한사항 2개가 허물어져 있다고 생각하면됨!
//배열의 같은요소로 구성해야한다는 제한사항이 있었는데 벡터는 상관없음
// 배열은 크기가 정해져 있는데 벡터는 길기가 변할 수 있다.
자바의 자료구조 기능을 제공하는 클래스들 중 가장 기본적인 클래스로
배열과 비슷하지만, 배열과 달리 다른 종류의 데이터 형을 가진
데이터 요소를 가질 수 있으며, 데이터가 가득차면 자동으로 저장 영역을
확장시키게 된다.
또한, 객체 래퍼러스를 저장하기 때문에
JDK 1.5 이전에는 자바 기본형 데이터는 저장할 수 없었으나
JDK 1.5 이후부터는 오토박싱 / 오토언박싱 기능이 지원되면서
기본 데이터형도 저장이 가능해졌다.
벡터 클래스의 기본 구조는
시퀀스(Sequence) 데이터 구조에 기반하며(==순차적이다.)
시퀀스 데이터 접근을 순차적인 인텍스 값에 대한 위치로 접근하게 된다.
따라서, 자료구조의 양 끝단에서만 접근이 가능한 큐나
한쪽 끝에서만 접근이 가능한 스택과 달리
시퀀스 개념의 인덱스 값을 이용하여 자료구조 임의의 지점에서
저장 및 접근이 가능하다.
벡터의 시퀀스 구조는
List 인터페이스(순서 중요!)를 통해 제공받고 있기 때문에
List 인터페이스의 모든 메소드를 사용할 수 있다.
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();
//--==>> 검정 노랑 초록 파랑 빨강 연두 하양
}
}
util패키지에 있음~!!
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세
}
}