컬렉션 프레임워크 - ArrayList 복습, 개념정리(자바의정석)
https://product.kyobobook.co.kr/detail/S000001550352
Java의 정석 | 남궁성 - 교보문고
Java의 정석 | 자바의 기초부터 실전활용까지 모두 담다!자바의 기초부터 객제지향개념을 넘어 실전활용까지 수록한『Java의 정석』. 저자의 오랜 실무경험과 강의한 내용으로 구성되어 자바를
product.kyobobook.co.kr
자바의정석으로 이론을 정리하고 예제문제로 복습하기
collection Framework:
데이터 군(群)을 저장하는 클래스들을 표준화한 설계
컬렉션 : 다수의 데이터. 즉, 데이터 그룹
프레임워크 : 표준화된 프로그래밍 방식
컬렉션 프레임 웤은 컬렉션, 다수의 데이터를 다루는데 필요하고 다양하고 풍부한 클래스를 제공하고 있기 때문에,
프로그래머의 짐을 상당히 덜어주고 있으며, 또한 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화 되어 있기 때문에 사용법을 익히기에도 편리하고 재사용성이 높은 코드를 작성할 수 있다는 장점이 있다.
📌컬렉션 프레임워크의 인터페이스 3가지
List : 순서가 있는 데이터의 집합, 중복을 허용한다.
Set : 순서가 없는 데이터의 집합, 중복을 허용하지 않는다.
Map : key와 value로 구성된 한쌍의 데이터의 집합 (순서는 유지되지 않음)
key는 중복을 허용하지않고 value는 중복을 허용한다
key: 어떤 값(value)을 찾는데에 열쇠가 된다는 의미에서 붙여진 이름.
collection 인터페이스의 메서드:
ArrayList
예제를 통해서 Arraylist의 메서드를 익혀보자.
ArrayList list1 = new ArrayList();
list1.add(new Integer(5));
list1.add(new Integer(4));
list1.add(new Integer(2));
list1.add(new Integer(0));
list1.add(new Integer(1));
list1.add(new Integer(3));
boolean add(Object o) : ArrayList의 마지막에 객체를 추가해서 성공하면 true 실패시 false
ArrayList의 list1이라는 객체를 생성하고
list1.add함수를 통해서 wrapper Class의 integer타입의 값을 넣어준다
ArrayList list2 = new ArrayList(list1.subList(1, 4));
// 출력하는 함수 선언
print(list1,list2);
list2라는 새로운 객체에는 subList라는 내장함수를 이용해서 인덱스 1번부터 4번까지 요소를 잘라서 담아준다.
list1에는 .add라는 함수를통해 지정한 숫자가 순서를 유지하면서 들어간 것을 알 수 있다.
list2에는 subString으로 list1에 있는 인덱스를 1번부터 4번앞의 요소까지 잘라서 들어가있다.
Collection.sort : 지정된 정렬기준으로 ArrayList를 정렬
Collections.sort(list1);
Collections.sort(list2);
list1, list2가 오름차순으로 정렬 됨.
System.out.println("list1.containsAll(list2) : " + list1.containsAll(list2));
list1이 list2의 모든 요소를 포함하고 있으면 true
list2.add("B");
list2.add("C");
list2.add(3,"A");
print(list1, list2);
list2에 인덱스를 부여하면서 넣는다
순서를 유지하면서 B,C가 채워지고 3번인덱스에 A를 넣어주겠다고 명시해줬으므로 위 사진처럼 list2가 채워진다.
Object set : 인덱스값을 이용해서 객체 재지정
list2.set(3, "AA");
int size() : list2배열의 크기 (정수형)
boolean contains(Object o ) : 지정된 객체(o)가 ArrayList에 포함되어있는지 확인 참이면 true
Object remove(Object o ) : 지정된 위치에 있는 객체를 제거
//list2에서 list1에 포함된 객체들을 삭제한다.
for(int i = list2.size()-1; i>=0; i--) {
if(list1.contains(list2.get(i)))
list2.remove(i);
}
print(list1, list2);
list2.size는 배열의 크기이므로 6이된다.
인덱스는 0부터 시작하기때문에 list2의 마지막요소의 인덱스값은 5이므로 list2.size() -1 인것이다.
lise2.size로 i를 루프시키면서 list1 i번째의 값과 list2의 i번째 값의 공통되는 부분을 삭제시킨다.
여기서 int i를 0 부터 시작해서 차례로 늘리면 되지않을까? 하는 의문이든다면
만약 i를 0부터 시작해서 늘리게 된다면 빈공간을 채우면서 나머지 요소들이 자리이동을 하는 list의 특성때문에
정상적인 결과가 나올 수 없다. 그러므로 i 를 마지막요소로 지정해놓고 i를 0이될때까지 감소시켜가며 삭제한다면
나머지요소들이 자리 이동을 해도 영향을 받지 않는다.
list2의 마지막요소인 C부터 1씩 감소하면서 검사하기때문에 list1에 포함되어있는 4-> 2-> 0이 차례차례지워지는것
긴 문자열 데이터를 원하는 길이로 잘라서 ArrayList에 담은 담은 출력하는 예제
final int LIMIT = 10; //자르고자 하는 글자의 개수를 지정한다.
String source = "0123456789abcdefghijABCDEFGHIJ!@#$%^&*()ZZZ";
int length = source.length();
System.out.println(length);
// list에 값은 source의 길이/ 10+10
List list = new ArrayList(length/LIMIT + 10);
for(int i =0; i<length; i+=LIMIT) {
if(i+LIMIT < length) {
list.add(source.substring(i, i+LIMIT));
}
else list.add(source.substring(i));
}
for(int i =0; i<list.size(); i++) {
System.out.println(list.get(i));
}
📌 사용된 함수
.length() : String 문자열의 길이를 먼저 지정해야함
.subString() : 문자열을 지정한 인덱스번호를 기준으로 잘라야함.
.size() : list의 길이로 루프시키기 위함
.get() : list에 담겨있는 값을 얻어내서 출력시키기 위함.
source의 길이는 43
list의 값은 43 / 10 + 10 =>14 (list의 길이는 약간 여유있게 잡는다.)
반복문 i는 length가 될때까지 루프하면서 i는 10씩증가시키는데
만약 i+10이 43보다 작다면
list에 source에서 i를 기준으로 i+LIMIT 전까지 자른다.
위 예제코드 나의 해석 (메모장)