[ITWILL : JSP]자료구조1 : Collections Framwork(Set계열, List계열)

ITWILL학원 : 26강 JSP기초 BY 정규태강사

https://slidesplayer.org/slide/11290986/

1. 컬렉션 클래스의 제네릭 (Collections.Generic)

  • 컬렉션프레임워크 또는 컬렉션 클래스 또는 컨테이너라고도 부른다.
  • 즉 값을 담는 그릇이라는 의미이다. 그런데 그 값의 성격에 따라서 컨테이너의 성격이 조금씩 달라진다. 자바에서는 다양한 상황에서 사용할 수 있는 다양한 컨테이너를 제공하는데 이것을 컬렉션즈 프래임워크라고 부른다.

https://opentutorials.org/course/1223/6446

참고링크 : 생활코딩 컬렉션즈프레임워크

  • JDK5 버전이후부터 사용가능
  • 자료구조 학문을 구현한 클래스이다.
  • 요소라는 데이터를 가변인자의 객체에 저장하는 형태이다.
  • 컬렉션 클래스들은 Collections 인터페이스의 하위 클래스/인터페이스이다.
  • Collections인터페이스의 상위클래스는 Object클래스(최상위객체)이다.
  • 컬렉션 클래스들은 toString()메서드가 구현되어있다.
  • 공통 장점 :
    • 데이터의 삽입, 삭제, 검색기능이 뛰어남.
  • 주요 종류 :
    • Set
    • List
    • Map(Table포함)
  • 공통메서드 :
    • 변수명.add : 데이터저장
    • 변수명.get(index) : 배열의 index에 위치해 있는 값 출력
    • 변수명.set(idx, 변경값) : 데이터변경
    • 변수명.size() : 길이를 반환
    • iterator()

2. Iterator

  • Iterator는 반복자, 즉 반복문의 동작을 할 수 있는 인터페이스이다.
  • 해당 컬렉션에서 현재위치, 다음단계로의 이동동작을 반복가능하게 한다.
  • 모든 컬렉션클래스들은 슈퍼클래스의 iterator()메서드를 모두 사용가능하다.
  • Iterator 패턴 : 디자인패턴중의 하나로 중급개발자로 가는 길목에 이다. [디자인패턴](https://gmlwj d9405.github.io/2018/07/06/design-pattern.html)은 필수이므로 꼭 따로 학습 해볼것

3. Set계열의 컬렉션 클래스

  • 서로 다른타입의 데이터를 저장가능함. why? Object로 업캐스팅을 할 것이기때문에!
  • 순서를 포함하지 않음
  • 데이터 중복을 허용하지 않음.
  • Set계열은 중복x, 순서정보가 없기때문에 반복문을 사용할 수가 없다 -> 반복문 대신 interator 사용
  • 예 : HashSet 클래스 : Set 인터페이스를 구현한 서브클래스이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public static void main(String[] args) {
// TODO Auto-generated method stub
//Set<E>
//Set set = new Set(); //인터페이스는 객체를 생성할 수 없다
Set set = new HashSet(); //업캐스팅(HashSet -> Set)

System.out.println("요소의 갯수 : "+set.size());

set.add("하나");
set.add("2");
set.add("3.14");
set.add("c");
set.add(5);
set.add(5);
set.add(5);

System.out.println("요소의 갯수 : "+set.size());
System.out.println(set);

System.out.println("ㅡㅡㅡㅡㅡSet계열 반복문사용");
//Set계열은 중복x, 순서정보가 없기때문에 반복문을 사용할 수가 없다
//이때 사용하는 것이 interator이다

Iterator is = set.iterator();
while(is.hasNext()){
System.out.println(is.next());
}
}
//출력값
요소의 갯수 : 0
요소의 갯수 : 5 //중복을 허용하지않는다.
[2, c, 5, 3.14, 하나] //중복을 허용하지않는다. 내가 넣은 순서대로 출력되지않는다.
ㅡㅡㅡㅡㅡSet계열 반복문사용
2
c
5
3.14
하나

4. List계열의 컬렉션 클래스

  • 서로 다른타입의 데이터를 저장가능함. why? Object로 업캐스팅을 할 것이기때문에!
  • 순서가 저장됨 how? 저장할때 요소의 위치(index)값을 사용하기때문에!
    • 요소의 위치는 배열처럼 0부터 접근하면 됨
  • 데이터 중복 허용
  • Set계열보다 List계열을 더 많이 사용함
  • 예 : ArrayList, Vector, Stack, LinkedList

4-1. ArrayList

  • 장점 : 고정길이 배열의 단점을 보완. 저장공간의 크기가 필요에 따라 자동으로 증가함.
    가장 많이 사용한다.
  1. 예시 : ArrayList 데이터 입력 및 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ArrayList list = new ArrayList();

list.add("하나");
list.add("2");
list.add("3.14");
list.add("c");
list.add(5);
list.add(5);
list.add(5);

System.out.println("요소의 갯수 : "+ list.size());
System.out.println(list);
System.out.println(list.get(3));

//출력값
요소의 갯수 : 7
[하나, 2, 3.14, c, 5, 5, 5]
c
  1. 예시 : ArrayList 반복문사용
    순서(index)값이 저장되기때문에 Iterator가 아닌 반복문을 사용할 수 있다.
    전체 데이터를 출력하는 반복문이다.
  • System.out 대신 System.err 입력하면 에러형태(빨간글자)로 콘솔에 출력된다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
System.out.println("ㅡㅡㅡㅡㅡfor문");
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i));
}

System.out.println("ㅡㅡㅡㅡㅡ확장for문");
//확장 for문 for-each
//for(해당 타입의 요소 변수명 : 반복할배열/컬렉션){}

for(Object i : list){
//System.err.println(i); 에러형태(빨간글자)로 콘솔에 출력
System.out.println(i);
}
//출력값
ㅡㅡㅡㅡㅡfor
하나
2
3.14
c
5
5
5
ㅡㅡㅡㅡㅡ확장for
하나
2
3.14
c
5
5
5
  1. 예시 : index활용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
System.out.println("ㅡㅡㅡㅡㅡindexof 사용");
System.out.println(list.indexOf(5));

System.out.println("ㅡㅡㅡㅡㅡindex활용한 add/set");
//기존데이터
System.out.println(list);
//데이터추가
list.add(3, "안녕하세요");
System.out.println(list);
//데이터변경
list.set(3, "하이");
System.out.println(list);

//출력값
ㅡㅡㅡㅡㅡindexof
4
ㅡㅡㅡㅡㅡindex활용한 add
[하나, 2, 3.14, c, 5, 5, 5]
[하나, 2, 3.14, 안녕하세요, c, 5, 5, 5]
[하나, 2, 3.14, 하이, c, 5, 5, 5]
  1. 예시 : 조건에 따른 데이터변경(반복문 사용)
    배열에 “2”가 있는 경우 “two”로 변경해보자
  • 내코드
1
2
3
4
5
6
7
8
9
//내코드
for(int i=0; i<list.size(); i++){
if(list.get(i) == "2"){
list.set(i, "two");
}
}
System.out.println(list);
//출력값
[하나, two, 3.14, 하이, c, 5, 5, 5]
  • 강사님코드
  • indexOf()는 데이터가 존재할 경우 index값을 출력하고 없는 경우 -1을 출력한다.
1
2
3
4
5
6
7
8
9
10
//강사님코드
System.out.println(list.indexOf("2")); //"2"의 index위치찾기
int value = list.indexOf("2");
if(value != -1){ //데이터가 존재할 경우
list.set(value, "two");
}
System.out.println(list);
//출력값
1
[하나, two, 3.14, 하이, c, 5, 5, 5]
  1. 비교 : 조건에 따른 데이터변경(Iterator사용)
  • 다음요소를 가지고있으면 true->반복문실행 없으면 false->반복문종료
1
2
3
4
5
//list객체를 반복할 수 있도록 iterator 객체로 변환
Iterator iter = list.iterator();
while(iter.hasNext()){ //다음요소를 가지고있으면 true->반복문실행 없으면 false->반복문종료
System.out.println(iter.next());
}

4-2. Vector

  • Vector : 자동으로 길이가 늘어나는 가변list

  • ArrayList - 동기화 기능 X : 상대적으로 클라이언트측에서 많이 사용함

  • Vector - 동기화 기능 O : 상대적으로 서버측에서 많이 사용함

  • 거의 대부분이 ArrayList를 쓰는 상황이다. 주니어레벨에서는 잘 모르겠다싶으면 ArrayList를 사용하면 됨.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//1. Vector 생성
// Vector생성시 4칸짜리 배열생성 후 필요시마다 3칸씩 추가됨 -> 효율적사용가능
Vector vec = new Vector(4,3);

//2. Vector 크기체크
System.out.println("백터의 크기 : "+vec.size());


//3 Vector 용량체크
System.out.println("백터의 용량 : "+vec.capacity());

//4.실무에서 더미데이터를 담을때 for문을 주로 사용한다
for(int i=0; i<5; i++){
vec.add(i*10);
}
System.out.println(vec);
System.out.println("백터의 크기 : "+vec.size());
System.out.println("백터의 용량 : "+vec.capacity());
System.out.println("백터첫번째요소 : "+vec.firstElement());
System.out.println("백터두번째요소 : "+vec.get(1));//
System.out.println("백터마지막요소 : "+vec.lastElement());

//출력값
백터의 크기 : 0 => //출력값이 4가 아니라 0인 이유는? size는 요소의 값이다. 요소가 없으면 값은 0이 출력된다.
0
백터의 용량 : 4
[0, 10, 20, 30, 40]
백터의 크기 : 5
백터의 용량 : 7
백터첫번째요소 : 0
백터두번째요소 : 10
백터마지막요소 : 40

4-3. 배열을 생성해보자

  • 내코드
    내코드는 for문을 사용했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
System.out.println("ㅡㅡㅡㅡㅡ 배열생성");
//대괄호안에 인자를 넣으면 에러가 발생함. 대괄호안에 숫자 넣으면 안됨!
//주로 안드로이드에서 아래의 배열생성방식을 사용함.
double[] arr = new double[]{1.1,1.2,1.3,1.4,1.5,1.6,1.7};
Vector vec2 = new Vector(5,5); //백터생성

//내코드
for(int i=0; i<arr.length; i++){
vec2.add(arr[i]);
}
System.out.println(vec2);
//출력값
//[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7]
  • 강사님코드
    강사님은 for-each를 사용한 코드이다.
1
2
3
4
5
6
7
8
9
double[] arr = new double[]{1.1,1.2,1.3,1.4,1.5,1.6,1.7};
Vector vec2 = new Vector(5,5); //백터생성
//강사님코드
for(double d : arr){
vec2.add(d);
}
System.out.println(vec2);
//출력값
//[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7]

4-4. 요소검색

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
System.out.println("ㅡㅡㅡㅡㅡ요소검색");
//[1.5]요소가 있으면 해당요소의 위치출력, 없으면 -1출력
int result = vec2.indexOf(1.5);
if(result != -1){
System.out.println("검색성공 : "+result);
}else{
System.out.println("검색실패 : "+result);
}

System.out.println("ㅡㅡㅡㅡㅡ요소삭제1 : indexOf사용");
//[1.6]요소가 있으면 해당요소를 삭제
int result2 = vec2.indexOf(1.7);
if(result2 != -1){
vec2.remove(result2);
System.out.println("삭제성공 : "+vec2);
}else{
System.out.println("삭제실패 : "+result2);
}

System.out.println("ㅡㅡㅡㅡㅡ요소삭제2 : contains");
double delValue = 45.6;
if(vec2.contains(delValue)){ //괄호한의 delValue가 포함되어 있으면 true
vec2.remove(delValue);
System.out.println("삭제성공 : "+vec2);
}else{
System.out.println("삭제실패 : "+vec2);
}

//출력값
ㅡㅡㅡㅡㅡ요소검색
검색성공 : 4
ㅡㅡㅡㅡㅡ요소삭제1 : indexOf사용
삭제성공 : [1.1, 1.2, 1.3, 1.4, 1.5, 1.6]
ㅡㅡㅡㅡㅡ요소삭제2 : contains
삭제실패 : [1.1, 1.2, 1.3, 1.4, 1.5, 1.6]