Programming Language/Java

컬렉션(Collection) (1) - 컬렉션, ArrayList

Ma_Sand 2022. 3. 16. 00:59
반응형

1. 컬렉션(Collection)

  : 자료구조가 내장되어 있는 클래스로, Java에서 제공하는 자료구조를 담당하는 프레임워크이다.

   ⇒ 간단히 말해, 데이터들을 추가 및 삭제, 수정하는 기능들을 이미 정의해놓은 틀이라고 할 수 있다.

       *자료구조: 데이터를 효율적으로 다룰 때 필요한 개념

         프레임워크: 기능들이 이미 정의돼 있는 틀

 

 (1) 컬렉션을 사용하는 이유

   ① 배열을 사용했을 때

     ⓐ 타입의 종류가 하나인 데이터만 저장할 수 있다.

     ⓑ 배열을 사용하려고 할 때엔 배열의 크기를 먼저 지정해야 한다.

       → 한 번 지정된 배열의 크기는 변경할 수 없다. 그래서 새로운 값을 추가함으로 인해 배열 크기를 늘려야 할

           경우 배열을 그 크기에 맞게 새로 만들어야 한다.

     ⓒ 배열의 중간 위치에 데이터를 추가 및 삭제하는 경우에 기존 데이터를 밀거나 당기는 코드를 작성해야 한다.

 

   ② 컬렉션을 사용했을 때

     ⓐ 여러 종류의 타입의 데이터들을 저장할 수 있으며, 제네릭 설정을 통해 같은 타입의 데이터들로만 묶어서도

         저장할 수 있다.

     ⓑ 배열과 달리 크기를 지정하지 않아도 컬렉션이 자동으로 지정해준다. 만약 기존 크기보다 더 많은 데이터를

         추가하여 기존 크기를 넘어설 경우에는 그 크기 만큼 알아서 지정해준다.

     ⓒ 중간에 데이터를 추가 및 삭제하는 경우, 배열은 코드를 따로 작성해야 했다면, 컬렉션은 기존 데이터를 밀거나

         당기는 코드가 이미 메소드로 정의되어 있어서 필요할 때마다 해당 메소드를 호출하기만 하면 된다.

 

        방대한 데이터들을 조회의 기능으로만 사용할 것이면 배열을 사용하는 것이 효과적이고,

           이 데이터들을 추가 및 삭제, 수정을 할 것이라면 컬렉션을 사용하는 것이 효과적이다.

 

 

 (2) 종류

  값(value) 저장 값 저장 시 순서 유지 중복값 허용
List 계열 담으려는 값(value)만 저장 O
(index 개념)
O ArrayList, Vector, LinkedList
Set 계열 " X
(index 개념X)
X HashSet, TreeSet,
LinkedHashSet, ...
Map 계열 키(key) + 값(value) 세트로 저장 " O
(단, 중복키 허용X)
HashMap, HashTable,
TreeMap, Properties, ...

 

 

 

2. ArrayList

 (1) 표현법

ArrayList 이름 = new ArrayList(); // 크기 지정X

ArrayList 이름 = new ArrayList(크기);  // 크기 지정

 

 

 (2) 크기를 지정했을 때

ArrayList list = new ArrayList(4);  // 크기 4 지정

list.add(10);  // int
list.add("안녕");  // String
list.add(10.5);  // double
list.add(true);  // boolean
list.add('A');  // char

System.out.println(list);

// 출력값: [10, 안녕, 10.5, true, A]

 → 크기를 4로 지정해주었는데, 배열이었다면 배열의 크기를 벗어나서 오류가 발생했을 것인데, 컬렉션은 자동으로

     데이터 수 만큼 크기를 늘려 A까지 출력하였다. 그리고 데이터 타입을 따로 지정하지 않았는데도 해당 타입에

     맞게 잘 출력되었다.

 

 

 (3) 활용

public class Music {

	private String title;  // 제목
	private String artist;  // 가수
	
	public Music() {  // 기본 생성자

	}
	public Music(String title, String artist) {  // 매개변수 생성자
		super();
		this.title = title;
		this.artist = artist;
	}
	public String getTitle() {  // getter/setter 메소드
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getArtist() {
		return artist;
	}
	public void setArtist(String artist) {
		this.artist = artist;
	}
	@Override
	public String toString() {  // 오버라이딩
		return "Music [title=" + title + ", artist=" + artist + "]";
	}
}

Music이라는 클래스를 만들었다. 이 Music 클래스를 바탕으로 하여 Music을 실행할 새로운 클래스를 생성한다.

그리고 add() 메소드를 사용하여 list에 넣을 값들을 입력한다.

 

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

import com.cd.list.arrayList.model.vo.Music;

public class ListRun {

	public static void main(String[] args) {
    
        ArrayList list = new ArrayList();  // 크기 지정X
    
        // 값을 넣는 방법 1
        // Music 클래스를 호출하여 값을 넣고 list에 대입하기
        Music m = new Music("NEXT LEVEL", "에스파");  // title, artist
        list.add(m);
    
        // 값을 넣는 방법 2
        // 위 방법 1을 한 줄로 간략하게 적기
        list.add(new Music("피카부", "레드벨벳"));
        list.add(new Music("마.피.아", "있지"));
        list.add(new Music("휘파람", "블랙핑크"));
    
    }
}

이 실행 클래스로 ArrayList를 어떤 기능으로 활용할 수 있을 지 알아보겠다.

 

   ① 값을 수정하기

     : add() 메소드를 사용한다. 여기에 인덱스 번호를 추가하면 그 인덱스 번호에 새로운 값이 들어가고,

       해당 인덱스에 존재하던 기존 값은 새로 들어온 값의 뒤로 밀린다. 

// list.add(인덱스번호, new Music(" ", " "));
list.add(1, new Music("Gucci", "제시");

위의 예시를 보면, 1번 인덱스에 'Gucci, 제시'를 넣음으로 원래 1번 인덱스에 있던 '피카부, 레드벨벳'이 2번 인덱스로 밀려나고 그 뒤에 있던 다른 값들도 함께 밀려난다.

 *현 순서: [NEXT LEVEL, 에스파], [Gucci, 제시], [피카부, 레드벨벳], [마.피.아, 있지], [휘파람, 블랙핑크]

 

 

   ② 값을 삭제하기

     : remove() 메소드를 사용한다. 삭제하고픈 인덱스 번호를 입력하면 해당 인덱스 값이 삭제된다.

// list.remove(인덱스 번호);
list.remove(2);

위의 예시를 보면, 2번 인덱스 값을 삭제하려고 한다. 그럼 현재 2번 인덱스에 있는 '피카부, 레드벨벳'이 삭제되고 그 뒤에 있던 값들이 2번 인덱스의 빈 공간을 채우기 위해 앞으로 당겨진다.

이때 주의할 점! list에 없는 인덱스 번호로 접근할 땐 배열과 같이 'IndexOutOfBoundsException'이 발생한다. 그러므로 삭제하고 싶은 인덱스가 있으면 아래 size() 메소드를 사용해서 먼저 크기를 알아보는 것이 좋겠다.

 *현 순서: [NEXT LEVEL, 에스파], [Gucci, 제시], [마.피.아, 있지], [휘파람, 블랙핑크]

 

 

   ③ list의 크기 확인하기

     : size() 메소드를 사용한다.

// 출력을 해야 크기를 알 수 있으므로 출력문을 이용한다.
System.out.println(list.size());

현재까지 값을 수정하고, 삭제해봤는데 현재 list의 크기는 4이다. 위에서 값을 수정했을 때엔 크기가 5지만, 다시 값을 삭제했으므로 4가 되었다.

 

 

   ④ list의 인덱스 번호반환하기

     : get() 메소드를 사용한다.(반환형: Object형)

// get() 메소드에 반환하고 싶은 인덱스 번호를 입력하여 출력문으로 출력한다.
System.out.println(list.get(3));

3번 인덱스 값을 반환한다. 현재 3번 인덱스에는 '휘파람, 블랙핑크'가 있으므로 '휘파람, 블랙핑크'가 반환된다.

 

 

   ⑤ list의 인덱스 번호제목/가수반환하기

     : 위 ④의 get() 메소드로 값을 반환한 후 제목을 반환하는 메소드인 getTitle() / 가수를 반환하는 메소드인

        getArtist()를 사용한다.

// Music으로 형변환한 후 제목/가수를 반환할 수 있다.
((Music)list.get(0)).getTitle();
((Music)list.get(1)).getArtist();

// 제목/가수를 반환할 때 getTitle()/getArtist()를 빼고 출력하면 제목과 가수 둘다 반환되므로
// getTitle()/getArtist()도 함께 출력해야 한다.
System.out.println(((Music)list.get(0)).getTitle());
System.out.println(((Music)list.get(1)).getArtist());

제목은 0번 인덱스에 있는 제목으로, 가수는 1번 인덱스에 있는 가수로 반환한다. 제목은 현재 0번 인덱스에 있는 'NEXT LEVEL'이 반환되고, 가수는 현재 1번 인덱스에 있는 '제시'가 반환된다.

 

 

   ⑥ list에 있는 모든 제목&가수를 반환하기

     : 위 ⑤를 응용하면 된다. 현재 인덱스가 3번까지 있는데 값이 몇 개 안되므로 ⑤처럼 인덱스 번호를 0부터 3까지

       일일이 입력해서 출력할 수도 있지만, 만약 수많은 값이 있다면 굉장히 번거로워지고 보기에도 불편하다. 

       그런데 0부터 3까지 입력을 해보면 인덱스 번호만 바뀐다는 일정한 규칙이 보인다. 이때 for문을 사용하여

       인덱스 번호만 반복적으로 반환하면 된다.

// 모든 값을 반환하면 되므로 list의 크기만큼 반복하면 된다.
// list의 크기를 반환할 때 사용하는 메소드는 size()
for(int i = 0; i < list.size(); i++) {
    System.out.println(((Music)list.get(i)).getTitle());
    System.out.println(((Music)list.get(i)).getArtist());
}

 

 

   ⑦ 향상된 for문으로 제목/가수만 반환하기

     : 향상된 for문은 순차적으로 배열 또는 컬렉션을 반복하는 for문이다. 

// for(값을 받을 타입  변수명 : 접근할 배열/컬렉션) {}
for(Object o : list) {
    System.out.println(((Music)o).getTitle());
}

for(Object o : list) {
    System.out.println(((Music)o).getArtist());
}

 

 

 

   ⑧ list의 일부분만 뽑아내기

     : subList() 메소드를 사용한다. 뽑아내고 싶은 인덱스의 시작 번호와 끝 번호를 입력한다.

list.subList(1, 3);
System.out.println(list);

1번 인덱스부터 3번 인덱스까지의 값을 뽑아낸다. 그럼 '[Gucci, 제시], [마.피.아, 있지], [휘파람, 블랙핑크]'가 출력된다.

 

 

   ⑨ list와 list를 합치기

list.addAll(sub);
System.out.println(sub);

 

 

   ⑩ list가 비어있는지 확인하는 메소드 isEmpty()

     : list가 비어있으면 true, 비어있지 않으면 false를 출력한다.

System.out.println(list.isEmpty());

 

 

   ⑪ list를 전체 삭제하는 메소드 clear()

     : list에 저장된 값을 모두 삭제한다.

list.clear();

 

반응형