본문 바로가기
Java/Java

컬렉션) 컬렉션 프레임 워크란? 배열의 단점, 컬렉션 사용 이유

by 박채니 2022. 3. 30.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


컬렉션이란?

- 동일한 타입을 묶어 관리하는 자료 구조

 

컬렉션 프레임워크란?

- 리스트, 스택, 큐, 트리 등의 자료구조에 정렬, 탐색 등의 알고리즘을 구조화해 놓은 프레임워크

- 여러 개의 데이터 묶음 자료를 효과적으로 처리하기 위해 구조화된 클래스 또는 인터페이스의 모음

 

컬렉션의 특성에 따라 구분하면 크게 List<E>, Set<E>, Map<K, V>로 나뉩니다.

메모리의 입출력 특성에 따라 기존 컬렉션 기능을 확장/조합한 Stack<E>, Queue<E>도 있습니다.(사진에선 누락)

 


 

사실 개념상(여러 개의 데이터 묶음 자료를 효과적으로 처리)으로만 본다면 배열과 크게 다른 점은 없어보입니다.

리스트를 사용하는 이유에 대해서 먼저 알아보겠습니다.

 

☞ 리스트를 사용하는 이유

 

배열의 문제점

public class ArryStudent {
	private int no;
	private String name;
	
	public ArryStudent() {
		super();
		// TODO Auto-generated constructor stub
	}
	public ArryStudent(int no, String name) {
		super();
		this.no = no;
		this.name = name;
	}
	
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "ArryStudent [no=" + no + ", name=" + name + "]";
	}
}

학생 정보를 관리하는 VO 클래스를 구현하였습니다.

 

ArryStudent[] students = new ArryStudent[3];
students[0] = new ArryStudent(1, "홍길동");
students[1] = new ArryStudent(2, "신사임당");
students[2] = new ArryStudent(3, "세종대왕");

for(ArryStudent s : students) {
	System.out.println(s);
}

@콘솔출력값
ArryStudent [no=1, name=홍길동]
ArryStudent [no=2, name=신사임당]
ArryStudent [no=3, name=세종대왕]

ArryStudent 배열을 만들어 학생 객체를 입력 받아 할당하였습니다.

 

여기서 만약, 2명의 학생 정보가 추가되어야 한다고 하였을 때 배열은 크기 변경이 불가하므로 크기가 큰 배열을 재생성하여 복사해야 합니다.

ArryStudent[] students = new ArryStudent[3];
students[0] = new ArryStudent(1, "홍길동");
students[1] = new ArryStudent(2, "신사임당");
students[2] = new ArryStudent(3, "세종대왕");
		
//학생 2명 추가
ArryStudent[] students2 = new ArryStudent[10];
System.arraycopy(students, 0, students2, 0, students.length);
students2[3] = new ArryStudent(4, "이순신");
students2[4] = new ArryStudent(5, "장영실");
	
for(ArryStudent s : students) {
	System.out.println(s);
}

@콘솔출력값
ArryStudent [no=1, name=홍길동]
ArryStudent [no=2, name=신사임당]
ArryStudent [no=3, name=세종대왕]
ArryStudent [no=4, name=이순신]
ArryStudent [no=5, name=장영실]
null
null
null
null
null

추후 학생 정보가 더 입력될 수도 있기 때문에 넉넉하게 배열의 공간을 할당하여 복사해 학생 2명의 정보를 입력하였습니다.

 

하지만 또 세종대왕 학생의 정보를 삭제 해야 한다고 하면 어떻게 될까요?

세종대왕 학생의 인덱스를 찾아 null 값을 주면 되겠지만 그렇게 되면 중간이 뻥 띄워져버리는 것이겠죠.

학생 정보 관리이기 때문에 학생 하나가 삭제 되면 그 자리를 뒷 번호 친구들이 당겨서 채워줘야 합니다.

ArryStudent[] students = new ArryStudent[3];
students[0] = new ArryStudent(1, "홍길동");
students[1] = new ArryStudent(2, "신사임당");
students[2] = new ArryStudent(3, "세종대왕");
		
//학생 2명 추가
ArryStudent[] students2 = new ArryStudent[10];
System.arraycopy(students, 0, students2, 0, students.length);
students2[3] = new ArryStudent(4, "이순신");
students2[4] = new ArryStudent(5, "장영실");
		
//학생 1명 삭제(세종대왕)
students2[2] = students2[3];
students2[3] = students2[4];
students2[4] = null;

for(ArryStudent s : students2) {
	System.out.println(s);
}

@콘솔출력값
ArryStudent [no=1, name=홍길동]
ArryStudent [no=2, name=신사임당]
ArryStudent [no=4, name=이순신]
ArryStudent [no=5, name=장영실]
null
null
null
null
null
null

바로 이렇게 말이죠....

 

겨우겨우 세종대왕의 정보를 삭제하였지만, 또 학생 1명을 1번지에 추가해야 한다고 하면, 또! 위 작업을 반복해줍니다.

ArryStudent[] students = new ArryStudent[3];
students[0] = new ArryStudent(1, "홍길동");
students[1] = new ArryStudent(2, "신사임당");
students[2] = new ArryStudent(3, "세종대왕");
		
//학생 2명 추가
ArryStudent[] students2 = new ArryStudent[10];
System.arraycopy(students, 0, students2, 0, students.length);
students2[3] = new ArryStudent(4, "이순신");
students2[4] = new ArryStudent(5, "장영실");
		
//학생 1명 삭제(세종대왕)
students2[2] = students2[3];
students2[3] = students2[4];
students2[4] = null;
		
//학생 1명 추가(1번지에 추가)
students2[4] = students2[3];
students2[3] = students2[2];
students2[2] = students2[1];
students2[1] = new ArryStudent(100, "논개");
		
for(ArryStudent s : students2) {
	System.out.println(s);
}

@콘솔출력값
ArryStudent [no=1, name=홍길동]
ArryStudent [no=100, name=논개]
ArryStudent [no=2, name=신사임당]
ArryStudent [no=4, name=이순신]
ArryStudent [no=5, name=장영실]
null
null
null
null
null

이렇듯 크기 변경 불가(넉넉하게 크기 할당하다보니 메모리 낭비 발생) 등의 배열 특성으로 인하여 많은 데이터를 관리할 때는 위와 같은 문제점이 발생합니다.

 

이러한 배열의 문제점을 컬렉션 프레임워크를 통해 해결해줄 수 있습니다.

 

LIST