220627 TIL

Yeoni·2022년 6월 27일
0

국비교육TIL

목록 보기
19/41

국비교육 19일차 Java : Collection, ArrayList, LinkedList, HashMap

1. Collection(자료구조)

1) Array(배열)과 Collention(자료구조)의 차이점

  • Array는 크기가 한정되어 있지만, Collection은 크기가 무한적이다.
  • Array는 배열에 선언되어진 것과 동일한 타입의 데이터만 입력 가능하지만, Collection은 입력되어지는 데이터가 객체(Object)이기만 하면 어떤 것이든 입력이 가능하다.

2) Collection 타입

  • 웹에서 가장 많이 사용되는 대표적인 Collection 타입은 List계열의 Arraylist 클래스와 Map계열의 HashMap이다.
    - 게임에서는 List 계열의 Vector와 Map 계열의 Hashtable을 쓴다.

3) 제네릭(Generic) 타입

ArrayList<String> str_list = new ArrayList<String>();

  • 쉽게 말해서 객체들을 저장(수집)하는 구조적인 성격을 보강하기 위해 제공하는 것이다.
  • 제네릭 타입의 이용 전에는 콜렉션 안에 여러 객체가 한번에 들어가 있어, 객체들을 하나씩 뽑아서 객체 타입을 확인해야했다.
  • 하지만, 제네릭(Generic)타입을 사용함으로써 별도의 형 변환(Casting)이 필요없이 < > 사이에 선언하였던 객체자료형으로 검출되어 편리하다.

2. ArrayList

1) ArrayList의 특징

  • 출력시 저장된 순서대로 나온다.
  • 중복된 데이터를 저장할 수 있다.
  • 데이터를 읽어오는 속도는 ArrayList 가 LinkedList 보다 상대적으로 빠르다.
  • 순차적으로 데이터를 추가/삭제하는 경우에는 ArrayList 가 LinkedList 보다 상대적으로 빠르다.
  • 일반적인 데이터 추가/삭제는 데이터 중간 중간마다 발생하므로 이러한 경우에는 ArrayList 가 LinkedList 보다 상대적으로 느리다.
  • 결과값은 ArrayList 를 사용하든지 LinkedList 를 사용하든지 동일한 결과값을 가진다.
  • LinkedList 보다는 ArrayList 를 사용하도록 하자.

2) ArrayList의 사용

  • Example class
public class Example {
	
	// field
	String name1;
	String name2;
	

	// 기본 생성자
	public Example() { 	}
	
	
	// 파라미터가 있는 생성자
	public Example(String name1, String name2) {
		this.name1 = name1;
		this.name2 = name2;
	}
	
	
	// method
	public void name_info() {
		System.out.println("1. 이름 : "+name1+"\n"
						 + "2. 번호 : "+name2+"\n");
	}
}
  • Main class
public static void main(String[] args) {

	// 1. ArrayList 객체 exList
	ArrayList<Example> exList = new ArrayList<>();

	// 2. Example 클래스에 객체 생성하여 exList에 저장
	exList.add(new Example("가_1","1"));
	exList.add(new Example("나_1","2"));
	exList.add(new Example("다_1","3"));
	exList.add(new Example("라_1","4"));
		// add는 list에 객체를 저장하여 준다. 
	
	// 3. exList에 저장되어진 정보 출력(Example 클래스의 name_info)
	// 일반 for문
	for(int i=0; i<exList.size(); i++) {
						//size()는 list에 저장되어진 데이터의 수
		exList.get(i).name_info();		
		// 리스트를 하나씩 get으로 가져오는데 괄호 안 i에는 index number
	} // end of for
	
	// 확장 for문
	for(Example ex : exList) { 		
		// 리스트 안에 들어온 수 만큼 자동적으로 반복
		// 타입은 Example 타입
		// exList.size() 만큼 반복한다. 
		ex.name_info();
	} // end of for
	
	//--------------------------------------//
	
	// ArrayList 타입인 exList에 새로운 객체 추가시 특정 위치(index)에 추가하기
	exList.add(new Example("마_1","5"));
	// index 값을 지정하지 않으면 맨 뒤에 추가된다.
	
	exList.add(2, new Example("나_2","6"));
	// index 값을 지정하면 해당 index에 저장되며, 다른 list들은 뒤로 밀리게 된다. 
	
	for(Example ex : exList) { 		
		ex.name_info();
	} // end of for
	/*
	 	1. 이름 : 가_1
		2. 번호 : 1
		1. 이름 : 나_1
		2. 번호 : 2
		1. 이름 : 나_2 	<< 중간에 들어오게 된다. 
		2. 번호 : 6
		1. 이름 : 다_1
		2. 번호 : 3
		1. 이름 : 라_1
		2. 번호 : 4
		1. 이름 : 마_1
		2. 번호 : 5
	 */
	
	// ArrayList 타입인 exList에 저장된 객체 삭제하기
	System.out.println("삭제 전 list.size : "+exList.size()); 	//6
	exList.remove(5); 	// 마_1 삭제
	System.out.println("삭제 후 list.size : "+exList.size()); 	//5
	
	// 이름 앞글자에 '나'가 오는 경우 삭제하기
	// 앞에서 부터 지우게 되면 지우지 못하는 목록이 발생해서 뒤부터 지워야 한다.
	for(int i=exList.size()-1; i>=0; i--) { 
		if(exList.get(i).name1 != null && exList.get(i).name1.startsWith("나")) {
			exList.remove(i);
		}
	}
	
	for(Example ex : exList) { 		
		ex.name_info();
	} // end of for
	/* 
		1. 이름 : 가_1
		2. 번호 : 1
		1. 이름 : 다_1
		2. 번호 : 3
		1. 이름 : 라_1
		2. 번호 : 4
	 */
	
} // end of main

3. LinkedList

  • ArrayList와 사용 방식은 똑같다.
  • 출력시 저장된 순서대로 나온다.
  • 중복된 데이터를 저장할 수 있다.
  • 데이터를 읽어오는 속도는 LinkedList 가 ArrayList 보다 상대적으로 느리다.
  • 순차적으로 데이터를 추가/삭제하는 경우에는 LinkedList 가 ArrayList 보다 상대적으로 느리다.
  • 일반적인 데이터 추가/삭제는 데이터 중간 중간마다 발생하므로 이러한 경우에는 LinkedList 가 ArrayList 보다 상대적으로 빠르다.
  • 결과값은 ArrayList 를 사용하든지 LinkedList 를 사용하든지 동일한 결과값을 가진다.
  • LinkedList 보다는 ArrayList 를 사용하도록 하자.

4. HashMap

1) Map 계열

  • HashMap 과 HashTable 이 있다.
  • Map 계열은 List 계열(Vector, ArrayList, LinkedList)처럼 index 가 사용되어 저장되는 것이 아니라,
  • Map 계열은 key값과 value값을 쌍으로 사용하여 저장하는데 데이터 저장시 사용되는 메소드는 put(String key, Object value)메소드를 사용한다. 이때 key값은 반드시 고유한 값을 가져야 하고, value값은 중복된 값이 와도 괜찮다.
  • key값이 중복으로 오게 되면 앞의 데이터가 덮어 씌워서 사라지게 된다.
  • Map 계열에 저장된 key값들은 순서와는 상관없이 저장된다.
  • Map 계열에 저장된 value값을 추출하려면 key를 이용해서 가져오는데 value 값의 추출은 get(String key) 메소드를 사용한다.

1) HasyMap의 사용

  • 클래스는 위의 Example 클래스와 동일
  • Main class
public static void main(String[] args) {
	
	// 3개 다 사용가능
	// HashMap<String, Example> exMap = new HashMap<String, Example>();
	// HashMap<String, Example> exMap = new HashMap<>();
	Map<String, Example> exMap = new HashMap<>(); 
	
	exMap.put("가_1", new Example("가_1","1")); 
	exMap.put("나_1", new Example("나_1","2")); 
	exMap.put("다_1", new Example("다_1","3")); 
	exMap.put("라_1", new Example("라_1","1")); 
	exMap.put("마_1", new Example("마_1","4")); 
	// key 값을 "가_1", "나_1" 등으로 하여 key 값을 입력하면 해당 데이터를 뽑아올 수 있다. 
	// put(key, value) 사용하여 저장 

	// "다_1"을 찾아서 출력할 때.
	String search_name = "다_1";
	Example ex = exMap.get(search_name); 	
	// get()으로 가져온다. 
	// Map은 index번호를 달고 저장된 것이 아니기 때문에
	// for문을 사용하지 않아도 원하는 값을 바로 찾을 수 있다.
	
	if(ex != null) {
		ex.name_info();
	} else {
		System.out.println(">> 검색하신 "+search_name+"에 해당하는 항목이 없다. <<");
	}
	/*
	 	1. 이름 : 다_1
		2. 번호 : 3
	 */
	
	
} // end of main
profile
이런 저런 기록들

0개의 댓글