본문 바로가기

Programming/자바

생활코딩 자바 - Collections framework

Arraylist의 사용법
  • 배열 => 정해진 배열 크기 변경 불가

String[] arrayObj = new String[2];    //문자열 두 개만 허용
arrayObj[0] = "one";
arrayObj[1] = "two";
arrayObj[2] = "three";    

 

 

  • 해결 : Collections framework 기능 Arraylist 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public static void main(String[] args) {
        String[] arrayObj = new String[2];    //문자열 두 개만 허용
        arrayObj[0= "one";
        arrayObj[1= "two";
        //arrayObj[2] = "three";    //오류
        for (int i=0;i<arrayObj.length;i++) {
            System.out.println(arrayObj[i]);
        }
        
        ArrayList al = new ArrayList();    //collections framework의 기능
        al.add("one");
        al.add("two");
        al.add("three");
        for (int i=0;i<al.size();i++) {
            System.out.println(al.get(i));
        }
        
    }
 
}
cs

//

one
two
one
two
three

 

 

  • 제너릭 적용 X - 입력값 출력할 때 형변환 필요
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
import java.util.ArrayList;
 
public class ArrayListDemo {
 
    public static void main(String[] args) {
        String[] arrayObj = new String[2];   
        arrayObj[0= "one";
        arrayObj[1= "two";
        for (int i=0;i<arrayObj.length;i++) {
            System.out.println(arrayObj[i]);
        }
        
        ArrayList al = new ArrayList();
      al.add("one"); 
//add는 모든 데이터타입 허용 => add 메소드의 인자는 Object 타입
      //=> ArrayList에 Object 타입으로 저장됨
        al.add("two");
        al.add("three");
        for (int i=0;i<al.size();i++) {
            String value = (String) al.get(i);    
//i=0 일 때 Object 타입인 "one"이 우항에 옴 => 강제 형변환 필요
            System.out.println(value);
        }
        
    }
}
cs

 

 

  • 제너릭 적용 - 형변환 X
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
import java.util.ArrayList;
 
public class ArrayListDemo {
 
    public static void main(String[] args) {
        String[] arrayObj = new String[2];   
        arrayObj[0= "one";
        arrayObj[1= "two";
        for (int i=0;i<arrayObj.length;i++) {
            System.out.println(arrayObj[i]);
        }
        
        ArrayList<String> al = new ArrayList<String>();    
        //제너릭으로 추가하는 값의 데이터타입 지정 (String)
        al.add("one");   
        al.add("two");
        al.add("three");
        for (int i=0;i<al.size();i++) {
String value = al.get(i); //형변환 불필요
            System.out.println(value);
        }
        
    }
 
}
cs

 

 

 

전체 구성
  •  

=> 각각의 카테고리에 따라 값 호출, 저장 방식이 다름

 

set : 중복 허용 X

 

 

 

List - Set 차이
  • Hashset
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.HashSet;
import java.util.Iterator;
 
public class SetDemo {
 
    public static void main(String[] args) {
        HashSet<Integer> A = new HashSet<Integer>();    //제너릭으로 정수타입 지정
        A.add(1);
        A.add(2);
        A.add(2);
        A.add(2);
        A.add(3);
        
        Iterator hi = (Iterator) A.iterator();
        while(hi.hasNext()) {
            System.out.println(hi.next());
        }
    }
}
cs

//

1
2
3

 

  • Arraylist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
 
public class SetDemo {
 
    public static void main(String[] args) {
        ArrayList<Integer> A = new ArrayList<Integer>();   
        A.add(1);
        A.add(2);
        A.add(2);
        A.add(2);
        A.add(3);
        
        Iterator hi = (Iterator) A.iterator();
        while(hi.hasNext()) {
            System.out.println(hi.next());
        }
    }
}
cs

//

1
2
2
2
3

 

 

  • 차이

HashSet  

1 2 3

=> Set : 중복값 무시하고 고유값만 저장 + 순서 X

 

ArrayList

1 2 2 2 3

 0     1     2     3     4

=> List : 입력되는 값 모두 저장 + 순서 O

 

 

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
import java.util.HashSet;
import java.util.Iterator;
 
public class SetDemo {
 
    public static void main(String[] args) {
 
        HashSet<Integer> A = new HashSet<Integer>();
        A.add(1);
        A.add(2);
        A.add(3);
        
        HashSet<Integer> B = new HashSet<Integer>();
        B.add(3);
        B.add(4);
        B.add(5);
        
        HashSet<Integer> C = new HashSet<Integer>();
        C.add(1);
        C.add(2);
 
        System.out.println(A.containsAll(B));    //A가 B를 포함하는지= B는 A의 부분집합?
        System.out.println(A.containsAll(C));        
        
        A.addAll(B);    //B의 전체를 A에 더함 =합집합
        
        Iterator hi = (Iterator) A.iterator();
        while(hi.hasNext()) {
            System.out.println(hi.next());
        }
        
    }
 
}
cs

//

false
true
1
2
3
4
5

 

 

  • 교집합
 
  A.retainAll(B);    //교집합
        
        Iterator hi = (Iterator) A.iterator();
        while(hi.hasNext()) {
            System.out.println(hi.next());
        }

//

3

 

 

  • 차집합
 
 A.removeAll(B); //차집합 (A-B)
        
        Iterator hi = (Iterator) A.iterator();

 

        while(hi.hasNext()) {
            System.out.println(hi.next());
        }

//

1

2

 

 

 

 

Collection Interface
  •  

인터페이스

클래스

Collection : 최상위에 있는 인터페이스

Set: Collection 메소드 그대로 가짐

List: 특수한 메소드들 갖고 있음 ( ex. get (int index) : 인자로 0 입력하면 첫번째값 가져옴 ) 

=> List는 순서 기반 메소드 가짐

 

 

 

Iterator (인터페이스)

: 컨테이너에 담긴 값들을 하나하나 꺼내서 각각 처리하도록 도와줌 (=반복자)

 

메소드 : hasnext, next, remove

 

 

  •  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.HashSet;
import java.util.Iterator;
 
public class SetDemo {
 
    public static void main(String[] args) {
 
        HashSet<Integer> A = new HashSet<Integer>();    
        A.add(1);
        A.add(2);
        A.add(3);
        
        Iterator hi = A.iterator();
//iterator 메소드의 리턴값 -> Iterator 데이터타입의 객체에 전달 (1,2,3 전달)
        while(hi.hasNext()) {    //hi 내부에 값 있는지 확인
            System.out.println(hi.next());    //hi 내부 값 하나 리턴, 해당 값 hi에서 삭제)
        }
        
    }
 
}
 
cs

//

1

2

3

 

=> Iterator에 담긴 값은 실제 데이터 X, 참조값 O => next 메소드로 인해 오리지널 데이터가 삭제되진 않음

 

 

  •  

Iterator 메소드 => Collection 인터페이스 구현 (모든 클래스들이 공통적으로 갖고 있는 API)

                     => List, Set에 모두 적용 가능)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
 
public class SetDemo {
 
    public static void main(String[] args) {
 
        ArrayList<Integer> A = new ArrayList<Integer>();    
        A.add(1);
        A.add(2);
        A.add(3);
        
        Iterator hi = A.iterator(); 
        while(hi.hasNext()) {  
            System.out.println(hi.next());   
        }
        
    }
 
}
cs

//

1
2
3

 

 

Collection<Integer> A = new HashSet<Integer>();

Collection<Integer> A = new ArrayList<Integer>();

 

=> 둘 다 위와 같은 결과

 

 

 

Map
  • key - value 형식

ex.

"one" - 1

"two" - 2

 

=> key값 중복 불가 / value값 중복 허용

 

 

  •  

HashMap<String, Integer> a = new HashMap<String, Integer>();
a.put("one", 1);
a.put("two", 2);
a.put("three", 3);
System.out.println(a.get("one"));
System.out.println(a.get("two"));
System.out.println(a.get("three"));

//

1

2

3

 

 

  •  
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
39
40
import java.util.*;
 
public class MapDemo {
 
    public static void main(String[] args) {
        HashMap<String, Integer> a = new HashMap<String, Integer>();
        a.put("one"1);
        a.put("two"2);
        a.put("three"3);
        System.out.println(a.get("one"));
        System.out.println(a.get("two"));
        System.out.println(a.get("three"));
        
        iteratorUsingForEach(a);
        iteratorUsingIterator(a);
        }
    
        static void iteratorUsingForEach(HashMap map) {
            Set<Map.Entry<String, Integer>> entries = map.entrySet();    
            //set 생성, map의 리턴값이 set으로 들어감  //String=key값, Integer=value값
            for (Map.Entry<String, Integer> entry : entries ) {    
//entries 데이터를 entry에 각각 넣음
                System.out.println(entry.getKey()+":"+ entry.getValue());    
//key, value 값 각자 꺼냄
            }
        }
//Map에 iteration 기능이 없으므로 set 새로 생성
            //Map.Entry 데이터타입 데이터들 set에 복제 
            //key, value 값 따로 출력
        
            static void iteratorUsingIterator(HashMap map) {
                Set<Map.Entry<String, Integer>> entries = map.entrySet();    
                Iterator<Map.Entry<String, Integer>> i = entries.iterator();
                //iterator 통해 Set타입 entries 데이터 하나하나 꺼냄 -> 반복자를 i 변수에 담음
                while (i.hasNext()) {
                    Map.Entry<String, Integer> entry = i.next();
                    //iterator에 담긴 값 하나하나 꺼내 Map.Entry 데이터타입 부여
                    System.out.println(entry.getKey()+" : "+entry.getValue());
                }
            
            }
}
cs

 

 

 

  • map = 함수

정의역은 중복 X

치역은 정의역과 연결되어야 함

 

 

 

Collections 사용법, 정렬

 

  •  
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
import java.util.*;
 
class Computer implements Comparable{ //정렬
    int serial;
    String owner;
    Computer(int serial, String owner){
        this.serial = serial;
        this.owner = owner;
    }
    public int compareTo(Object o) { //Comparable 클래스가 구현 강제하는 메소드
// a.compareTo(b) => a와 b 값 비교해 음/양수/0 리턴
        return this.serial - ((Computer)o).serial;
    }
    public String toString(){
        return serial+" "+owner;
    }
}
 
public class CollectionsDemo {
     
    public static void main(String[] args) {
        List<Computer> computers = new ArrayList<Computer>();
        computers.add(new Computer(500"egoing"));
        computers.add(new Computer(200"leezche"));
        computers.add(new Computer(3233"graphittie"));
        Iterator i = computers.iterator();
        System.out.println("before");
        while(i.hasNext()){
            System.out.println(i.next());
        }
        Collections.sort(computers);
//List 타입, 제네릭(Comparable 상속)만 정렬해줌 //static=> instance 생성 필요 x
        System.out.println("\nafter");
        i = computers.iterator();
        while(i.hasNext()){
            System.out.println(i.next());
        }
    }
 
}
cs

//

before
500 egoing
200 leezche
3233 graphittie

after
200 leezche
500 egoing
3233 graphittie

 

 

 

 

//

부끄럽지만 두번째 예시에 왜 length엔 괄호가 없는데 size엔 붙는지 아직 이해를 못했다. 메소드 개념과 연관돼있을 것 같은데.. 2회독 땐 개념 확실히 잡아야겠다 => length는 필드 size는 메소드라선감

'Programming > 자바' 카테고리의 다른 글

자바 재정리 - 클래스  (0) 2022.08.11
자바 재정리 - 참조  (0) 2022.08.05
생활코딩 자바 - 제네릭  (0) 2022.04.20
생활코딩 자바 - 참조 ?  (0) 2022.04.19
생활코딩 자바 - 상수2 - enum  (0) 2022.04.18