반응형

개요

 

이번에는 Java로 개발을 진행할 때 굉장히 도움이 되는 제네릭 과 컬렉션에 대해서 알아보도록 하겠습니다.

 


컬렉션(collection) 개념

 

요소(element) 객체들의 저장소

  • 객체들의 컨테이너라고도 불립니다.
  • 요소의 개수에 따라 크기 자동 조절이 가능합니다.
  • 요소의 삽입, 삭제에 따른 요소의 위치 자동 이동이 가능합니다.

 

고정 크기의 배열을 다루는 어려움 해소

 

다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이

 

 

컬렉션은 제네릭 기법으로 구현이 되어 있습니다.

컬렉션의 요소는 객체만 가능합니다.

따라서 int, char, double 등의 기본 타입은 사용할 수 없습니다.

 


제네릭(Generics)

 

제네릭이란? 

제네릭은 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개 변수로 클래스나 메서드를 작성하는 기법으로 C++의 템플릿과 비슷한 개념입니다.

여기서 push 함수 매개변수에 E에 int를 대입하면 정수형으로 처리합니다.

여기서 push 함수 매개변수에 E에 String를 대입하면 문자형으로 처리합니다.

 

제네릭클래스의 사용법

 

제네릭클래스 <적용할 타입> 변수 = new 제네릭 클래스 <적용할 타입>();

 


Vector

 

이번에는 Vector에 대해서 알아보도록 하겠습니다.

Vector <E> 

 

Java.util.Vector

  • <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화

 

여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스

  • 배열의 길이 제한 극복
  • 원소의 개수가 넘쳐나면 자동으로 길이 조절

 

Vector에 삽입 가능한 것

  • 객체, null
  • 기본 타입은 Wrapper 객체로 만들어 저장

 

Vector에 객체 삽입

  • 벡터의 맨 뒤에 객체 추가
  • 벡터 중간에 객체 삽입

 

Vector에서 객체 삭제

  • 임의의 위치에 있는 객체 삭제 가능 : 객체 삭제 후 자동 자리

 


백터 생성 예제

 

import java.util.Vector;

public class VectorEx {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Vector<Integer> v = new Vector<Integer>();
		
		v.add(1);
		v.add(3);
		v.add(4);
		v.add(5);
		v.add(6);
		
		v.add(2,1000);
		int sum=0;
		for(int i=0;i<v.size();i++) {
			int n = v.elementAt(i);
			sum+=n;
		}
		System.out.println("백터에 있는 정수 합 : "+sum);
		
		for(int i=0;i<v.size();i++) {
			System.out.println(i+"번째 값"+v.elementAt(i));
		}
	}

}

 


결과

 

 


ArrayList <E>의 특성

 

java.util.ArrayList, 가변 크기 배열을 구현한 클래스

  • <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화

 

ArrayList에 삽입 가능한 것

  • 객체, null
  • 기본 타입은 박싱/언박싱 Wrapper 객체로 만들어 저장

 

ArrayList에 객체 삽입/삭제

  • 리스트의 맨 뒤에 객체 추가
  • 리스트의 중간에 객체 삽입
  • 임의의 위치에 있는 객체 삭제 가능

 

백터와 달리 스레드 동기화 기능 없음

  • 다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않음
  • 개발자가 스레드 동기화 코드 작성

 


ArrayList<E> 의 주요 메서드

 

 

 

package test01;

import java.util.*;

public class ArrayListEx {
	public static void main(String[] args) {
		//문자열만 삽입가능한 ArrayList 컬렉션 생성
		ArrayList<String> a = new ArrayList<String>();
		//키보드로부터 4 개의 이름 입력받아 ArrayList 에삽입
		Scanner scanner = new Scanner(System.in);
		for (int i = 0; i < 4; i++) {
			System.out.print("이름을 입력하세요 >>");
			String s = scanner.next(); // 키보드로부터 이름입력
			a.add(s); // ArrayList 컬렉션에 삽입
		}
		//ArrayList 에 들어 있는 모든 이름 출력
		for (int i = 0; i < a.size(); i++) {
			//ArrayList 의 i 번째 문자열 얻어오기
			String name = a.get(i);
			System.out.print(name + ", ");
		}
		scanner.close();
	}
}

 

ArrayListEx.class

 


HashMap <K, V>

 

키 <key>와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션

  • java.util.HashMap
  • K는 키로 사용할 요소의 타입, V는 값으로 사용할 요소의 타입 지정
  • 키와 값이 한 쌍으로 삽입
  • 키는 해시 맵에 삽입되는 위치 결정에 사용
  • 값을 검색하기 위해서는 반드시 키 이용

 

삽입, 삭제, 검색이 빠른 특징

  • 요소 삽입 : put() 메서드
  • 요소 검색 : get() 메서드

 

예) HashMap <String, String> 생성, 요소 삽입, 요소 검색

 


HashMap <K, V>의 주요 메서드

 

 


HashMap을 이용한 영단어(영어, 한글) 쌍으로 저장하기

 

package test01;

import java.util.*;

public class HashMapDicEx {
	public static void main(String[] args) {
		//영어 단어와 한글 단어의 쌍을 저장하는 HashMap 컬렉션 생성
		HashMap<String, String> dic = new HashMap<String, String>();
		// 3개의 (key, value) 쌍을 dic 에 저장
		dic.put("baby", "아기"); // 는 key,아기 은 value
		dic.put("love", "사랑");
		dic.put("apple", "사과");
		//영어 단어를 입력받고 한글 단어 검색 . "exit" 입력받으면 종료
		Scanner scanner = new Scanner(System.in);
		while (true) {
			System.out.print("찾고 싶은 단어는?");
			String eng = scanner.next();
			if (eng.equals("exit")) {
				System.out.println("종료합니다...");
				break;
			}
			//해시맵에서 키 ' eng 의 값 ' kor 검색
			String kor = dic.get(eng);
			if (kor == null)
				System.out.println(eng + "는 없는 단어 입니다.");
			else
				System.out.println(kor);
		}
		scanner.close();
	}
}

 

HashMapDicEx.class

파일의 저장된 이름과 시간을 받아와 오름차순으로 정렬

읽어오는 파일 형식 -> 김덕배 04:15:52

 

   public void get_record(JPanel rankingpage) {
      try {
         String path = System.getProperty("user.dir");
         File fi = new File(path, "Record.txt");
         if(!fi.isFile()) {
        	 Main.record.create_File();	// 파일이 존재하지 않는 경우 생성
        	 fi = new File(path, "Record.txt");
         }
         FileReader fi_reader = new FileReader(fi);

         BufferedReader buff_reader = new BufferedReader(fi_reader);
         String line = "";
         String[] arr2 = null;
         int[] time = new int[100];
         String[] name = new String[100];
         int q = 0;
         Map<String, Integer> rank = new HashMap<String, Integer>();
         while ((line = buff_reader.readLine()) != null) {
            String[] arr = line.split("\t");
            name[q] = arr[0];
            arr2 = arr[1].split(":");
            time[q] = Integer.parseInt(arr2[0] + arr2[1] + arr2[2]);
            rank.put(name[q], time[q]);
            q++;

         }
         List<Entry<String, Integer>> list_entries = new ArrayList<Entry<String, Integer>>(rank.entrySet());
         Collections.sort(list_entries, new Comparator<Entry<String, Integer>>() {
            // compare로 값을 비교
            public int compare(Entry<String, Integer> obj2, Entry<String, Integer> obj1) {
               // 오름 차순 정렬
               return obj2.getValue().compareTo(obj1.getValue());
            }
         });

         buff_reader.close();
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
	}

 

이렇게 오늘은 Java에서 지원해주는 컬렉션과 제네릭 

Vector, ArrayList, HashMap 등을 알아보았습니다.

 


 

반응형

+ Recent posts