Search

반응형

'자바'에 해당되는 글 51건

  1. 2020.05.13 [자바/java]List - ArrayList 이해하고 사용해 보기. - Collection, 리스트
  2. 2020.05.12 [자바/java]컬렉션에서 Set 은 어떻게 사용할까요? Collection/Set
반응형

안녕하세요. 신기한 연구소 개발자 티보이입니다.

장기간 유지보수 프로젝트에 투입되었다가 잠시 휴식 시간에 개인적으로 공부를 하다 보니

유지보수 기간 동안 자바에 대한 많은 기억이 사라졌더군요.

그래서 다시 되살려서 복습도 하기 위해 초심을 가지고 기초부터 하나하나 보고 있습니다.

블로그를 하면 좋은 이유가 이해도 해야 하고 자료도 찾아보고 실제 코딩도 하면서 그 예제를 올려놓고

나중에 프로젝트에 투입 시 활용할 수 있는 이점이 있답니다.

그럼 같이 출발해 보겠습니다. 렛츠 고~

List는 순서가 있는 컬렉션(Collection)입니다.

어찌 보면 배열과 가장 비슷한 구조이며 배열을 상상하며 접근하면 편하겠지요?

List는 중복 데이터를 허용합니다.

이 말은 순서를 가지고 데이터를 등록하지만 중복된 데이터도 저장이 가능하다는 말입니다.

순서는 중복이 안 됩니다.

예를 들어서 고속도로에서 오늘 통과한 차의 제조사 정보를 수집한다고 했을 경우에 순번대로 1, 2, 3, 4…로 index가 만들어지고 데이터로는 A, B, C, C, C, A이렇게 중복해서 들어갑니다.

올림픽 경기 중 같은 달리기 100m를 하는 경우 8명 선수가 모두 중복되지 않는 다른 나라일 수 없잖아요? 그런 경우에도 사용하면 되겠네요. 선수목록 리스트로요.

또한 입력 순서가 있기에 index 순서대로 처리하기 좋습니다. 순차 처리에 용이하는 의미로 성적이나 순번 등 순서가 반드시 필요한 경우에도 유용하게 사용할 수 있습니다.

 

 

클래스는 ArrayList, LinkedList, Vector, Stack 이 있습니다.

속도가 다른 컬렉션에 비해 빠른 편이라 특히 ArrayList, Vector를 자주 사용합니다.

여러 번도 이 두 개의 List를 자주 사용하고 자주 만났을 거라 생각합니다.

또한 이 두 개의 클래스를 사용하고 싶기에 검색을 해서 여기까지 오지 않았나 싶네요. ㅎㅎ

하지만 이번 포스팅은 가장 많이 사용하는 ArrayList 클래스로 확인해 볼게요.

ArrayList 클래스는 Collection, List 두 개의 인터페이스 다중 구현이므로 해당 메서드를 모두 구현 가능합니다.

 

이제 List 인터페이스의 메서드를 사용해

ArrayList 클래스로 예제를 살펴보겠습니다.

 

#List - add

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
List<Integer> l01 = new ArrayList<Integer>();
 
l01.add(100);
l01.add(101);
l01.add(102);
l01.add(103);
l01.add(104);
l01.add(105);
l01.add(101);
 
System.out.println(l01);
 
l01.add(2201);
 
System.out.println(l01);
 
[결과]
[100101102103104105101]
[100101201102103104105101]
cs

1번 라인으로 선언해서 사용하면 됩니다. 제너릭으로 Integer 타입만 받겠다는 의미입니다.

3~9번 라인은 add를 사용해 값을 입력하는 겁니다. 순서대로 index가 0번부터 생성됩니다.

특히 9번 라인은 4번 라인과 값이 같습니다. 오류 없이 순서대로 저장됩니다.

또한 13번 라인처럼 특정 index 위치에 입력할 수도 있습니다.

결과를 확인해보세요. 19번 라인에 "201"이 index 2번에 잘 들어갔습니다.

 

#List – addAll

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
List<Integer> l01 = new ArrayList<Integer>();
List<Integer> l02 = new ArrayList<Integer>();
 
for(int i=0; i<10; i++) {
    l02.add(i);
}
        
l01.add(100);
l01.add(101);
l01.add(102);
l01.add(103);
l01.add(104);
l01.add(105);
l01.add(101);
 
l01.addAll(2, l02);
 
System.out.println(l01);
 
[결과]
[1001010123456789102103104105101]
cs

이번은 addAll을 사용한 예제입니다.

2개의 ArrayList 클래스를 사용해서 하나의 리스트를 끼워 넣는 겁니다.

2번째 index 위치에 "l02" 리스트를 삽입하게 됩니다.

결과를 확인해보세요. 

 

#List – get

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<Integer> l01 = new ArrayList<Integer>();
 
    
l01.add(100);
l01.add(101);
l01.add(102);
l01.add(103);
l01.add(104);
l01.add(105);
l01.add(101);
 
System.out.println(l01);
System.out.println(l01.get(3));
 
[결과]
[100101102103104105101]
103
cs

get메서드는 특정 index 위치의 값을 반환합니다.

3번째 index는 "103"입니다.

결과를 확인해보세요. 

 

#List – indexOf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
List<Integer> l01 = new ArrayList<Integer>();
 
        
l01.add(100);
l01.add(101);
l01.add(102);
l01.add(103);
l01.add(104);
l01.add(105);
l01.add(101);
 
System.out.println(l01);
System.out.println(l01.indexOf(102));
 
 
[결과]
[100101102103104105101]
2
cs

indexOf 메서드는 해당 데이터(값)을 넣고 위치 정보 index값을 받습니다.

"102"의 위치를 찾기 위해 13번째 라인을 보세요.

결과는 2로 index 2 위치를 반환합니다.

 

#List – lastIndexOf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
List<Integer> l01 = new ArrayList<Integer>();
 
        
l01.add(100);
l01.add(101);
l01.add(102);
l01.add(103);
l01.add(104);
l01.add(105);
l01.add(101);
 
System.out.println(l01);
System.out.println(l01.lastIndexOf(101));
 
 
[결과]
[100101102103104105101]
6
cs

lastIndexOf는 indexOf처럼 입력받은 값의 위치 index를 찾아줍니다.

하지만 last 가 붙은 이유는 뒤에 찾기 시작하고 그 위치는 원래 index 위치 값을 반환합니다.

그래서 1이 아닌 6을 반환합니다.

#List – set

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
List<Integer> l01 = new ArrayList<Integer>();
 
        
l01.add(100);
l01.add(101);
l01.add(102);
l01.add(103);
l01.add(104);
l01.add(105);
l01.add(101);
 
System.out.println(l01);
l01.set(1111);
System.out.println(l01);
 
 
[결과]
[100101102103104105101]
[100111102103104105101]
cs

set메소드는 해당 위치와 바꿀 값을 파라미터로 받습니다.

13번째 라인을 보면 1번째 index의 값을 "111"로 변경하라는 의미입니다.

결과를 확인해보세요.

 

#List – size()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<Integer> l01 = new ArrayList<Integer>();
    
l01.add(100);
l01.add(101);
l01.add(102);
l01.add(103);
l01.add(104);
l01.add(105);
l01.add(101);
 
System.out.println(l01);
System.out.println(l01.size());
 
 
[결과]
[100101102103104105101]
7
cs

size메서드는 List의 길이를 반환합니다.

현재 l01은 7개의 값이 있습니다.

결과는 17번째 라인 "7"이 나옵니다.

 

#List – toArray

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
List<Integer> l01 = new ArrayList<Integer>();
 
l01.add(100);
l01.add(101);
l01.add(102);
l01.add(103);
l01.add(104);
l01.add(105);
l01.add(101);
 
 
System.out.println(l01);
Integer[] ai = l01.toArray(new Integer[l01.size()]);
 
for(Integer itm : ai) {
    System.out.println(itm);
}
 
 
[결과]
[100101102103104105101]
100
101
102
103
104
105
101
cs

toArray를 사용하는 예제입니다.

List를 array로 변환해서 사용할 수 있습니다.

13번째 라인처럼 ai 배열을 생성해서 toArray 메서드로 List의 내역을 받습니다.

for-each 문으로 결과를 확인해보세요.

 

#List – subList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
List<Integer> l01 = new ArrayList<Integer>();
List<Integer> l02 = new ArrayList<Integer>();
        
l01.add(100);
l01.add(101);
l01.add(102);
l01.add(103);
l01.add(104);
l01.add(105);
l01.add(101);
 
System.out.println(l01);
l02 = l01.subList(24);
System.out.println(l02);
 
 
[결과]
[100101102103104105101]
[102103]
cs

마지막으로 살펴보는 subList 입니다.

이 메서드도 유용하게 사용할 수 있습니다.

위치 범위를 잡아서 시작 index와 종료 index를 입력하면 해당 범위만큼의 List 데이터를 반환합니다.

바로 다른 ArrayList 객체로 넘겨줍니다.

위 결과를 보면 2~4 index 값을 l02로 넘겨줍니다.

지금까지 컬렉션에서 정말 자주 사용하는 List에 대해 알아봤고

ArrayList 클래스로 예제를 만들어봤습니다.

ArrayList는 동기화를 지원하지 않는다는 점 꼭 기억하세요.

즐 코딩하세요~

반응형
반응형

안녕하세요.

신기한 연구소 개발자 티보이입니다.

컬렉션(Collection) 중 Set에 대해 살펴봅니다.

프로그램을 개발할 때 반드시 알아야 할 인터페이스 중 하나입니다.

제대로 알고 쓰면 더 좋겠지요?

컬렉션인지 모르고 그냥 다른 개발자 선배들이 소스에 사용한 것을 내 생각과 비슷하게 나오니깐 어떤 기능이 있고 성능은 어떤지 고민하지 않고 사용했던 기억이 있네요.

그러다 보면 가끔 난해한 오류가 나는데 이해를 못하고 찾지도 못하고 고생했던 경험들 있을 겁니다.

Vector, ArrayList, HashMap, Hashtable 등 소스에서 자주 만났던 클래스들인데..

잘 이해하고 사용한다면 기능, 성능면에서 많은 도움이 될 거예요.

간단하게 사용하면 되는 것을 굳이 무거운 컬렉션을 사용할 필요가 없잖아요.

쉰나게 만들었는데 막상 필요한 메서드를 해당 클래스가 지원하지 않는다면다른 클래스 찾아서 다시 코딩해야 하고요.

여하튼 카피 앤 페이스트(Copy & Paste)도 잘하면 좋지만 잘 알고 한다면 더 편하게 사용하고

소스 품질도 좋아질 것이며

당연히 우리의 스킬도 업 될 것입니다.

 

이제 같이 컬렉션 Set 인터페이스를 만나러 떠나 봅시다~

렛츠 고!!

 

 

SetCollection(컬렉션)의 특별한 종류이며 SortedSetSet의 특별한 종류입니다.

대표적으로 HashSet, LinkedSet, TreeSet 세가지가 있어요.

그 중 HashSet을 가장 많이 사용합니다.

Set중복된 요소를 저장하지 않는 컬렉션 중 하나입니다.

컬렉션(Collection)의 추상 메서드만 사용합니다.

즉, Set은 따로 메서드를 갖고 있지 않고 Collection것만 사용한다는 의미입니다.

순서(index)가 없어요. , get(int index) 메서드를 사용할 수 없습니다.

toString()으로 전체를 뽑던지, iterator를 사용해서 for문으로 쭉 뽑던지, 아니면 toArray() 배열로 따로 배열에 담아서 사용하면 됩니다.

 

HashSet해시 테이블에 요소들을 저장하며, 최고 성능으로 구현하는 것입니다.

TreeSet은 자료구조의 red-black로 그 요소를 저장하는데 속도는 HashSet보다 느립니다.

 

예제를 통해서 사용법을 익혀봅니다.

#HashSet과 toArray() 활용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HashSet<Integer> hs = new HashSet<Integer>();
 
Random rm = new Random();
        
        
for(int i=0;i<10;i++) {
    hs.add(rm.nextInt(10));
}
        
        
Integer[] array = hs.toArray(new Integer[hs.size()]);
 
for(Integer itm : array) {
    System.out.println(itm);
}
cs

 Random을 사용해서 10 이하 임의의 수를 10개를 add()를 통해 HashSet hs에 담았습니다.

그리고 Integer [] array 로 배열을 생성하는데,

toArray() 를 사용해서 배열로 받습니다.

for-each문으로 출력문을 만들면 해당 HashSet을 배열로 받은 값들이 술술 나옵니다.

 

#HashSet과 addAll() 활용

1
2
3
4
5
HashSet<Integer> hs = new HashSet<Integer>();
HashSet<Integer> hs3 = new HashSet<Integer>();
 
 
hs3.addAll(hs);
cs

이 예문은 HashSet hs3에 HashSet hs 의 요소들을 추가하는 기능입니다.

중요한 것은 중복 허용이 안되기에 중복하지 않는 요소들만 합쳐집니다.

hs = [3,4]

hs3 = [0.1.2.3] 이면

addAll 후 hs3 = [0,1,2,3,4]가 됩니다. 3은 중복되니 하나만 들어갑니다.

 

#HashSet과 containsAll() 활용

1
2
3
4
5
6
7
8
9
10
11
12
HashSet<Integer> hs = new HashSet<Integer>();
HashSet<Integer> hs3 = new HashSet<Integer>();
 
hs.add(2);
hs.add(3);
 
hs3.add(0);
hs3.add(1);
hs3.add(2);
hs3.add(3);
 
System.out.println(hs3.containsAll(hs));
cs

hs3에 hs 전체가 포함되어 있으면 true 아니면 false를 반환합니다.

일부만 포함되면 false입니다.

#HashSet과 retainAll() 활용

1
2
3
4
5
6
7
8
9
10
11
12
HashSet<Integer> hs = new HashSet<Integer>();
HashSet<Integer> hs3 = new HashSet<Integer>();
 
hs.add(2);
hs.add(3);
 
hs3.add(0);
hs3.add(1);
hs3.add(2);
hs3.add(3);
 
System.out.println(hs3.retainAll(hs));
cs

이 소스를 실행하면 hs가 가지고 있는 [2,3] 이 hs3에도 전부 있습니다.

retainAll을 실행하면 hs3는 hs를 전부 포함하고 있다면 그 부분만 남기게 됩니다.

hs3dl [0.1.2.3]에서 [2,3]으로 바뀌게 됩니다.

 

#HashSet과 removeAll() 활용

1
2
3
4
5
6
7
8
9
10
11
12
HashSet<Integer> hs = new HashSet<Integer>();
HashSet<Integer> hs3 = new HashSet<Integer>();
 
hs.add(2);
hs.add(3);
 
hs3.add(0);
hs3.add(1);
hs3.add(2);
hs3.add(3);
 
System.out.println(hs3.removeAll(hs));
cs

removeAll을 실행하면 hs3의 목록에서 hs 목록이 빠지게 됩니다.

위 결과는 hs3 = [0,1]이 됩니다.

컬렉션(Collection) 중 Set에서 자주 사용하는 HashSet에 대해 살펴봤습니다.

즐 코딩하세요~

반응형