Java - 15

하승·2022년 7월 11일
0

웹 개발반 - Java

목록 보기
15/19
post-thumbnail

컬렉션 프레임워크(Collection Framework)

많은 데이터들을 쉽고 효과적으로 관리할 수 있는
표준화된 방법을 제공하는 클래스 및 인터페이스의 집합

List extends Collection
	 구현 클래스
	- ArrayList
	- LinkedList
	- Vector

Set  extends Collection
	 구현 클래스
	- HashSet
	- TreeSet

ArrayList

컬렉션 클래스 중 가장 많이 사용되는 클래스
배열을 이용해서 값을 저장한다.

인덱스를 이용해서 각 요소에 빠르게 접근 가능하지만
크기를 변경시키기 위해서는 새로운 배열을 생성하고 기존의
값들을 옮겨야 하므로 느리다.

배열은 처음에 몇 칸을 할당할지 고정해야 하지만
ArrayList는 값을 넣는 만큼 자동으로 늘어난다.
package collection;

import java.util.ArrayList;

public class ArListTest1 {
	public static void main(String[] args) {
		ArrayList<String> arr1 = new ArrayList<String>();
		
		//ArrayList에 요소 추가하기
		arr1.add("Hello");
		arr1.add("Java!");
		arr1.add("Very");
		arr1.add("Sleepy");
		
		//ArrayList의 구조 간단히 파악하기
		System.out.println(arr1);
		
		//ArrayList의 요소 수정하기
		arr1.set(3,	"Happy");
		System.out.println(arr1);

		//ArrayList의 요소 개수(길이)
		for (int i = 0; i < arr1.size(); i++) {
			//ArrayList에서 요소 가져오기
			System.out.println(arr1.get(i));
		}
		
//		arr1.remove("Very");
		arr1.remove(2);
		System.out.println(arr1);
	}
}
package collection;

import java.util.ArrayList;

public class ArListTest2 {
	public static void main(String[] args) {
//		user클래스를 따로 정의하면 아래와 같이 User타입으로 이용 가능하다.
		ArrayList<User> arr2  = new ArrayList<User>();
//		이때는 객체화 하면서 값을 담아주어야 한다,
		arr2.add(new User("apple"));
		arr2.add(new User("banana"));
		arr2.add(new User("cherry"));
		arr2.add(new User("apple"));
//		이때 출력해보면 객체의 주소값의 toString으로 출력되고 있다. 재정의를 따로 해주어야 한다.
//		재정의를 해주면 우리가 원하는 값을 볼 수 있다.
		System.out.println(arr2);
//		인덱스를 이용한 값 제가가 아닌 우리는 obj를 이용하여 값을 제거하고 싶다.
//		remove에 객체를 그대로 넘겨주면 삭제되지 않고 동위객체로 인식하고 서로 다른 객체로 인정한다. 
//		즉, 그냥 remove에 객체를 넘기면 삭제가 안된다.
//		따라서 우리는 동위객체 또한 같은 값으로 인정하기 위한 재정의를 해야한다.
//		동위객체 비교메소드를 재정의 하고 나면 아래와 같이 사용가능하다.
		arr2.remove(new User("apple"));
//		동위객체 비교는 0번째 요소부터 검사한다.
		System.out.println(arr2);
	}
}

class User{
	String userid;

	public User(String userid) {
		this.userid = userid;
	}
//	위에서 보듯이 toString을 따로 재정의를 해주지 않으면 주소값과 관련된 값이 출력된다.
	@Override
	public String toString() {
		return "아이디 : " + this.userid;
	}
//	동위객체여부를 판단하는 메소드는 equals이다.
	@Override
//  여기 매개변수에는 우리가 정의한 User객체가 들어 올 것이다. Object는 모든 타입의 상위객체로 매개변수로 들어오면
//	업캐스팅이 발생한다.
	public boolean equals(Object obj) {
//		업캐스팅이 발생되면 들어온 인자가 User객체의 인스턴스에 포함되는지 여부를 다시 판단한다.
//		이때 들어온 객체는 User로 객체화 된 obj가 들어옴으로 참이다.
		if(obj instanceof User) {
//			업캐스팅된 객체를 다시 User로 다운캐스팅하여 target객체를 생성한다.
			User target = (User)obj;
//			기존에 객체화 된 값인 userid가 인자로 들어온 값의 userid가 같으면 값이 같다는 것임으로 true를 리턴
			if(this.userid.equals(target.userid)) {
				return true;
			}
		}
//		인스턴스 판단에 들어오지 못하면 전혀 다른 객체임으로 false를 리턴한다.
		return false;
	}
	
}

HashSet

Set은 집합이다.
집합은 중복되는 원소(요소, 값)를 담을 수 없다.
저장된 값들은 인덱스가 없기 때문에 저장 순서가 고정되어 있지 않다.
값의 중복 제거와, 유무 검사 목적이 있다.	

.iterator()
순서가 없는 set 타입의 요소에 순서를 부여해주는 기능을 담당한다.
순서가 부여되면 값들을 .next()를 통해 하나씩 가져올 수 있다.
리턴타입은 Iterator<> 이다.

Set은 검색의 목적이 있기 때문에 순서 정보를 관리할 필요가 없다.
따라서 데이터의 크기에 상관없이 검색에 걸리는 시간이 매우 짧다.
반면 ArrayList는 인덱스를 관리해야 하기 때문에 상대적으로
시간이 오래 걸린다. 기능적으로 HashSet과 ArrayList로 구현한 것이
차이가 없다면 HashSet을 이용하는 것이 좋다.
package collection;

import java.util.HashSet;
import java.util.Iterator;

public class HSetTest {
	public static void main(String[] args) {
		HashSet<Integer> set1 = new HashSet<Integer>();
		
		//HashSet에 요소 추가하기
		set1.add(10);
		set1.add(20);
		set1.add(30);
		set1.add(40);
		set1.add(50);
		set1.add(50);
		set1.add(50);
		set1.add(50);
		set1.add(50);
		
		//HashSet의 구조 간단히 파악하기
		System.out.println(set1);
		
		//HashSet의 요소 개수(길이)
		System.out.println(set1.size());
		
		//HashSet의 요소 포함 여부 확인하기
		System.out.println(set1.contains(30));
	
		//HashSet에서 요소 삭제하기
		set1.remove(30);
		System.out.println(set1);
		
		HashSet<User> set2 = new HashSet<User>();
		set2.add(new User("apple"));
		set2.add(new User("banana"));
		//HashSet은 기존의 객체와 같은 객체인지 판별할때 hashCode()로 비교를 한다.
		//정상적으로 이용하려면 우리가 담아줄 객체의 타입 클래스에서 hashCode()도 재정의 해야 한다.
		set2.add(new User("apple"));
		
		System.out.println(set2);
		
		Iterator<Integer> iter = set1.iterator();
		
		while(iter.hasNext()) {
			System.out.println(iter.next());
		}
		
		iter = set1.iterator();
		while(iter.hasNext()) {
			System.out.println(iter.next());
		}
		
	}
}

HashMap

Map구조 : Key(키)와 Value(값)가 쌍으로 저장되는 형태

	Key	Value

Entry	fly	 날다
Entry	walk 걷다
Entry	run	 뛰다

Key와 Value가 한 쌍(Entry)으로 저장된다.
그러므로 검색에 용이하다.
Key는 중복이 불가능하며, Value는 가능하다.
따라서 Key는 Set타입이고, Value는 Collection 타입이다.

키 <-> 해쉬테이블 <->
package collection;

import java.util.HashMap;

public class HashMapTest {
	public static void main(String[] args) {
		HashMap<Integer, String> map = new HashMap<Integer, String>();
		
		//HsahMap에 데이터 추가하기
		map.put(1, "하나");
		map.put(2, "둘");
		map.put(3, "셋");
		map.put(4, "넷");
		map.put(5, "다섯");
		
		//HashMap의 데이터 수정하기
		map.put(2, "두울리");
		
		//HashMap에서 요소 가져오기
		System.out.println(map.get(2));
		
		//HashMap에서 요소 삭제하기(키값만 넘기는 경우) - value를 리턴
		String duly = map.remove(2);
		System.out.println(duly);
		
		//HashMap 간단하게 구조 파악하기
		System.out.println(map);
		
		//HashMap에서 요소 삭제하기(Key,Value 둘 다 넘기는 경우) -boolean타입 리턴(Key,Value 값 모두 정상적으로 넘기면 삭제하며 true)
		System.out.println(map.remove(4, "넷"));
		System.out.println(map.remove(5, "하나"));
		
		System.out.println(map);
		
		//HashMap의 데이터 개수(길이) - 한 쌍을 하나로 셈
		System.out.println(map.size());
	}
}
profile
화이팅!

0개의 댓글