-
Notifications
You must be signed in to change notification settings - Fork 1
Day 19(21.10.01)
- Framework : 소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합
- Library : 단순 활용이 가능한 도구들의 집합
이 둘의 차이는 결국 누가 제어권을 가지고 있는지에서 발생한다. Framework는 자체적으로 흐름을 가지고 있으며, 사용자가 그 안에 필요한 코드를 작성한다. 반면, Library는 사용자가 흐름을 제어하며 상황에 따라 가져다 쓰는 것이다. 쉽게 말하면
우리는 Library에게 무엇을 해야할지 알려주고, Framework는 우리에게 무엇을 해야할지 알려주는 것이다.
List는 순서를 가지는 원소들의 모임으로 중복된 원소를 가질 수 있다. 또한, 배열과 마찬가지로 위치(인덱스)를 사용하여 원소에 접근한다.
본 문서에서는 ArrayList 하나만을 다룬다. LinkedList에 대한 설명은 추후 기재할 예정이다.
ArrayList는 원소들을 인덱스로 접근하여 사용한다는 부분에서 배열과 유사하다. 하지만 왜 ArrayList를 사용하는 것일까? 그것은, 배열의 구조적인 문제점에서 확인할 수 있는데, 배열은 생성할때 그 크기가 고정된다는 것이다. 추가되는 데이터가 기존의 배열의 인덱스 수를 초과하면 초과되는 데이터를 저장할 수 없다. 그렇다고 처음에 배열을 생성할때 그 크기를 크게 설정하면 공간 낭비가 상당할 것이다. 이를 해결하기 위해, ArrayList는 저장되는 데이터의 갯수에 따라 크기가 자동으로 변경된다.
ArrayList는 타입 파라미터를 가지는 제네릭 클래스로 제공된다. 따라서, ArrayList를 생성하려면 타입 파라미터를 지정해야 한다. 예를 들어, 저장하려는 데이터의 타입이 문자열이라면 아래와 같이 생성한다.
ArrayList<String> list = new ArrayList<String>();생성된 ArrayList 객체에 데이터를 저장하려면 'add()' 메소드를 사용한다. 위치를 지정해서 저장할 수도 있다.
list.add("Milk");
list.add("Bread");
list.add("Butter");
list.add(0, "Heavy Cream"); -> 별도의 명령어가 없이도 해당 인덱스의 자료를 수정할 수 있다.특정한 위치에 있는 데이터를 수정하려면 'set()' 메소드를 사용한다.
list.set(3, "Ginger"); -> 3번 인덱스에 Ginger 추가, ArrayList의 크기는 가변적이므로 추가해서 계속 이어나갈 수 있다.데이터를 삭제하려면 'remove()' 메소드를 사용한다.
list.remove(1);import java.util.ArrayList;
public class ArrayListTest {
public static void main(String args[]) {
ArrayList<String> list = new ArrayList<String>();
list.add("Milk");
list.add("Bread");
list.add("Butter");
list.add(3, "Ginger"); //3번 인덱스에 Ginger 추가, ArrayList의 크기는 가변적이므로 추가해서 계속 이어나갈 수 있다.
list.set(0, "Heavy Cream"); //별도의 명령어가 없이도 해당 인덱스의 자료를 수정할 수 있다.
list.remove(1);// 1번 인덱스의 자료 삭제. 삭제된 자료는 공란으로 남지않고 뒤에 있던 자료들이 한 칸씩 당겨지는 구조다. LinkedList와의 가장 큰 차이점.
for(int i=0; i<list.size();i++) {
System.out.println(list.get(i));
}
//for-each 구문을 활용해 list 객체에 있는 모든 데이터를 불러올 수 있다.
System.out.println("--------------");
for(String s : list) {
System.out.println(s);
}
}
}Result
Heavy Cream
Butter
Ginger
--------------
Heavy Cream
Butter
Ginger
ArrayList에 있는 모든 데이터를 출력하려면 for-each 루프를 사용하는 것이 좋다.
List는 원소 간의 순서가 존재한다는 것을 확인했다. 하지만 순서에 상관없이 자료를 저장하고 싶은 경우에 사용하는 자료 구조가 Set(집합)이다. 때문에 집합의 특성상 Set은 중복된 자료를 저장할 수 없다. 자바에서는 Set Interface에 대해 HashSet, TreeSet, LinkedHashSet. 이렇게 세가지가 구현되어 있다. 이 중에서도 HashSet은 Hash Table에 자료를 저장하기 때문에 성능이 가장 뛰어나다. 하지만, 원소들의 순서가 일정하지 않다는 단점이 있다. 본 문서에서는 먼저 예시를 통해 HashSet에 대해 정리하고자 한다.
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("Milk");
set.add("Butter");
set.add("Cheese");
set.add("Butter");
set.add("Ham");
set.add("Ham");
for (String s:set) {
System.out.println(s);
}
}
}Result
Ham
Butter
Cheese
Milk
메소드는 Collection 인터페이스가 동일하게 갖고 있기에 동일하다. 다만, Set의 특징상 중복된 자료는 저장되지 않기에 "Ham"과 "Butter"가 중복으로 표시되지 않는다.