제네릭 : 포괄적인 다양한 타입을 받겠다..
(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과 map으로 나뉜다. (둘다 interface)
: 값들을 담는 여러 그릇
데이터 처리 용도에 맞게 컬랙션내 클래스를 골라야 한다.
컬랙션은 List계열 구현 클래스와 Set계열 구현 클래스로 나뉜다.
List, Set은 둘다 인터페이스 > 이것을 상속받아 다양한 배열로 사용한다.
List 계열 구현 클래스
ArrayList / LinkedList / Vector / Stack
인덱스가 있어서 저장 순서가 유지된다. 따라서 데이터 중복을 허용!
Set 계열 구현 클래스
HashSet / SortedSet / TreeSet
데이터 중복이 허용 안됨!
자바의 배열은 크기를 미리 지정하고 사용함. >> 크기를 지정하고 사용. (탄력성이 없다는 의미)
반면 ArrayList는 필요시 언제든지 추가, 삭제가 가능하다.
import java.util.ArrayList ;
List 인터페이스를 상속함.
인덱스가 있고 저장순서가 유지되고 데이터 중복이 가능하다.
또한 제네릭 문법 사용. > 제네릭을 안 쓰면 내부적으로 Object 타입으로 처리된다. (제네릭 안 쓰면 단점 존재!!!)
데이터 추가 : 객체명.add()
데이터 가져오기 : 객체명.get()
ArrayList의 크기 : 객체명.size()
1개만 삭제 : 객체명.remove()
모두 삭제 : 객체명.removeAll()
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
}
}
}
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);
}
}
컬렉션 프레임워크 타입의 길이 : .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();
}
}
}
: 반복자, 이더레이터, 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 내용이 없다. 지금 너무 졸리니까 나중에 공부한다면 추가해야겠다.