728x90
반응형

<오늘의 학습 - 데이터베이스를 관리하는 방법>

1. 컬렉션

2. 제네릭

3. Vector

4. ArrayList

5. HashMap

 

 

3. Vector

▶ Vector <E>의 특징

  1. java.util.Vector
    • <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화한다.
  2. 여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스이다.
    • 배열의 길이 제한을 극복한다.
    • 원소의 개수가 넘치면 자동으로 길이를 조절한다.
  3. Vector에 삽입 가능한 것
    • 객체, null
    • 기본 타입은 Wrapper 객체로 만들어 저장한다.
  4. Vector의 객체 삽입
    • 벡터의 맨 뒤에 객체를 추가한다.
    • 벡터 중간에 객체를 삽입할 수 있다.
  5.  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>의 특징

  1. 벡터와 거의 동일하지만 메소드를 사용할 때 차이가 있다.
  2. 벡터와 달리 스레드 동기화 기능이 없다.
    • 다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않는다.
    • 개발자가 스레드 동기화 코드를 작성한다.
  3. java.util.ArrayList, 가변 크기 배열을 구현한 클래스
    • <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화
  4. ArrayList에 삽입 가능한 것
    • 객체, null
    • 기본 타입은 박싱/언박싱으로 Wrapper 객체로 만들어 저장한다.
  5. ArrayList에 객체 삽입
    • 리스트의 맨 뒤에 객체를 추가한다.
    • 리스트의 중간에 객체를 삽입할 수 있다.
  6. 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>의 특징

  1. 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션
    • java.util.HashMap
    • K는 키로 사용할 요소의 타입, V는 값으로 사용할 요소의 타입 지정
    • 키와 값이 한 쌍으로 삽입된다.
    • 키는 해시맵에 삽입되는 위치 결정에 사용된다.
    • 값을 검색하기 위해서는 반드시 키를 이용한다.
  2. 삽입, 삭제, 검색이 빠른 특징이 있다.
    • 요소 삽입 : put() 메소드
    • 요소 검색 : get() 메소드
  3. 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가 가장 중요하다고 말씀하셨다. 가장 중요한 내용인데 많이 접해보지 못했기 때문에 강사님께서 보내주신 자료를 보며 더 많은 시간을 투자하여 공부해야겠다.

728x90
반응형

+ Recent posts