HIGH JAVA DAY1 - Vector

어뮤즈온·2021년 1월 11일
0

고급자바

목록 보기
1/7

Vector

ArrayList와 동일한 내부구조를 가지고 있으며, 값이 추가되면 자동으로 크기가 조절된다. 하지만 Vector는 동기화된 메서드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행 완료해야만 다른 스레드들이 실행할 수 있다.

* 멀티 스레드 환경에서 안전하게 객체를 추가하고 삭제할 수 있다.

1. 객체생성해서 Vector 사용하기

Vector v1 = new Vector();
//객체생성
//예전방식 : 모든 데이터를 저장할 수 있지만 꺼내올 때는 형변환 필요               

System.out.println("처음 크기 : " + v1.size()); // 0

데이터 추가

  • add(추가할 데이터)

→ 반환값 : 추가 성공(true), 실패(false)

v1.add("aaaa");
v1.add(new Integer(111));
v1.add(123);

* 오토박싱(기본자료형 → 랩퍼클래스형으로 자동변환)

* 오토언박싱(랩퍼클래스형 → 기본자료형으로 자동변환)

v1.add('a'); //' '로 저장되는 데이터는 문자가 아닌 코드값으로 저장
v1.add(true);
boolean chk = v1.add(3.14);

System.out.println("현재크기 : " + v1.size()); // 6
System.out.println("반환값 : " + chk); // true
  • addElement(추가할 데이터)

→ add와 똑같은 기능을 하는 메서드(이전 버전의 프로그램에서도 사용 가능하도록 하기위해 남아 있는 메서드)

v1.addElement("CCC");

System.out.println("v1 ==> " + v1.toString());
System.out.println("v1 ==> " + v1); //toString() 생략

//v1 ==> [aaaa, 111, 123, a, true, 3.14, CCC]
//v1 ==> [aaaa, 111, 123, a, true, 3.14, CCC]
  • add(index, 추가할 데이터)

→ index번째에 '추가할 데이터'를 끼워 넣는다.( index는 0부터 시작한다.)

→ 반환값은 없다.

v1.add(1, "kkk");
System.out.println("v1 ==> " + v1);

//v1 ==> [aaaa, kkk, 111, 123, a, true, 3.14, CCC]

데이터 수정

  • set(index, 새로운 데이터)

→ index번째의 데이터를 '새로운 데이터'로 덮어쓴다.

→ 반환값 : 원래의 데이터

String temp = (String)v1.set(1, "zzz");
System.out.println("v1 ==> " + v1);
System.out.println("반환값 : " + temp);

//v1 ==> [aaaa, zzz, 111, 123, a, true, 3.14, CCC]
//반환값 : kkk

데이터 꺼내오기

  • get(index)

→ index번째의 데이터를 반환한다.

int data = (int)v1.get(2);
System.out.println("2번째 자료 : " + data);

//2번째 자료 : 111

데이터 삭제

  • remove(index)

→ index번째의 데이터를 삭제한다.

→ 반환값 : 삭제된 데이터

v1.remove(0);
System.out.println("v1 ==> " + v1);

temp = (String)v1.remove(0);
System.out.println("v1 ==> " + v1);
System.out.println("삭제된 데이터 : " + temp);

//v1 ==> [zzz, 111, 123, a, true, 3.14, CCC]
//v1 ==> [111, 123, a, true, 3.14, CCC]
//삭제된 데이터 : zzz
  • remove(삭제할 데이터)

→ '삭제할 데이터'를 찾아서 삭제한다.

→ '삭제할 데이터'가 여러개이면 앞에서부터 삭제된다.

→ 반환값 : 삭제 성공(true), 삭제 실패(false)

→ 삭제할 데이터가 '정수형'이거나 'char형'일 경우에는 반드시 객체로 변환해서 지정해 주어야 한다.

v1.remove("CCC");
System.out.println("삭제 후 v1 = " + v1);
// 삭제 후 v1 = [111, 123, a, true, 3.14]

//v1.remove(123);
//데이터 123을 삭제하는 것이 아니라 123번째 자료를 삭제하는 것으로 해석하여 컴파일 에러발생
v1.remove(new Integer(123);
System.out.println("삭제 후 v1 = " + v1);
//삭제 후 v1 = [111, a, true, 3.14]

//v1.remove('a'); 객체변환 필요
v1.remove(new Character('a'));
System.out.println("삭제 후 v1 = " + v1);
//삭제 후 v1 = [111, true, 3.14]

v1.remove(true);
v1.remove(3.14);
System.out.println("삭제 후 v1 = " + v1);
//삭제 후 v1 = [111]

2. 제네릭 타입으로 Vector 사용하기

제네릭 타입(Generic Type)

  • 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 말한다.
  • 객체를 선언할 때 괄호(<>) 안에 그 클래스 내부에서 사용할 데이터의 타입을 정해주는 것을 말한다. 이런식으로 선언하게 되면 그 데이터 타입 이외의 다른 데이터를 저장할 수 없게 된다.
  • 제네릭으로 선언될 수 있는 데이터 타입은 '클래스형'이어야 한다. 즉, Integer, boolean은 Boolean, char는 Character등으로 대체해서 사용해야 한다.
  • 제네릭 타입으로 선언하게 되면 데이터를 꺼내올 때 형변환이 필요없다.
Vector<String> v2 = new Vector<>();
Vector<String> v22 = new Vector<>();

Vector<Integer> v3 = new Vector<>();
//Vector<int> v33 = new Vector<>();
//제네릭 타입은 반드시 '클래스형'으로 지정해야 한다.

데이터 추가

  • add(추가할 데이터)
v22.add("안녕하세요");
//v22.add(123); //에러 : 다른 종류의 데이터를 저장할 수 없다.

String temp2 = v22.get(0);
System.out.println("temp2 = " + temp2);
//temp2 = 안녕하세요

전체 데이터 삭제하기

  • clear()
v1.clear();
System.out.println("v1의 개수 : " + v1.size());
//v1의 개수 : 0

데이터 삭제

  • removeAll(Collection 객체)

→ 'Collection 객체'가 가지고 있는 데이터를 모두 삭제한다.

→ 반환값 : 삭제 성공(true), 삭제 실패(false)

v2.add("AAAA");
v2.add("BBBB");
v2.add("CCCC");
v2.add("DDDD");
v2.add("EEEE");

Vector<String> v4 = new Vector<>();
v4.add("BBBB");
v4.add("EEEE");

System.out.println("v2 = " + v2);
System.out.println("v4 = " + v4);
//v2 = [AAAA, BBBB, CCCC, DDDD, EEEE]
//v4 = [BBBB, EEEE]

v2.removeAll(v4);
System.out.println("v2 = " + v2);
//v2 = [AAAA, CCCC, DDDD]

모든 데이터 가져오기

  • Vector에 저장된 데이터를 순서대로 모두 가져와 사용하고 싶으면 반복문을 사용하면 된다. → 보통 for문을 많이 사용
//현재 v2 = [AAAA, BBBB, CCCC, DDDD, EEEE]
for(int i = 0; i < v2.size(); i++){
	System.our.println(i + "번째 자료 : " + v2.get(i));
}
//0번째 자료 : AAAA
//1번째 자료 : BBBB
//2번째 자료 : CCCC
//3번째 자료 : DDDD
//4번째 자료 : EEEE

* 향상된 for문

  • 형식) for(자료형명 변수명 : 배열이나 List 또는 Set형 객체 변수) { 처리할 내용들...}
for(String str : v2){
	System.out.pritnln(str);
}
//AAAA
//BBBB
//CCCC
//DDDD
//EEEE

제네릭 타입의 장점

  • 객체생성의 방법에서 데이터 타입 형변환 시 문법적으로는 에러가 없지만, 실행과정에서 에러가 발생하는 경우가 있다.

→ 제네릭 타입은 코딩 작성 과정에서 그 오류를 해결할 수 있다.

  • 사용 틀을 만들고 사용단계에서 데이터 타입을 결정할 수 있다.
Vector<Vector> vv = new Vector<>();
Vector<Vector<Vector>> vvv = new Vector<>();
profile
Hello, world!

0개의 댓글