Part1. 컬렉션
1. 컬렉션이란?
- 자료구조가 내장되어 있는 클래스
- 자바에서 제공하는 자료구조를 담당하는 프레임워크
-> 자료구조: 데이터를 어떻게 다룰 것인가,
데이터를 효율적으로 다룰때 (조회,정렬, 추가, 수정, 삭제) 필요한 개념
- 프레임워크: 효율적인 기능들이 이미 정의되어 있는 틀
- 데이터가 새롭게 추가, 삭제, 수정되는 기능 (알고리즘)이 정의되어있는 틀
2. 배열과 컬렉션의 차이점
배열의 단점 | 1. 한 타입(또는 그 부모,자식)의 데이터만 저장이 가능 2. 배열을 사용하고자 할 때 크기를 지정해야함 ==> 한 번 지정된 크기는 변경이 불가함 새로운 값을 추가하려면 새로운 배열을 만들고, 기존 내용을 복사하는 코드를 짜야함 3. 배열 중간에 새로운 데이터 추가, 삭제시: 기존 값의 덱스를 앞당기거나, 미루는 코드를 직접 짜야함 ==> 사용처 : 방대한 데이터를 저장해두고, "조회"할 목적일 경우 |
컬렉션의 장점 | 1.여러 타입의 데이터 저장이 가능 2. 같은 타입의 데이터만 묶어서 사용도 가능 (배열처럼, 제네릭 설정을 통해 한 타입의 데이터만 묶을 수 있음) 3. 크기 제약이 없음. 크기 지정을 하지 않아도 됨 ==> 지정한 크기가 있을시 - 해당크기를 초과하는 값을 추가하고자 할 때에는 자동으로 크기가 확장됨 4. 중간 값을 추가, 삭제시 값을 앞당기거나 미루는 코드가 이미 메소드로 정의되어 잇음 ==> 필요한 메소드를 호출해서 사용하면 됨 ==> 방대한 데이터 저장 및 추가, 수정, 삭제가 빈번할 경우 |
3. 3가지 컬렉션 종류
List계열 | 담고자하는 값(Value)만 저장 , 저장시 순서 유지(index), 중복값허용 |
ArrayList(가장 많이사용), LinkedList, Vector |
Set계열 | 담고자하는 값(Value)만 저장 , 저장시 순서 없음(보따리에 순서없이 들어있음), 중복 비허용(순서가 없으니 중복되면 어떤건지 알수없음) |
HashSet, TreeSet |
Map계열 | 키(key)+ 값(Value) 세트로 저장 , 저장시 순서 없음, 중복 - 키 중복불가, 값 중복가능 |
HashMap, HashTable, TreeMap, Properties |
4. ArrayList
1) 표현법
List 객체명 = new ArrayList(); / 일반적으로 다형성 적용을 위해 ArrayList의 부모 List 사용
List의 자손들도 다룰 수 있어지기 때문에
/ 크기는 지정 필수 x
ArrayList 객체명 = new ArrayList ();
ArrayList <generics> 객체명 = new ArrayList<generics> ();
*ArrayList의 크기를 지정했을 경우:
: 범위를 벗어날시 자동으로 크기가 늘어남 (배열의 경우 ArryaIndexOutofBoundsException발생)
*지네릭스
다양한 타입의 객체들을 다루는 메서드/ 컬렉션 클래스에
컴파일 시의 타입 체크를 해주는 기능
다룰 객체의 타입을 미리 명시= => 형변환 불필요해짐
2) ArrayList메서드
ArrayList메서드 | 코드, 설명 |
toString 오버라이딩 - 출력문( ArrayList명.toString()) ; ==> 각 요소의 내용을 String으로 반환한 값을 출력 |
ArrayList list = new ArrayList(3) System.out.println(list) ---> list의 각 요소 값을 문자열로 반환 [a, b, c, d] |
add메소드 (오버라이딩) add (E e) : 리스트 마지막에 인자로 전달된 요소 e를 추가 add(int index, E e) : 리스트의 index번째 자리에 e를 추가 (E : element, 제네릭과 오브젝트를 담을 수 있음) |
list.add(new Music("다함께 차차차", "설운도")); list.add(new Music("땡벌", "남진")); list.add(new Music("아기상어", "핑크퐁")); System.out.println(list); 출력시 Music객체 3개가 들어가있음 객체가 "내가 저장한(add한) 순서대로" 들어가있음 -----> 순서가 유지되면서 저장됨 (인덱스 개념o) list.add("끝"); 지네릭스 미지정시 object클래스의 모든 자손을 담을 수 있음 (서로 다른 참조자료형 추가 가능) |
set(int index, E e) : 리스트의 index번째 요소를 e로 변경 |
|
remove(int index): E 리스트의 index번째 요소를 삭제하는 메 소드 |
String str = list.remove(0); remove 메소드는 제네릭 (미지정시 object)를 반환하는, 반환값이 있는 메소드 ==> 삭제한 값을 재사용하고 싶다면 변수에 저장가능, 그러나 해당 변수는 제네릭(미지정시 object)로 형변환 해야한다 Type mismatch: cannot convert from Object to String Music m = (Music)list.remove(0); list.remove(0)로 삭제된 값은 Music형 ==> 따라서 해당 값을 재사용하려면 Music 형 변수에 담고, list.reomve()값을 object에서 music으로 강제형변환 필요 |
get(int index) :E 리스트의 index번째에 담긴 요소를 반환해주는 메서드 |
Music m2 = (Music) list.get(0); // Music으로 강제형변환, downcasting System.out.println(m2); System.out.println("1번인덱스 곡제목 : "+((Music)list.get(1)).getTitle()); // 형변환이 먼저된 후 gettitle할 수 있도록 연산자 우선순위 주의 Music에 먼저 접근한 다음(Music으로 형변환), music의 멤버 getTitle에 접근해야함 리스트 : index 개념 (순서) + get 메소드 => 반복문 사용이 가능함 |
size(): int 리스트의 크기(리스트에 담겨있는 요소의 갯수) 반환 |
System.out.println("리스트에 담긴 요소의 갯수: "+list.size()); System.out.println("리스트의 마지막 인덱스 번호: "+(list.size()-1)); // 연산자 우선순위 잘 정해주기!! 배열의 길이 = length 필드에 접근 문자열의 길이 = length 메서드 |
subList (int index1, int index2) : List :index1 부터 (index2)-1 까지의 데이터값을 추출하여 새로운 리스트로 변환하여 반환 |
List sub = list.subList(1, 3); |
addAll(Collection c) : 리스트에 다른 컬렉션에 있는 데이터를 통째로 추가해주는 메서드 |
rrayList 도 collection의 자손이므로 매개변수로 받아줄 수 있음 System.out.println(list); list + list (같은 두 개 리스트 중복저장) 데이터의 중복 저장이 가능하다!~! (**** list의 특징 2) |
isEmpty() : boolean 리스트가 통째로 비어있으면 true, 하나라도 값이 저장되어 있으면 False |
|
clear() : 리스트내용을 통째로 비워주는 메서드 |
5. 제네릭(Generic) <E>
1) 제네릭이란?
- 컬렉션 내에서 다룰 타입을 미리 지정해주는 역할
* 다양한 타입의 객체들을 다루는 메서드/ 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능
- 제네릭은 한가지 타입만 설정이 가능함
ArryaList <Music, String> list = new ArrayList(); ==> 불가능,
2) 제네릭을 사용하는 이유:
1] 저장할 타입에 제한을 두기 위해서 :
별도의 제네릭을 제시하지 않고 컬렉션 객체 생성시 E==object로 간주되어 어떠한 객체도 들어올 수 있음
제네릭 제시시, E == 지정 제네릭으로 바뀜. 지정 타입만 들어올 수 있음
2] 객체의 형변환 절차를 줄이기 위해서:
제네릭 설정시 return값이 자동으로 제네릭타입으로 변환되어 돌아오므로,
컬렉션 메서드 중 return값이 object로 돌아오는 메서드 사용 시 형변환의 번거로움을 줄일 수 있음
<제네릭 설정 전>
for (int i = 0; i < list.size() ; i++) { // list 는 length필드 아니고 size 메소드임!
System.out.println((i+1)+"번째 곡: "+ ((Music)list.get(i)).getTitle());
}
향상된 for 문 => 값을 조회하는 목적으로 사용이 가능
for (값을 받아줄 변수 : 순차적으로 접근할 배열 또는 컬렉션)
// for ( Music c : list ) { // 제네릭 미지정시 list함수의 반환값은 기본값인 object
->object는 Music이 받아줄 수 없음(Music으로 형변환 불가)
(upcasting없이는 downcasting이 불가하다)
// System.out.println(c);
}
for ( Object c : list ) { // c는 object로 가능한걸...?
System.out.println(c);
}
<제네릭 설정 후>
ArrayList<Music> list = new ArrayList();
System.out.println(list);
list.add(new Music("1", "2"));
list.add(1, new Music("5", "6"));
list.add(1, new Music("3", "4"));
System.out.println(list);
Music m = list.get(0);
// 제네릭지정시 별도의 형변환을 하지 않아도 list함수 호출 return값이 제네릭으로 지정한 Music 값으로 나옴
for (Music m1 : list) {
System.out.println(m);
}
'코딩공부일지 > 수업 review' 카테고리의 다른 글
API (0) | 2022.09.27 |
---|---|
자바: abstract & interface & 예외 (0) | 2022.09.21 |
자바: 다형성 (0) | 2022.09.20 |
자바 - 상속 & 오버라이딩 (0) | 2022.09.20 |
자바 - 객체지향프로그래밍2( 오버로딩, 객체배열) (0) | 2022.09.14 |