<오늘의 학습 - 데이터베이스를 관리하는 방법>
1. 컬렉션
2. 제네릭
3. Vector
4. ArrayList
5. HashMap
3. Vector
▶ Vector <E>의 특징
- java.util.Vector
- <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화한다.
- 여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스이다.
- 배열의 길이 제한을 극복한다.
- 원소의 개수가 넘치면 자동으로 길이를 조절한다.
- Vector에 삽입 가능한 것
- 객체, null
- 기본 타입은 Wrapper 객체로 만들어 저장한다.
- Vector의 객체 삽입
- 벡터의 맨 뒤에 객체를 추가한다.
- 벡터 중간에 객체를 삽입할 수 있다.
- Vector의 객체 삭제
- 임의의 위치에 있는 객체 삭제할 수 있다.
- 객체 삭제 후 자동 자리 이동
▶ Vector <E> 클래스의 주요 메소드
메소드 | 설명 |
boolean add(E element) | 벡터의 맨 뒤에 element 추가 |
void add(int index, E element) | 인덱스 index 위치에 element를 삽입 |
boolean addAll(Collection<? extends E> c) | 컬렉션 c의 모든 요소를 벡터의 맨 뒤에 추가 |
E elementAt(int index) | 인덱스 index의 요소 리턴 |
E get(int index) | 인덱스 index의 요소 리턴 |
E remove(int index) | 인덱스 index의 요소 삭제 |
boolean remove(Object obj) | 객체 obj와 같은 첫 번째 요소를 벡터에서 삭제 |
void removeAllElements() | 벡터의 모든 요소를 삭제하고 크기를 0으로 만듦 |
void clear() | 벡터의 모든 요소 삭제 |
int size() | 벡터가 포함하는 요소의 개수 리턴 |
Object[] toArray() | 벡터의 모든 요소를 포함하는 배열을 리턴 |
int capacity() | 벡터의 현재 용량 리턴 |
int indexOf(Object obj) | obj와 같은 첫 번째 요소의 인덱스를 리턴. 없으면 -1 리턴 |
boolean isEmpty() | 벡터가 비어 있으면 true 리턴 |
boolean contains(Object obj) | 벡터가 지정된 객체 obj를 포함하고 있으면 true 리턴 |
▶ 예제 1
- 정수를 다루는 벡터를 생성하고 활용해 보자.
▷ main 코드
import java.util.Vector;
//정수만 다루는 벡터를 생성하고 활용하는 예제
public class VectorEx {
public static void main(String[] args) {
Vector<Integer> vector = new Vector<Integer>();
vector.add(5); //5 삽입
vector.add(4); //4 삽입
vector.add(-1); //-1 삽입
vector.add(2,100);//벡터는 중간에 값을 삽입할 수 있다. 4와 -1 사이에 정수 100을 삽입
System.out.println("벡터 내의 요소 객체 수:"+vector.size());
System.out.println("벡터의 용량:"+vector.capacity());
//벡터의 모든 요소 출력
System.out.print("벡터의 요소:");
for(int num:vector)
System.out.print(num+" ");
System.out.println(); //줄바꿈
//벡터의 모든 정수의 합
int sum=0;
for(int num : vector)
sum+=num;
System.out.println("벡터의 모든 정수의 합:"+sum);
}//main_end
}//VectorEx_end
▷ 출력 결과
벡터 내의 요소 객체 수:4
벡터의 용량:10
벡터의 요소:5 4 100 -1
벡터의 모든 정수의 합:108
▶ 예제 2
- 문자열을 관리하는 vector를 만들어라.
- 첫 번째 공간에는 "홍길동" 입력
- 두 번째 공간에는 "유재석" 입력
- 세 번째 공간에는 "강호동" 입력
- "홍길동"과 "유재석" 사이에 "박명수" 입력
- "홍길동" 삭제
- 최종적으로 vector에 있는 모든 문자열 출력
▷ main 코드
import java.util.Vector;
public class VectorString {
public static void main(String[] args) {
//문자열을 관리하는 vector 객체 생성
Vector<String> vector = new Vector<String>();
vector.add("홍길동"); //0번째 요소
vector.add("유재석"); //1번째 요소
vector.add("강호동"); //2번째 요소
vector.add(1, "박명수"); //0번째 요소와 1번째 요소 사이에 값을 넣음. 기존 요소들은 뒤로 한 칸씩 밀림
vector.remove("홍길동"); //홍길동 삭제
// or
// vector.remove(0); // 0번째 인덱스 요소 삭제
//벡터의 모든 문자열 출력
for(String num:vector)
System.out.println(num);
// or
// for(int i=0;i<vector.size();i++)
// System.out.println(vector.get(i));
}//main_end
}//VectorString_end
▷ 출력 결과
박명수
유재석
강호동
※ 만약 반복문을 이용하여 특정 단어와 일치하는 값을 모두 지우고 싶다면 인덱스의 맨 끝부터 접근해야 한다. 인덱스의 값을 삭제하면 인덱스가 앞으로 당겨지기 때문에 맨 앞의 인덱스부터 접근한다면 일부 인덱스에 접근할 수 없기 때문이다.
for(int i=vector.size()-1;i>=0;i--)
if(vector.get(i).equals("강호동"))
vector.remove(i);
4. ArrayList
▶ ArrayList <E>의 특징
- 벡터와 거의 동일하지만 메소드를 사용할 때 차이가 있다.
- 벡터와 달리 스레드 동기화 기능이 없다.
- 다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않는다.
- 개발자가 스레드 동기화 코드를 작성한다.
- java.util.ArrayList, 가변 크기 배열을 구현한 클래스
- <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화
- ArrayList에 삽입 가능한 것
- 객체, null
- 기본 타입은 박싱/언박싱으로 Wrapper 객체로 만들어 저장한다.
- ArrayList에 객체 삽입
- 리스트의 맨 뒤에 객체를 추가한다.
- 리스트의 중간에 객체를 삽입할 수 있다.
- ArrayList의 객체 삭제
- 임의의 위치에 있는 객체를 삭제할 수 있다.
▶ ArrayList <E> 클래스의 주요 메소드 (벡터와 매우 유사하다)
메소드 | 설명 |
boolean add(E element) | ArrayList의 맨 뒤에 element 추가 |
void add(int index, E element) | 인덱스 index 위치에 element를 삽입 |
boolean addAll(Collection<? extends E> c) | 컬렉션 c의 모든 요소를 ArrayList의 맨 뒤에 추가 |
E elementAt(int index) | 인덱스 index의 요소 리턴 |
E get(int index) | 인덱스 index의 요소 리턴 |
E remove(int index) | 인덱스 index의 요소 삭제 |
boolean remove(Object obj) | 객체 obj와 같은 첫 번째 요소를 ArrayList에서 삭제 |
void clear() | ArrayList의 모든 요소 삭제 |
int size() | ArrayList가 포함하는 요소의 개수 리턴 |
Object[] toArray() | ArrayList의 모든 요소를 포함하는 배열을 리턴 |
int indexOf(Object obj) | obj와 같은 첫 번째 요소의 인덱스를 리턴. 없으면 -1 리턴 |
boolean isEmpty() | ArrayList가 비어 있으면 true 리턴 |
boolean contains(Object obj) | ArrayList가 지정된 객체 obj를 포함하고 있으면 true 리턴 |
▶ 예제 1
- ArrayList 문자열을 관리하는 객체 생성
- Scanner로 문자열을 5개 입력받아서 Arraylist 객체에 저장
- ArrayList 객체에 있는 문자열 출력
- 가장 긴 문자열을 찾아 출력
▷ main 코드
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListEx {
public static void main(String[] args) {
//문자열을 관리하는 ArrayList 객체 생성
ArrayList<String> arraylist = new ArrayList<String>();
Scanner scan = new Scanner(System.in);
//문자열을 5개 입력받아 ArrayList 객체에 저장
for(int i=0;i<5;i++){
System.out.print((i+1)+"번째 문자열을 입력하세요 >> ");
arraylist.add(scan.next());
}
System.out.println(); //줄바꿈
//출력
for(int i=0;i<arraylist.size();i++)
System.out.println("arraylist의 "+(i+1)+"번째 문자열:"+arraylist.get(i));
System.out.println(); //줄바꿈
//가장 긴 문자열을 찾아 출력
int longIndex = 0;
for(int i=1;i<arraylist.size();i++)
if(arraylist.get(longIndex).length() < arraylist.get(i).length())
longIndex=i;
System.out.println("가장 긴 문자열:"+arraylist.get(longIndex));
scan.close();
}//main_end
}//ArrayListEx_end
▷ 출력 결과
1번째 문자열을 입력하세요 >> Kim
2번째 문자열을 입력하세요 >> Lee
3번째 문자열을 입력하세요 >> Park
4번째 문자열을 입력하세요 >> Jo
5번째 문자열을 입력하세요 >> Han
arraylist의 1번째 문자열:Kim
arraylist의 2번째 문자열:Lee
arraylist의 3번째 문자열:Park
arraylist의 4번째 문자열:Jo
arraylist의 5번째 문자열:Han
가장 긴 문자열:Park
▶ 예제 2
- ArrayList Integer 관리하는 객체 생성
- Scanner로 숫자 5개를 입력받아 저장
- 가장 작은 숫자를 찾아서 출력
- 중복이 있으면 중복 개수를 출력
- ex) 3,5,3,6,9
가장 작은 수 : 3
중복 개수 : 2
▷ main 코드
ArrayList<Integer> a = new ArrayList<Integer>();
Scanner scan = new Scanner(System.in);
for(int i=0;i<5;i++){
System.out.print((i+1)+"번째 숫자를 입력하세요 >> ");
a.add(scan.nextInt());
}
//최솟값과 중복값 구하기
int minIndex=0, count=1;
for(int i=0;i<a.size();i++){
if(i!=0 && a.get(minIndex)>a.get(i)) //Math.min(min, a.get(i));
minIndex=i;
for(int j=i+1;j<a.size();j++)
if(a.get(i)==a.get(j)) //중복
count++;
}
System.out.println("가장 작은 수:"+a.get(minIndex));
System.out.println("중복 개수:"+count);
scan.close();
▷ 출력 결과
1번째 숫자를 입력하세요 >> 3
2번째 숫자를 입력하세요 >> 5
3번째 숫자를 입력하세요 >> 3
4번째 숫자를 입력하세요 >> 6
5번째 숫자를 입력하세요 >> 9
가장 작은 수:3
중복 개수:2
▶ 예제 3
- ArrayList Integer 관리하는 객체 생성
- Scanner로 숫자 5개를 입력받아 저장
- 가장 작은 숫자와 가장 큰 숫자의 위치 바꾸기
- ex) 5,3,7,6,9 → 5,9,7,6,3
▷ main 코드
ArrayList<Integer> list = new ArrayList<Integer>();
Scanner scan = new Scanner(System.in);
for(int i=0;i<5;i++){
System.out.print((i+1)+"번째 숫자를 입력하세요 >> ");
list.add(scan.nextInt());
}
//최솟값, 최댓값 찾기
int minIndex=0, maxIndex=0;
for(int i=1;i<list.size();i++){
if(list.get(minIndex)>list.get(i))
minIndex=i;
else if(list.get(maxIndex)<list.get(i))
maxIndex=i;
}
System.out.print("변경 전 ArrayList:");
for(int num:list)
System.out.print(num+" ");
System.out.println(); //줄바꿈
//인덱스 오류를 막기 위해 낮은 배열의 인덱스를 minIndex라고 가정한다.
if(minIndex>maxIndex){
int temp = minIndex;
minIndex = maxIndex;
maxIndex = temp;
}
//값 변경
//ex)5 3 7 6 9
list.add(minIndex, list.get(maxIndex)); //5 9 3 7 6 9
list.remove(maxIndex+1); //5 9 3 7 6
list.add(maxIndex+1, list.get(minIndex+1)); //5 9 3 7 6 3
list.remove(minIndex+1); // 5 9 7 6 3
System.out.print("변경 후 ArrayList:");
for(int num:list)
System.out.print(num+" ");
scan.close();
▷ 출력 결과
1번째 숫자를 입력하세요 >> 5
2번째 숫자를 입력하세요 >> 3
3번째 숫자를 입력하세요 >> 7
4번째 숫자를 입력하세요 >> 6
5번째 숫자를 입력하세요 >> 9
변경 전 ArrayList:5 3 7 6 9
변경 후 ArrayList:5 9 7 6 3
1번째 숫자를 입력하세요 >> 5
2번째 숫자를 입력하세요 >> 9
3번째 숫자를 입력하세요 >> 7
4번째 숫자를 입력하세요 >> 6
5번째 숫자를 입력하세요 >> 3
변경 전 ArrayList:5 9 7 6 3
변경 후 ArrayList:5 3 7 6 9
5. HashMap
▶ HashMap <K, V>의 특징
- 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션
- java.util.HashMap
- K는 키로 사용할 요소의 타입, V는 값으로 사용할 요소의 타입 지정
- 키와 값이 한 쌍으로 삽입된다.
- 키는 해시맵에 삽입되는 위치 결정에 사용된다.
- 값을 검색하기 위해서는 반드시 키를 이용한다.
- 삽입, 삭제, 검색이 빠른 특징이 있다.
- 요소 삽입 : put() 메소드
- 요소 검색 : get() 메소드
- ex) HashMap<String, String> 생성, 요소 삽입, 요소 검색
▶ HashMap <K, V>의 주요 메소드
메소드 | 설명 |
V put(K key, V key) | key와 value 쌍을 해시맵에 저장 |
V get(Object key) | 지정된 ket의 값 리턴. 키가 없으면 null 리턴 |
V remove(Object key) | 지정된 key를 찾아 키와 값 모두 삭제 |
void clear() | 해시맵의 모든 요소 삭제 |
boolean containsKey | 지정된 key를 포함하고 있으면 true 리턴 |
boolean containsValue(Object value) | 지정된 값에 일치하는 키가 있으면 true 리턴 |
boolean isEmpty() | 해시맵이 비어 있으면 true 리턴 |
Set<K> KeySet() | 해시맵의 모든 키를 담은 set<K> 컬렉션 리턴 |
int size() | HashMap에 포함된 요소의 개수 리턴 |
▶ 예제
- 이름(키)이 있으면 점수를 출력
- 없는 사람을 입력하면 그런 사람 없음 출력
- "김성동", 97
"황기태", 88
"김남윤", 98
"이재문", 70
"한원선", 99 //점수 저장
▷ main 코드
import java.util.HashMap;
import java.util.Scanner;
public class HashMapEx {
private static final Integer NULL = null;
public static void main(String[] args) {
HashMap<String,Integer> student = new HashMap<String,Integer>();
// 5개의 점수 저장
student.put("김성동", 97);
student.put("황기태", 88);
student.put("김남윤", 98);
student.put("이재문", 70);
student.put("한원선", 99);
Scanner scan = new Scanner(System.in);
System.out.print("점수를 받아올 이름을 입력하세요 >> ");
String s = scan.next(); //출력할 때 이름도 나타내기 위해 변수 s 이용
Integer key = student.get(s); //Integer는 NULL값을 받을 수 있다.
if(key == NULL)
System.out.println("그런 사람 없음");
else
System.out.println(s+" 학생의 점수:"+key);
// or
// if(student.containsKey(s)){
// System.out.println(s+" 학생의 점수:"+student.get(s));
// } else {
// System.out.println("그런 사람 없음");
// }
scan.close();
}//main_end
}//HashMapEx_end
▷ 출력 결과
점수를 받아올 이름을 입력하세요 >> 김남윤
김남윤 학생의 점수:98
점수를 받아올 이름을 입력하세요 >> 홍길동
그런 사람 없음
2023년 6월 7일 수요일
<16일차 수업 후기>
Vector. ArrayList. HashMap 은 처음 접해보았다. 낯설어서 자신감이 떨어졌었는데 파이썬의 리스트와 비슷해서 생각보다 어렵지 않게 문제를 풀 수 있었다. 매번 파이썬을 덕을 보는 것을 보니 공부하길 잘했다는 생각이 들었다.
HashMap을 공부하면서 데이터 객체를 키값쌍의 형태로 표현하는 JSON이 생각났다. 두 개의 차이가 궁금해서 찾아봤는데 Java에서 해시맵을 JSON 객체로 변환하는 방법이 있을 정도로 유사하다는 것을 깨달았다. 정보처리기사를 공부하면서 JSON과 같은 용어들을 단순히 외우기만 했었는데, 실습을 해보니 더 이해가 잘되는 것 같다.
강사님께서는 지금까지 학습한 내용 중에 HashMap과 ArrayList가 가장 중요하다고 말씀하셨다. 가장 중요한 내용인데 많이 접해보지 못했기 때문에 강사님께서 보내주신 자료를 보며 더 많은 시간을 투자하여 공부해야겠다.
'HRD_훈련 > JAVA' 카테고리의 다른 글
[JAVA] StringBuffer, StringTokenizer, Calendar (18일차) (0) | 2023.06.09 |
---|---|
[JAVA] Iterator (17일차) (0) | 2023.06.08 |
[JAVA] 컬렉션과 제네릭 (16일차) (0) | 2023.06.07 |
[JAVA] String, Math 메소드 (15일차) (0) | 2023.06.05 |
[JAVA] 패키지와 Object 클래스 (15일차) (0) | 2023.06.05 |