고급JAVA 1강 - Collection(Vector, List)

Vector

      //컬렉션 객체에 저장되는 데이터는 객체만 저장할 수 있다.
	
	//객체 생성
	Vector v1 = new Vector(); //예전 방식 - 모든 객체를 다 저장할 수 있음.
                                   (Object로 형변환되어 저장됨)
	
	System.out.println("처음 크기 : " + v1.size());
	
	//데이터 추가 : add(추가할 데이터)
	//반환값 : 성공(true), 실패(false)
	v1.add("AAAA");
	v1.add(new Integer(123)); //숫자를 저장하려면 정수형 객체로 변환해서 저장해야 함.(옛날 방식)
	v1.add(111); //자동으로 객체화시켜서 저장해줌. = autoboxing(오토박싱)으로 자동으로 객체화 된다.
	v1.add('a');
	v1.add(true); //논리형 데이터도 저장 가능
	boolean r = v1.add(3.14);
	
	System.out.println("v1의 크기 : " + v1.size());
	System.out.println("반환값 : " + r);
	System.out.println("v1 ==> "+ v1); //현재 들어있는 값을 알고싶을 때 v1.toString()과 같은 의미
	
	//데이터 추가2 : addElement(추가할 데이터)
	//이전 버전의 vector에서 사용하던 메서드
	v1.addElement("KKK");
	
	System.out.println("v1 ==> " + v1);
	
	//데이터 추가3 : add(index, 데이터) - 벡터 내부의 자료는 배열로 관리됨(인덱스 값이 있음)
	// ==> index번째에 '데이터'를 끼워 넣는다.
	// ==> index는 0부터 시작한다.
	// ==> 반환값은 없다.
	v1.add(1, "ZZZ"); //1번인덱스 자리에 ZZZ를 추가(원래 자리의 자료들은 뒤로 밀려남)
	System.out.println("v1 ==> " + v1);
	
	//데이터 수정 : set(index, 새로운 데이터)
	// ==> 'index'번째 자료를 '새로운 데이터'로 변경한다.
	// 반환값 : 원래의 데이터
	String temp = (String)v1.set(0, "YYYY");// 이걸 casting이라고 함.
	//자식 -> 부모 형변환 : 자동형변환, 부모 -> 자식 형변환 : 직접 해줘야 함.
	System.out.println("v1 ==> " + v1);
	System.out.println("원래의 데이터 : " + temp);
	
	//데이터 삭제 : remove(index)
	// ==> 'index'번째의 데이터를 삭제한다.
	// ==> 반환값 : 삭제된 데이터
	v1.remove(0);
	System.out.println("삭제 후 : " + v1);
	
	temp = (String)v1.remove(0);
	System.out.println("삭제 후 : " + v1);
	System.out.println("삭제된 데이터 : " + temp);
	
	//데이터 삭제2 : remove(삭제할 데이터)
	// ==> '삭제할 데이터'를 찾아서 삭제한다.
	// ==> '삭제할 데이터'가 여러개이면 앞에서부터 삭제된다.
	// ==> 반환값 : 삭제성공(true), 삭제실패(false)
	// ==> '삭제할 데이터'가 '정수형' 이거나 'char형'일 경우에는 
               '삭제할 데이터'를 객체로 변환해서 사용해야 한다.
	
	v1.remove("KKK");
	System.out.println("삭제 후 : " + v1);
	
	//v1.remove(111); //삭제가 안됨 => 인덱스 번호로 인식
	v1.remove(new Integer(111)); 
	System.out.println("삭제 후 : " + v1);
	
	//v1.remove('a'); //삭제가 안됨 => 문자 하나의 코드값으로 변경됨, a 문자열의 코드값 : 97
	v1.remove(new Character('a')); 
	System.out.println("삭제 후 : " + v1);
	
	v1.remove(true); //형변환 안해도 에러 안 남.
	System.out.println("삭제 후 : " + v1);
	
	v1.remove(3.14); //형변환 안해도 에러 안 남.
	System.out.println("삭제 후 : " + v1);
	
	//데이터 꺼내오기 : get(index)
	// ==> 'index'번째의 데이터를 반환한다.
	int data = (int)v1.get(0);
	System.out.println("0번째 자료 : " + data);
	
	//--------------------------------------------------------------------------
	
	/*
	 제네릭 타입(Generic Type) 
	 ==> 클래스 내부에서 사용할 데이터의 타입을 외부에서 지정하는 기법
	 ==> 객체를 선언할 때 < >안에 그 객체가 사용할 데이터의 타입을 정해준다.
	 ==> 이런 식으로 선언하게 되면 그 데이터 타입 이외의 데이터를 저장할 수 없다. 
	     단, 제네릭으로 선언될 수 있는 데이터 타입은 클래스형이어야 한다.
	     예) int ==> Integer, boolean ==> Boolean, 
                char ==> Character 등올 대체해서 사용해야 한다.
	 ==> 제네릭 타입으로 선언하게 되면 데이터르 꺼내올 때 별도의 형변환이 필요없다.     
	 */
	
	Vector<String> v2 = new Vector<>(); //우측의 제네릭 <> 안은 JDK1.7부터 생략가능
	Vector<Integer> v3 = new Vector<>();
	
	v2.add("안녕하세요");
	//v2.add(123); //오류 : 제네릭 타입과 맞지 않은 자료형 추가
	
	String temp2 = v2.get(0); //형변환이 필요없다.
	
	Vector<Vector> vv = new Vector<>(); //벡터 안의 벡터. 2차원 배열과 같은 형식
	Vector<Vector<Vector>> vvv = new Vector<>(); //3차원 배열과 같은 형식
	
	//----------------------------------------------------------------------------
	System.out.println("----------------------------------------------------------");
	
	v2.clear(); //전체 데이터 삭제
	System.out.println("v2의 크기 : " + v2.size());
	
	v2.add("AAA");
	v2.add("BBB");
	v2.add("CCC");
	v2.add("DDD");
	v2.add("EEE");
	
	Vector<String> v4 = new Vector<>();
	v4.add("BBB");
	v4.add("EEE");
	
	System.out.println("v2 => " + v2);
	System.out.println("v4 => " + v4);
	
	//데이터 삭제3 : removeAll(Collection객체)
	// ==> 'Collection객체'가 가지고 있는 데이터를 모두 삭제한다.
	// ==> 반환값 : 성공(true), 실패(false)
	v2.removeAll(v4); //v4가 가지고 있는 데이터를 v2에서 삭제
	System.out.println("v2 ==> " + v2);
	System.out.println();
	
	System.out.println("----------------------------------------------------------");
	
	v2.clear();
	v2.add("AAA");
	v2.add("BBB");
	v2.add("CCC");
	v2.add("DDD");
	v2.add("EEE");
	
	//Vector의 데이터를 처음부터 차례로 읽어와 처리하고 싶으면 반복문을 사용하면 된다.
	for(int i = 0; i < v2.size(); i++) {
		System.out.println(i + "번째 자료 : " + v2.get(i));
	}
	System.out.println("----------------------------------------------------------");
	
	//향상된 for문
	for(String s : v2) {//v2자리에 배열, 벡터, set 등 사용 가능 
		System.out.println(s);
	}

	
	
}

ArrayList

  //ArrayList는 기본적인 사용법이 Vector와 같다.
	
	ArrayList list1 = new ArrayList<>();
	//add()메서드를 이용해서 추가한다.
	list1.add("aaa");
	list1.add("bbb");
	list1.add(123);
	list1.add('k');
	list1.add(true);
	list1.add(123.45);
	
	System.out.println("list1 ==> " + list1 );
	System.out.println("size ==> " + list1.size());
	
	//get()메서드로 데이터를 꺼내온다.
	System.out.println("2번째 데이터 : " + list1.get(2));
	
	//데이터 끼워넣기
	list1.add(3,"zzz");
	System.out.println("list1 ==> " + list1 );
	
	//데이터 수정하기
	String temp = (String)list1.set(3, "yyy"); //3번째 데이터의 값을 "yyy"로 변경
	System.out.println("temp => " + temp);
	System.out.println("list1 => " + list1);
	
	//삭제도 같다.
	list1.remove(3); //3번 인덱스의 값을 삭제
	System.out.println("list1 => " + list1);
	
	list1.remove("bbb");
	System.out.println("list1 => " + list1);
	System.out.println();
	System.out.println("---------------------------------------------------------");
	
	//제네릭을 사용할 수 있다.
	ArrayList<String> list2 = new ArrayList<>();
	
	list2.add("AAA");
	list2.add("BBB");
	list2.add("CCC");
	list2.add("DDD");
	list2.add("EEE");
	
	for(int i = 0; i < list2.size(); i++) {
		System.out.println(i + "==> " + list2.get(i));
	}
	
	System.out.println("---------------------------------------------------------");
	for(String str : list2) {
		System.out.println(str);
	}
	System.out.println("---------------------------------------------------------");
	
	//contains(비교객체)
	// ==> List에 '비교객체'가 있으면 true, 없으면 false를 반환
	System.out.println("DDD값 존재 여부 : " + list2.contains("DDD")); //있는지 없는지 검사
	System.out.println("YYY값 존재 여부 : " + list2.contains("YYY")); //있는지 없는지 검사
	
	//indexOf(비교객체)
	// ==> List에 '비교객체'가 있으면 '비교객체'가 있는 index값을 반환한다.
	//	   index값을 반환한다. 없으면 -1을 반환한다.
	System.out.println("DDD의 위치값 : " + list2.indexOf("DDD"));
	System.out.println("YYY의 위치값 : " + list2.indexOf("YYY"));
	
	//toArray() 
	// ==> List 안의 데이터를 배열로 변환하여 반환한다.
	// ==> 기본적으로 Object형 배열로 변환한다.
	
	//지정한 제네릭 타입에 맞는 배열로 변환하기
	// ==> toArray(new 제네릭타입[0])
	
	Object[] strArr = list2.toArray(); //list2에 저장된 5개의 데이터가 strArr배열에 저장됨
	System.out.println("배열의 개수 : " + strArr.length);
	for(int i = 0; i < strArr.length; i++) {
		String str = (String)strArr[i];
		System.out.println(i + " ==> " + str);
	}
	
	System.out.println("---------------------------------------------------------");
	
	String[] strArr2 = list2.toArray(new String[0]); //String 타입의 배열로 변환됨 
	for(int i = 0; i < strArr2.length; i++) {
		String str = strArr2[i]; //형변환 안해도 됨.
		System.out.println(i + " ==> " + str);
	}    
    

문제) 5명의 사람 이름을 입력받아 ArrayList에 저장한 후에 저장된 ArrayList의 데이터 중 '김'씨 성의 이름을 모두 출력하시오.
(단, 입력은 Scanner 객체를 이용한다.)

public class ArrayListTest02 {

public static void main(String[] args) {

	Scanner sc = new Scanner(System.in);
	ArrayList<String> list = new ArrayList<>();
	
	//5명의 사람 이름 입력받기
	//ArrayList에 저장하기
	System.out.println("5명의 이름을 입력해주세요.");
	for(int i = 1; i <= 5; i ++) {
		System.out.print(i + "번째 사람 이름 : ");
		String name = sc.next();
		list.add(name);
	}
	System.out.println();
	System.out.println("김씨 성을 가진 사람들");
	
	//저장된 ArrayList의 데이터 중 '김'씨 성의 이름을 모두 출력하기
	//방법1 - 첫 번째 글자를 잘라내는 방법
	for(String name : list) {
		if(name.substring(0, 1).equals("김")) {//substring의 반환값 = String
			System.out.print(name);
			System.out.print(" / ");
		}
	}
	
	//방법2 - 첫 번째 글자를 꺼내오는 방법
	for(String name : list) {
		if(name.charAt(0) == '김') {//charAt의 반환값 = Character
			System.out.print(name);
			System.out.print(" ");
		}
	}
	
	//방법3 - 
	for(String name : list) {
		if(name.indexOf("김") == 0) {//0번째 글자가 김일 때
			System.out.print(name);
			System.out.print(" ");
		}
	}

	//방법4
	for(String name : list) {
		if(name.startsWith("김")) {//김으로 시작하는게 true일 때
			System.out.print(name);
			System.out.print(" ");
		}
	}
	
}

}

과제

문제) 5명의 별명을 입력받아 ArrayList에 저장한 후 이들 중 별명의 길이가 제일 긴 별명을 출력하시오.
(입력은 Scanner 이용)

	Scanner sc = new Scanner(System.in);
	ArrayList<String> nameList = new ArrayList<>();
	//5명의 별명 입력받아 ArrayList에 저장
	System.out.println("5명의 별명을 입력해주세요.");
	
	for(int i = 1; i <= 5; i++) {
		System.out.println(i + "번째 사람 별명 : ");
		String name = sc.next();
		nameList.add(name);
	}
	//별명의 길이 비교 - 
	
	//첫번째 방법
	int max = 0; 
	for(int i = 0; i < nameList.size(); i++) {
		if(nameList.get(i).length() > nameList.get(max).length()) {
			String temp = null;
			temp = nameList.get(i);
			nameList.set(i, nameList.get(max));
			nameList.set(max, temp);
		}
	}
	//제일 긴 별명 출력(최대값)
	System.out.print(nameList.get(max));
	

좋은 웹페이지 즐겨찾기