자료구조

ArrayList 구조

커피마시기 2023. 11. 1. 00:12

 

■ ArrayList

ArrayList는 List 인터페이스를 구현한 구체적인 클래스 중 하나로서 크기가 가변적으로 변하는 선형리스트이다. 기존의 배열으로는 자료를 담고 관리하는데 불편한점이 있어 나온 것이 ArrayList이다.

 

 

 

 

 

● 특징

  • 연속적인 데이터의 리스트 
  • ArrayList 클래스는 내부적으로 Object 배열을 이용하여 요소를 저장한다
  • 배열을 이용하기 때문에 인덱스를 이용해 요소에 빠르게 접근 할 수 있다
  • 배열은 크기가 고정되어 있어 불편함이 있지만 ArrayList는 데이터 적재량에 따라 가변적으로 공간을 늘리거나 줄일 수 있어 동적 할당에 해당된다
  • 데이터를 리스트 중간에 삽입&삭제 할 경우 , 중간에 빈 공간이 발생하지 않도록  요소의 위치를 앞뒤로 자동으로 이동시키므로 삽입&삭제의 동작은 느려 조회를 하는 경우에 사용하는 것이 좋다

 

 

 

● 배열과 ArrayList 차이

구분 배열 ArrayList
정적 할당 동적 할당
길이가 정해져  있으며 길이를 변경할 수 없다 공간이 꽉차면 자동으로 크기를 늘린다
index의 데이터를 삭제하면 해당 index는 빈공간으로 남는다 index의 데이터를 삭제하면 자동으로 요소의 위치를 이동시킨다
length size()

 

 

 

 

 


 

 

 

●  사용방법

<> 제네릭에 타입명 지정
ArrayList<E> list = new ArrayList<>();

// Integer 타입 객체 
ArrayList<Integer> list = new ArrayList<>();

// 초기 크기 지정
ArrayList<Integer> list = new ArrayList<>(10);

// 배열을 넣어 생성
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(10,20,30));

 

 

 

 

 

● 요소 추가

ArrayList에 요소를 추가할 때 제네릭 타입 파라미터로 명시된 타입의 데이터만 추가 가능하다

addAll() 메소드를 통해 컬렉션 자체를 그대로 받아와 list에 추가 할 수도 있다

ArrayList<Integer> list = new ArrayList<>();
		
list.add(10);
list.add(20);
list.add(30);
	public static void main(String[] args) {

		ArrayList<Integer> list = new ArrayList<>();
		ArrayList<Integer> list2 = new ArrayList<>();
		
		list.add(10);
		list.add(20);
		list.add(30);
		
		list2.add(40);
		list2.add(50);
		
		list.addAll(list2);
		
		System.out.println(list);
	}
}

결과

 

 

 

 

요소 삭제

요소의 삭제를 하게 될 경우 나머지 요소들이 삭제된 빈 공간을 채우기 위해 이동하게된다

	public static void main(String[] args) {

		ArrayList<Integer> list = new ArrayList<>();
		ArrayList<Integer> list2 = new ArrayList<>();
		
		list.add(10);
		list.add(20);
		list.add(30);
		
		list2.add(40);
		list2.add(50);
		
		list.addAll(list2);
		
		System.out.println(list);
		
       		// 해당 인덱스 자리의 요소를 삭제한다
		list.remove(4);
		// list.clear 모든 값 제거
		System.out.println(list);
	}
}

결과

 

 

 

 

 

요소 변경

자리에 있는 기존의 데이터는 삭제되고 set()에서 변경된 새로운 데이터가 대체되어 들어간다

	public static void main(String[] args) {

		ArrayList<Integer> list = new ArrayList<>();
		ArrayList<Integer> list2 = new ArrayList<>();
		
		list.add(10);
		list.add(20);
		list.add(30);
		
		list.set(2, 80);
		
		System.out.println(list);
	}
}

결과

 

 

 

 

 

● 배열 반환

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<>();
		
		list.add("손흥민");
		list.add("김민재");
		list.add("황희찬");	
		
		// 배열로 변환하고 반환
		String[] arr1 = list.toArray();
		
		// 매개변수로 지정된 배열에 담아 반환
		String[] str2 = new String[list.size()]; // list의 사이즈에 맞게 배열을 생성
		
		list.toArray(str2);
	}
}

 

 

 

 

 

● 정렬

sort() 메소드는 정렬된 값을 반환하는 것이 아닌 리스트 자체를 내림차순 혹은 오름차순으로 변경 시킨다

	public static void main(String[] args) {

		ArrayList<Integer> list = new ArrayList<>();
		
		list.add(30);
		list.add(50);
		list.add(60);
		list.add(25);
		
		// 오름차순 정렬
		list.sort(Comparator.naturalOrder());
		
		System.out.println(list);
		
		// 내림차순 정렬
		list.sort(Comparator.reverseOrder());
		
		System.out.println(list);
	}
}

결과

 

 

 

 

●  요소 검색

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<>();
		
		list.add("김민재");
		list.add("손흥민");
		list.add("황희찬");
		list.add("이강인");
		
		// list에 contains()가 있는지 검색하고 있다면 true 없으면 false
		System.out.println(list.contains("황희찬"));
		System.out.println(list.contains("조규성"));
		
		System.out.println("");
		
		// list에 indexOf()가 있는지 검색하고 해당 index를 반환, 없으면 -1
		System.out.println(list.indexOf("이강인"));
		System.out.println(list.indexOf("박지성"));
	}
}

결과

 

 

 

 

 

 

 

● 요소 얻기

단일 요소를 얻고자 한다면 get() 메소드를 사용하고, 범위 요소를 얻고자 하면 subList(firstIndex ,lastIndex) 메소드를 활용하여 가져올 수 있다 다만 firstIndex 부터 lastIndex -1 사이에 저장된 객체를 반환한다

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<>();
		
		list.add("김민재");
		list.add("손흥민");
		list.add("황희찬");
		list.add("이강인");
		list.add("박지성");
		list.add("홀란드");
		list.add("로드리");
		
		
		System.out.println(list.get(4));
		
		System.out.println(list.subList(2, 5));
	}
}

결과

 

 

 

 

 

● Iterator

Iterator는 Java에서 컬렉션을 반복하고 그 안의 요소에 접근하는 데 사용되는 인터페이스이며  컬렉션 내부 구조와 관계없이 요소를 순회할 수 있다

hasNext() : 다음 요소를 가지고 있는 동안 반복한다 

next() : Iterator의 다음 요소를 가져온다

	public static void main(String[] args) {

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

		list.add("김민재");
		list.add("손흥민");
		list.add("황희찬");
		list.add("이강인");
		list.add("박지성");
		list.add("홀란드");
		list.add("로드리");
		
		
		Iterator<String> iterator = list.iterator();
		
		while(iterator.hasNext()) {
			String name = iterator.next();
			System.out.println(name);
		}
	}
}

 

 

 

 

 


 

 

 

Today short review 

ArrayList에 대해 알아보았다 ArryList를 활용해보는것과 이후에 LinkedList도 추가적으로 알아볼 예정이며

틀린 부분이 있다면 알려주시면 감사하겠습니다.

'자료구조' 카테고리의 다른 글

LinkedList 구조  (0) 2023.11.12
스택 (Stack)  (0) 2023.10.16