자료구조 : 데이터를 효율적으로 사용할 수 있도록 구조를 만들어서 저장해 둔 것
자료구조의 종류
1. 리스트: 데이터를 1차원으로 늘어놓은 형태의 자료구조 (배열리스트, 연결리스트)
2. 스택: 배낭에 물건을 넣을 때처럼 제일 마지막에 넣은 데이터부터 순서대로 꺼낼수 있는 자료구조
3. 큐: 매표소에 줄을 서서 기다리는 사람들처럼 들어온 순서대로 데이터를 꺼낼 수 있는 자료구조
3. 해쉬테이블: 데이터를 키로 검색하는것
4. 집합: 똑같은 데이터가 중복 저장되지 않게 만드는 경우
1. 리스트로 사용할수 있는 클래스
1). ArrayList
- ArrayList 클래스를 포함한 모든 자료구조 클래스에는 레퍼런스 타입의 데이터만 저장 가능.
- ArrayList<String>list = new ArrayList<String>();
타입파라미터
- list.add("포도"); 의 형태로 데이터를 추가!
- String str = list.get(2); 인덱서 2위치에 있는것을 리턴!!
- int num = list.size(); 리스트에 있는 데이터의 수를 호출!
- list.set(0,"오렌지"); 인덱스 0위치의 데이터를 "오렌지"로 변경!
- list.remove(1); 인뎃스 1위치의 데이터 삭제
- list index = list.indexOf("사과); 데이터 검색에 사용되는 메소드! 사과의 위치가 있는 인덱스 리턴!
데이터가 없을경우 -1을 리턴
- list.index = list.lastIndexOf("사과"); 리스트의 마지막부터 데이터를 찾음. 마지막 사과의 위치를 리턴.
2). LinkedList
- LinkedList 는 ArrayList와는 달리 객체를 생성한다고 해서 데이터 저장 영역이 생기지 않음.
첫번째 데이터와 마지막 데이터의 위치만 보관하고 있으면 나머지 데이터는 링크를 따라가면서 찾을수 있음.
- 데이터의 추가와 삭제가 빈번한 경우는 LinkedList, 인덱스로 데이터 항목을 찾을일이 많은경우 ArrayList.
- Iterator (순차접근) 사용법!
- Iterator<String> iterator = list.iterator(); 객체생성!
- String str = iterator.next(); next메소드를 통해 데이터 읽어옴
- while (iterator.hasNext()){ String str = iterator.next(); } 반복문을 통해 출력!
2. 스택으로 사용할 수 있는 클래스
- 나중에 넣었던 데이터를 가장 먼저 꺼내는 입출력 방식으로 LIFO(last-in frist-out) 방식이라고 함.
* LinkedList 를 스택으로 사용하는 방법
- LinkedList<Integer>stack = new LinkedList<Integer>();
- list.addLast(new Integer(12); addLast 메소드는 데이터를 스택의 아래쪽부터 순서대로 저장함.
- Integer obj = removeLast(); 제일 위에 있는 숫자가 지워짐.
3. 큐로 사용할 수 있는 클래스
- LinkedList<String> queue = new LinkedList<String>();
- queue.offer("토끼"); 데이터추가
- str = queue.poll(); 큐에 이썬 데이터를 제거하면서 가져오는 메소드.(remove와 쓰임새 비슷)
- str = queue.peek(); 제거하지 않고 그대로 둔 상태에서 가져옴(get과 비슷)
4. 해쉬테이블로 사용할 수 있는 클래스
- 전화번호부의 ㄱㄴㄷㄹ의 분류와 같은 방법
1). HashMap
- HashMap<String, Integer> hashtable = new HashMap<String, Integer>();
<키의타입, 데이터의타입>
- hashtable.put("해리", new Integer(95)); 키값에 "해리" 과 integer 타입 95를 통에다가 넣음.(데이터 넣음)
- Integer num = hashtable.get("해리"); 해리와 일치하는 데이터를 찾아서 리턴
- hashtable.remove("해리"); 해리와 일치하는 데이터 삭제
- hashCode : Object클래스에 있는 메소드로써 객체가 가지는 유일한 값.
class Name{ String firstName; String lastName; Name(String firstName, String lastName){ this.firstName = firstName; this.lastName = lastName; } public boolean equals(Object obj){ if(!(obj instanceof Name)) return false; Name name = (Name)obj; if(fistName.equals(name.firstName) && lstName.equals(name.lastName)) return true; else return false; } public int hashCode(){ return firstName.hashCode() + lastName.hashCode(); } } |
import jaca,util.*; class HashMapExam{ public static void main(String args[]){ HashMap<name, Integer> hashtable = new HashMap<Name, Interger>(); hashtable.put(new Name("해리,"포터"),new Integer(95)); hashtable.put(new Name("헤르미온느","그레인져"), new Integer(100)); hashtable.put(new Name("론","위즐리"), new Integer(85)); hashtable.put(new Name("드레이코","말포이"), new Integer(93)); hashtable.put(new Name("네빌","롱버텀"), new Integer(70)); Integer num = hashtable.get(new Name("헤르미온느","그레인져")); System.out.println("헤르미온느 그레인져의 성적은?" + num); } } |
5. 집합으로 사용할 수 있는 클래스
* HashSet
- HashSet<String>set = new HashSet<String>(); 객체생성!
- set.add("자바"); 집합에 데이터를 저장.
- 집합에 있는 데이터에는 순서가 없음. Iterator를 이용해 집합에 있는 모든 데이터를 읽어올 수 있음.