본문 바로가기

코딩공부일지/수업 review

컬렉션 개념, ArrayList

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