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
- 교집합
//
3
- 차집합
//
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 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 |