📗 self-study/📗 KH정보교육원 당산지원

[Java] 14_컬렉션(Collection - List의 메소드, 제네릭)

천재강쥐 2022. 8. 19. 14:46

14_컬렉션(Collection - List의 메소드)

 

E --> Element : 제네릭 (E == Object) == 다형성에 의해서 모든 자식 들어갈 수 있음


1. add(E e) : 해당 리스트의 끝에 전달된 e 를 추가시켜 주는 메소드
[ 표현법 ] 객체명.메소드명();

package com.kh.chap01.list.part01.arrayList.run;

import java.util.ArrayList;
import java.util.List;

import com.kh.chap01.list.part01.arrayList.model.vo.Music;

public class ListRun {
	
	public static void main(String[] args) {
	
		// 기존의 배열을 쓸 경우 => 배열을 쓸 준비 (배열 선언 후 할당)
		// 컬렉션을 쓸 경우 => 컬렉션을 쓸 준비 (컬렉션 객체 생성)
		
		// ArrayList 클래스의 객체 생성
		// ArrayList list = new ArrayList(); // 기본 생성자로 생성할 경우 내부적으로 크기 10짜리인 배열이 만들어짐
		
		ArrayList list = new ArrayList(3); // 매개변수생성자로 생성할 경우 내부적으로 크기 3짜리인 배열이 만들어짐
		System.out.println(list); // [] : 안에 아무것도 없는 상태 (비어 있다)
		
		list.add(new Music("넥스트레벨", "에스파")); // arr[0] = new Music("넥스트레벨", "에스파"); 와 같은 꼴
		list.add(new Music("필마이리듬", "레드벨벳")); // arr[1] = new Music("필마이리듬", "레드벨벳"); 와 같은 꼴
		list.add(new Music("톰보이", "아이들")); // arr[2] = new Music("톰보이", "아이들"); 와 같은 꼴
		list.add("끝"); // arr[3] = "끝"; 과 같은 꼴 => 배열에서는 불가능했던 일!
		
		System.out.println(list);
		// 순서가 유지되면서 값 추가 (각 index에 들어 있는 꼴)
		// 크기에 제약이 없음
		// 다양한 타입의 값을 추가 가능
		
}

// 출력물
[Music [title=넥스트레벨, artist=에스파], Music [title=필마이리듬, artist=레드벨벳], Music [title=톰보이, artist=아이들], 끝]

 

2. add(int index, E e) : 리스트에 전달되는 index 자리에 전달되는 e를 추가시켜 주는 메소드
해당 인덱스 다음 값들을 알아서 뒤로 한 칸씩 밀어 주는 역할 또한 알아서 해 줌

		list.add(1, new Music("던던댄스", "오마이걸"));
		System.out.println(list);
        
// 출력물
[Music [title=넥스트레벨, artist=에스파], Music [title=던던댄스, artist=오마이걸], Music [title=필마이리듬, artist=레드벨벳], Music [title=톰보이, artist=아이들], 끝]

 

3. set(int index, E e) : 리스트에 해당 index의 값을 전달되는 e로 변경시켜 주는 메소드

		list.set(0, new Music("사계", "태연")); // arr[0] = new Music("사계", "태연"); 와 같은 꼴
		System.out.println(list);
        
// 출력물
Music [title=사계, artist=태연], Music [title=던던댄스, artist=오마이걸], Music [title=필마이리듬, artist=레드벨벳], Music [title=톰보이, artist=아이들], 끝]

 

4. remove(int index) : 리스트에 해당 index 자리의 값을 삭제시켜 주는 메소드
삭제 후 기존의 값들을 앞으로 한 칸씩 당겨 주는 역할도 같이 해 줌

		list.remove(1);
		System.out.println(list);
        
// 출력물
[Music [title=사계, artist=태연], Music [title=필마이리듬, artist=레드벨벳], Music [title=톰보이, artist=아이들], 끝]

 

5. size() : 리스트에 담겨 있는 데이터의 수를 반환하는 메소드

System.out.println("list에 담긴 데이터 수 : " + list.size());
System.out.println("list의 마지막 인덱스 : " + (list.size() - 1));

// 출력물
list에 담긴 데이터 수 : 4
list의 마지막 인덱스 : 3

 

6. get(int index) : E => 리스트에 해당 index 위치의 데이터를 반환해 주는 메소드

		// Object obj = list.get(0);
		// Music m = (Music)list.get(0); // 다형성에 의한 DownCasting
		// System.out.println(m);
		System.out.println(list.get(0)); // 오버라이딩 시 형변환 굳이 필요 없음
		System.out.println(((Music)(list.get(0))).getTitle());
		System.out.println("=====================================");
		
		// 0번 ~ 마지막 인덱스까지의 데이터를 출력
		// for문
		for(int i=0; i<list.size(); i++)
			System.out.println(list.get(i));
		
		System.out.println("=====================================");
		
		// 향상된 for문 : for each문 => 배열뿐만 아니라 컬렉션에도 활용 가능!
		// for(값을받아줄변수선언문 : 배열명또는컬렉션명)
		for(Object o : list)
			System.out.println(o);
		
		System.out.println("=====================================");
        
// 출력물
Music [title=사계, artist=태연]
사계
=====================================
Music [title=사계, artist=태연]
Music [title=필마이리듬, artist=레드벨벳]
Music [title=톰보이, artist=아이들]
끝
=====================================
Music [title=사계, artist=태연]
Music [title=필마이리듬, artist=레드벨벳]
Music [title=톰보이, artist=아이들]
끝

 

7. subList(int beginIndex, int endIndex) : 해당 리스트에 beginIndex 자리에서부터 endIndex - 1 자리까지의 값을
새로운 리스트로 부분적으로 뽑아서 반환 (List 타입 반환)

		List sub = list.subList(0, 2); // 0 <= 추출할인덱스범위 < 2
		// => List<Object>
		System.out.println(sub);
		
		System.out.println("=====================================");
        
// 출력물
[Music [title=사계, artist=태연], Music [title=필마이리듬, artist=레드벨벳]]
=====================================

 

8. addAll(Collection c) : 해당 리스트에 다른 컬렉션에 있는 데이터들을 통째로 추가시켜 주는 메소드

 

		list.addAll(sub);
		System.out.println(list);
		
		System.out.println("=====================================");
        
// 출력물
[Music [title=사계, artist=태연], Music [title=필마이리듬, artist=레드벨벳], Music [title=톰보이, artist=아이들], 끝, Music [title=사계, artist=태연], Music [title=필마이리듬, artist=레드벨벳]]
=====================================

 

9. isEmpty() : 해당 리스트가 비어 있으면(size() == 0) true, 비어 있지 않다면 (size() != 0) false 를 반환해 주는 메소드

 

		System.out.println("해당 리스트가 비어 있습니까? : " + list.isEmpty());
        
// 출력물
해당 리스트가 비어 있습니까?: false

 

10. clear() : 해당 리스트를 싹 비워 주는 메소드

		list.clear();
		System.out.println(list);
		System.out.println("해당 리스트가 비어 있습니까? : " + list.isEmpty());
        
// 출력물
[]
해당 리스트가 비어 있습니까? : true

 

 

* 제네릭 (Generic)

<> 안에 어떤 타입을 선언해 주어 해당 컬렉션이 사용할 객체의 타입을 고정시켜 주는 개념

내가 다룰 객체의 타입을 미리 명시하여 내가 사용하고 싶은 데이터 타입만 사용할 수 있게 해 주는 효과

=> 마치 배열처럼 같은 자료형의 값들만 담겠다.

 

별도의 제네릭 제시 없이 컬렉션 객체를 생성하면 (E == Object)

ArrayList list = new ArrayList();

내부적으로 

ArrayList<Object> list = new ArrayList<>();

=> 그래서 아무 자료형이나 다 받아쳐 줄 수 있었던 것!

 

별도의 제네릭 제시를 해서 컬렉션 객체를 생성하면 (E == Music)

ArrayList<Music> list = new ArrayList<>();

 

* 제네릭을 설정하는 이유

1. 명시한 타입의 객체만 저장 가능하도록 타입의 제한을 두기 위해

2. 컬렉션에 저장된 객체를 꺼내서 사용할 때 매번 형변환 하는 절차를 없애기 위해

 

* 제네릭 설정 시 주의할 점

컬렉션에는 객체 타입만 들어갈 수 있기 때문에 기본 자료형으로 설정은 불가!!

예) ArrayList<int> list = new ArrayList<>(); // 불가

ArrayList<Integer> list = new ArrayList<>(); // 가능 => E == Integer

 

[ 표현법 ]

컬렉션명<자료형> 객체명 = new 컬렉션명<>();
=> new 구문에 있는 제네릭 설정 부분에는 자료형 생략 가능 (JDK 8버전부터 가능한 문법)

package com.kh.chap01.list.part01.arrayList.run;

import java.util.ArrayList;
import java.util.List;

import com.kh.chap01.list.part01.arrayList.model.vo.Music;

public class GenericListRun {
	
	public static void main(String[] args) {
		
		ArrayList<Music> list = new ArrayList<>(3);
		System.out.println(list); // 비어 있는 상태
    }
}

// 출력물
[]

 

E --> Element : 제네릭 (E == Music)
1. add(E e)

순서가 유지되면서 값 추가 (각 index 에 들어 있는 꼴)
크기에 제약 없음
다양한 타입의 값을 넣을 수 없음 => 제네릭 설정을 했기 때문

		list.add(new Music("넥스트레벨", "에스파"));
		list.add(new Music("필마이리듬", "레드벨벳")); 
		// list.add("끝"); => Music의 객체가 아니므로 add 불가함
		System.out.println(list);
	}
    
// 출력물
[Music [title=넥스트레벨, artist=에스파], Music [title=필마이리듬, artist=레드벨벳]]

 

2. add(int index, E e)

		// list.add(1, "끝"); => Music 타입의 객체가 아니기 때문에 안 됨
		list.add(1, new Music("던던댄스", "오마이걸"));
		System.out.println(list);
        
// 출력물
Music [title=넥스트레벨, artist=에스파], Music [title=던던댄스, artist=오마이걸], Music [title=필마이리듬, artist=레드벨벳]]

 

3. set(int index, E e)

		// list.set(0,  "사계");
		list.set(0, new Music("사계", "태연"));
		System.out.println(list);
        
// 출력물
[Music [title=사계, artist=태연], Music [title=던던댄스, artist=오마이걸], Music [title=필마이리듬, artist=레드벨벳]]

 

4. remove(int index)

		list.remove(1);
		System.out.println(list);
        
// 출력물
[Music [title=사계, artist=태연], Music [title=필마이리듬, artist=레드벨벳]]

 

5. size()

		System.out.println("리스트에 담긴 데이터 수 : " + list.size());
		System.out.println("리스트의 마지막 인덱스 : " + (list.size() - 1));
        
// 출력물
리스트에 담긴 데이터 수 : 2
리스트의 마지막 인덱스 : 1

 

6. get(int index) : Music 타입 반환

제네릭이 아닐 때는 다형성에 의한 DownCasting으로 인해 강제 형변환 해 줘야 했지만,

Object obj = list.get(0);

Music m = (Music)list.get(0);

제네릭 설정 후에는 다형성에 의한 UpCasting으로 인해 자동 형변환되어 굳이 형변환 할 필요 없음

Object obj = list.get(0);

Music m = list.get(0);

		// Object obj = list.get(0); // 다형성에 의해서 UpCasting
		Music m = list.get(0);
		System.out.println(m);
		System.out.println(list.get(0));
		System.out.println(list.get(0).getTitle());
		
		System.out.println("=====================================");
		
		// 0번 ~ 마지막 인덱스까지의 데이터를 출력
		// for문
		for(int i=0; i<list.size(); i++)
			System.out.println(list.get(i));
		System.out.println("=====================================");

		// 향상된 for문
		// for(값을받아줄선언문 : 배열명또는컬렉션명)
		for(Music music : list)
			System.out.println(music);
		
		System.out.println("=====================================");
        
// 출력물
Music [title=사계, artist=태연]
Music [title=사계, artist=태연]
사계
=====================================
Music [title=사계, artist=태연]
Music [title=필마이리듬, artist=레드벨벳]
=====================================
Music [title=사계, artist=태연]
Music [title=필마이리듬, artist=레드벨벳]
=====================================

 

7. subList(int beginIndex, int endIndex)

		List<Music> sub = list.subList(0, 1);
		System.out.println(sub);
		
		System.out.println("=====================================");
        
// 출력물
[Music [title=사계, artist=태연]]
=====================================

 

8. addAll(Collection c)

		list.addAll(sub);
		System.out.println(list);
		
		System.out.println("=====================================");
        
// 출력물
[Music [title=사계, artist=태연], Music [title=필마이리듬, artist=레드벨벳], Music [title=사계, artist=태연]]
=====================================

 

9. isEmpty()

		System.out.println("해당 리스트가 비어 있습니까? : " + list.isEmpty());
        
// 출력물
해당 리스트가 비어 있습니까? : false

 

10. clear()

		list.clear();
		System.out.println(list);
		System.out.println("해당 리스트가 비어 있습니까? : " + list.isEmpty());
        
// 출력물
[]
해당 리스트가 비어 있습니까? : true