java 100예제 #10

Generic

제네릭 : 포괄적인 다양한 타입을 받겠다..
(Type의 T를 주로 사용)

class Sample<T>{
	private T obj;
	
	//Sample(T obj){this.obj = obj;}
    Sample(T x){this.obj = x;}

	T getObj(){return obj;}
	
	void printInfo() {System.out.println(obj.getClass().getName());}
}



public class ex5 {
	public static void main(String[] args) {

		Sample<String> s = new Sample<String>("졸려");
		System.out.println(s.getObj());
		System.out.println(s1);
		s.printInfo();
		
		Sample<Integer> i = new Sample<Integer>(100);
		System.out.println(i.getObj());
		System.out.println(i1);
		i.printInfo();
	}	
}

출력 :
졸려
java.lang.String
100
java.lang.Integer

Collection Framework

collection과 map으로 나뉜다. (둘다 interface)

collection

: 값들을 담는 여러 그릇
데이터 처리 용도에 맞게 컬랙션내 클래스를 골라야 한다.
컬랙션은 List계열 구현 클래스Set계열 구현 클래스로 나뉜다.

List, Set은 둘다 인터페이스 > 이것을 상속받아 다양한 배열로 사용한다.

  1. List 계열 구현 클래스
    ArrayList / LinkedList / Vector / Stack
    인덱스가 있어서 저장 순서가 유지된다. 따라서 데이터 중복을 허용!

  2. Set 계열 구현 클래스
    HashSet / SortedSet / TreeSet
    데이터 중복이 허용 안됨!

ArrayList

자바의 배열은 크기를 미리 지정하고 사용함. >> 크기를 지정하고 사용. (탄력성이 없다는 의미)
반면 ArrayList는 필요시 언제든지 추가, 삭제가 가능하다.

import java.util.ArrayList ;

List 인터페이스를 상속함.
인덱스가 있고 저장순서가 유지되고 데이터 중복이 가능하다.

또한 제네릭 문법 사용. > 제네릭을 안 쓰면 내부적으로 Object 타입으로 처리된다. (제네릭 안 쓰면 단점 존재!!!)

데이터 추가 : 객체명.add()
데이터 가져오기 : 객체명.get()
ArrayList의 크기 : 객체명.size()
1개만 삭제 : 객체명.remove()
모두 삭제 : 객체명.removeAll()

  • ArrayList를 제네릭아닌 Object 타입으로 사용하는 경우 !!
import java.util.ArrayList;

public class ex5 {
	public static void main(String[] args) {
	
		ArrayList list1 = new ArrayList();
		
		list1.add("만두");
		list1.add(20);
		list1.add(21);
		
		System.out.println(list1.get(0)); 
		String s = (String) list1.get(0);
		
		//get() 메소드를 사용할 때 형변환에 주의해야 한다 > 제네릭 쓰면 해결!!! 
        
		for(int i = 0; i< list1.size(); i++) {
			System.out.println(list1.get(i)+"  ");
			//list1.size() == 3
		}
	}
}
  • 제네릭을 사용하여 ArrayList
    형변환없이 타입 안정성 up !
    만약 데이터 타입을 잘 못 사용한다면 컴파일 단계에서 에러를 발견하여 수정가능
import java.util.ArrayList;

public class ex5 {
	public static void main(String[] args) {

		ArrayList<String> a = new ArrayList<String>();
		
		a.add("초콜릿");
		a.add("젤리");
		a.add("츄러스");
	
		String s1 = a.get(0); 

        //int s2 = a.get(0);
        //Type mismatch

		
		System.out.println("=====향상된 for문 출력=====");
		for(String str: a)
			System.out.println(str);
		
        
		System.out.println("====1개 삭제 후 for문 출력====");
		a.remove(1);
		for(int i = 0 ; i < a.size(); i ++)
			System.out.println(a.get(i));
		
        
		System.out.println("====모두 삭제 후 출력====");
		a.removeAll(a);
		for(String str: a)
			System.out.println(str);
	}
}
  • ArrayList의 2차원 배열
    ArrayList<Integer[ ]>
컬렉션 프레임워크 타입의 길이 :  .size()
	문자열의 길이 : .length()
	배열의 길이 : .length
import java.util.ArrayList;

public class ex5 {
	public static void main(String[] args) {

		ArrayList<Integer[]> arr = new ArrayList<Integer[]>();
		
		arr.add(new Integer[] {11,12,13,14});
		arr.add(new Integer[] {20,21,22});
		arr.add(new Integer[] {1,2,3,4});
		
		//전체 요소 출력은 이중 반복문 사용 _ 안쪽 배열의 사이즈 주의
		for(int i =0 ; i<arr.size(); i++) {
			for(int j =0 ; j< arr.get(i).length ; j ++) {
				System.out.print(arr.get(i)[j]+"   ");
			}
			System.out.println();
		}
	}
}

Iterator

: 반복자, 이더레이터, Collection에 대한 "반복자"
컬렉션 프레임워크내에는 다양한 컬렉션들이 있는데 요소를 읽어올 때 반복자 인터페이스로 표준화 하고 있다.

ArrayList에서 보통 for문을 사용하여 순회할때 index로 각 요소를 순회하나 iterator를 이용하면 오류없이 편리하다.

반복자는 인터페이스이고 따라서 인터페이스내 선언된 메소드들이 있다.

iterator 주요 메서드
hasNext() : 다음 요소가 있는지 검사해서 boolean 반환값 리턴
next() : 다음요소를 리턴, 그런후 다음 위치로 커서를 이동. 반환 타입 Object(제네릭)
remove() : 제거...반환타입 void

import java.util.Iterator;

  • next() 사용시 배열에 값이 없으면 당연히 오류 발생 > hasNext()를 통해서 다음 요소가 있는지 확인하고 안전하게 next로 가져온다.

  • Iterator 객체 생성하기 :
    Collection 인터페이스에서 Iterator()메소드를 정의하고 있고 List, Set 인터페이스가 상속받는다.
    즉, 이미 만들어진 List, set 인터페이스의 객체를 통해서 iterator()메소드를 호출 가능하다는 의미

import java.util.ArrayList;
import java.util.Iterator;

public class ex5 {
	public static void main(String[] args) {

		//객체 생성에서 뒤에 있는 <String>은 생략이 가능하다. 
		ArrayList<String> a = new ArrayList<>();
		a.add("Alligator");
		a.add("Hippo");
		a.add("Ostrich");
		a.add("Donkey");

		Iterator<String> iter = a.iterator();
	
		while(iter.hasNext()) {
			String stt = iter.next();
			System.out.println(stt);
			if("Hippo".equals(stt)) {
				System.out.println("잠깐! "+ stt + "삭제할게요.");
				iter.remove();
			}
		}
		//Hippo삭제하기

		System.out.println("------결과--------");
		for(String s: a)
			System.out.println(s);
	}
}

Iterator에 대해서 이해가 부족하다.. 책으로 공부해서 부족한 부분을 보충하려 했는데 책에 Iterator 내용이 없다. 지금 너무 졸리니까 나중에 공부한다면 추가해야겠다.

좋은 웹페이지 즐겨찾기