우연히 Java 관련 알고리즘 문제를 풀고 풀이 과정을 듣는 중 ArrayList라는 클래스가 눈에 보였다.
(어... 이거 뭐였지?.. )하는 생각이 내 눈앞에 빠르게 지나갔는데...
Array는 배열이였고.. List는 리스트? 그럼 ArrayList는? 뭐였지?...
그래서 풀이를 잠시 중단하고 ArrayList에 대해 짚고 넘어가고자 한다.
1. ArrayList
ArrayList는 자바에서 기본적으로 많이 사용되는 클래스로 자바의 List 인터페이스를 상속받은 여러 클래스 중 하나이다. 일반 배열과 동일하게 연속된 메모리 공간을 사용하는데, 배열과 마찬가지로 인덱스는 0부터 시작한다.
차이점은 배열은 크기가 고정이지만, ArrayList는 크기가 가변적으로 변한다. 내부적으로 저장이 가능한 메모리 공간(Capacity)가 있는데, 현재 사용중인 공간의 크기(Size)가 있다. 만약 현재 가용량(Capacity) 이상을 저장하려고 한다면, 더 큰 공간의 메모리를 새롭게 할당해야 한다. 이 때, ArrayList를 사용한다
ArrayList<Integer> integers1 = new ArrayList<Integer>(); // 타입 지정
ArrayList<Integer> integers2 = new ArrayList<>(); // 타입 생략 가능
ArrayList<Integer> integers3 = new ArrayList<>(5); // 초기 용량(Capacity) 설정
ArrayList<Integer> integers4 = new ArrayList<>(integers1); // 다른 Collection값으로 초기화
ArrayList<Integer> integers5 = new ArrayList<>(Arrays.asList(2, 4, 6, 8, 10)); // Arrays.asList()
위 소스 코드를 보면 타입을 지정할 수 있으며, 생략도 가능하다. 또한 초기 용량을 설정도 가능하며 , 가변 인자를 전달받는 Arrays.asList()를 사용하면 기본 값들로 생성 가능하다.
만약 ArrayList에 내가 다른 값을 추가하고싶다면 어떻게 해야할까?
ArrayList에 다른 값을 추가하고 싶다, add()메소드를 통해 값을 추가할 수 있다. 또한 set()메소드를 통해 기존에 추가된 값을 변경하는 것도 가능하다.
public class ArrayList{
public static void main(String[] args) {
ArrayList<String> food = new ArrayList<>();
// add() method를 사용해 값을 추가하기
// 데이터가 순차적으로 들어가는데, 아래의 코드처럼 위치를 지정할 수 있다.
food.add("pizza");
food.add("pie");
food.add(0, "pasta"); //
// set() method
food.set(1, "cookie");
System.out.println(food);
food.remove
}
}
이렇게 add()와 set()을 통해 값을 추가, 변경 할 수 있는데, 그럼 값을 삭제하고 싶다면 어떻게 해야할까?
추가했던 값을 삭제하기 위해선 remove() 메소드를 호출해 사용하면 된다.
(clear()메서드를 사용해서 전체 삭제도 가능하다.)
public class ArrayList{
public static void main(String[] args) {
ArrayList<String> food = new ArrayList<>();
food.add("pizza");
food.add("pie");
food.add(0, "pasta"); //
System.out.println(food);
//remove를 이용해 추가했던 값 삭제하기.
food.remove("pie");
System.out.println(food);
//전체 삭제하기
food.clear();
}
}
그럼 ArrayList에 저장된 전체 값을 확인하려면 어떻게 해야할까?
Java에서는 다양한 문법을 사용해 모든 값들을 순회해서 출력할 수 있다.
반복문을 이용해서 값을 출력할 수 있는데, 이때 for문, for-each문 등 다양하게 사용이 가능하다. 2번에 for-each문에 대해 다뤄볼려고 하는데, 바로 이어서 정리해야겠다.
2. for-each
우선 java와 다른 언어인 C언어를 생각해보면 과연 우리가 배열에 데이터를 저장하고, 데이터를 출력하기 위해서는 어떤 방식을 사용했을까? 일반적으로 반복문을 이용해 데이터를 출력했던 기억이 난다. 또한 while문을 통해 루프를 돌려 출력하고 몇 가지의 방식이 있었다. 마찬가지로 Java에서도 동일하게 지원한다. 그 중 for-each 문에 대해 설명하자면 for - each문은 매우 직관적이다.
1) 일반적인 for문
for(int i=0; i<n; i++){
조건식
}
for(초기값, 종료되는 조건, 값의 증감){
조건식
}
일반적인 for문은 윗 코드와 비슷하게 동작하는데, 초기값을 주고, 종료되는 조건과 값의 증감을 통해 반복적으로 내가 원하는 행위를 수행한다.
2) for-each 문
for(String x : food)
{
조건식
}
for(각 요소 값(자료형 및 이름) : 배열이나 컨테이너 값){
조건식
}
윗 코드는 for-each 문으로 각 요소값이 들어가고, (:) 다음엔 배열이나 컨테이너 값이 들어가고, 반복문 속에는 내가 원하는 동작을 행하는 조건식이 있다. 1번과 2번을 비교하자면 코딩의 양이 적어지고, 코드가 직관적으로 변해 가독성이 높아지는 장점이 있다. (배열, Arraylist, 루프를 돌릴 수 있는 자료형이여야 한다)
2번의 소스코드를 통해 for-each문을 설명하자면
String x : 이 부분은 food 배열의 요소 값을 순차적으로 x에 전달한다
food : 는 iterator 즉 배열이나 컨테이너 등 여러 데이터가 저장된 변수이다.
아래의 소스코드는 Arraylist에 저장된 전체 값을 확인하기 위한 방법들이다. (for-each 포함)
ArrayList<String> food = new ArrayList<>(Arrays.asList("pizza", "pie", "pasta", "toast"));
1)
for(String x: food){
System.out.println(food +" ");
}
System.out.println("---------------------------");
2)
for(int i=0; i<food.size(); i++){
System.out.print(food.get(i)+ " ");
}
System.out.println();
System.out.println("------------------------");
3)
Iterator<String> iterator = food.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next() +" ");
}
System.out.println("----------------------");
4)
ListIterator<String> listIterator = food.listIterator(food.size());
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous() + " ");
}
System.out.println("----------------------");
1) 2번에서 설명했던 for-each구문을 적용한 코드로
출력 결과는 다음과 같다. (일반적인 배열이 아니라 Arraylist여서 행과 열의 숫자에 맞게 출력)
2) 일반적으로 우리가 아는 반복문을 통해 출력이 가능하다.(size자리에 length가 들어가도 동작.)
(자바에서 길이를 반환할 떄 메서드 또는 프로퍼티로 length, length(), size()를 사용할 수 있다.)
length는 배열을, length는 문자열을(String Object), size()는 컬렉션 프레임워크 타입(Arraylist 등)을 반환하는 데이터 타입니다.
쉽게 설명해 length는 배열의 길이를 알고자 할 때, length()는 문자열의 길이를 알고자 할 때, size()는 컬렉션프레임워크 타입의 길이를 알고자 할 때 사용한다.
'Language > Java' 카테고리의 다른 글
오버로딩(overloading) (0) | 2022.01.20 |
---|---|
클래스 메서드(static)와 인스턴스 메서드 (static은 무엇일까) (0) | 2022.01.20 |
Java의 이해(객체와 메모리) (0) | 2022.01.17 |
1) 객체 지향 프로그래밍 및 클래스 제작과 객체 생성 그리고 변수와 메서드) (0) | 2022.01.17 |
Java에 대한 기본적인 이해(배열과 메모리 그리고 조건문, 반복문) (0) | 2022.01.17 |