edu day 24, 25
List
계열의 특징은 저장되는 순서가 있기 때문에 데이터의 중복 저장이 가능하다.
기본적으로 저장된 위치값을 사용할 수 있기 때문에 Set
계열보다 훨씬 다양한 기능을 처리하는 메서드가 제공된다.
Set
에서는 불가능했던 특정 값 검색, 중간에 값 삽입, 값 수정 등의 작업이 모두 가능하다.👍
set
과 마찬가지로 Object타입(다형성)으로 설정할 수 있다.
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
//중복저장, 순서가 있음, 배열과 유사
List list2 = new ArrayList();//다형성 사용 가능
ArrayList list = new ArrayList();
list.add("홍길동");
list.add("이순신");
list.add(20);
list.add("홍길동");
list.add(3.15);
list.add(new Date());
System.out.println(list);
}
}
// 출력
// [홍길동, 이순신, 20, 홍길동, 3.15, Thu Jun 15 09:50:07 KST 2023]
(get(), size(), contains(), indexOf(), isEmpty(), subList(), toArray(), add(), set(), remove() 등)
import java.util.ArrayList;
import java.util.List;
public class ListTest3 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("홍길동");
list.add("이순신");
list.add("유관순");
list.add("강감찬");
list.add("세종"); //append
System.out.println("길이(크기)"+ list.size());
System.out.println("값 포함여부"+ list.contains("세종"));
System.out.println("특정값 위치"+ list.indexOf("세종"));
System.out.println("값이 없냐"+ list.isEmpty());
System.out.println(list);
List<String> sub = list.subList(1, 3); //end-1
System.out.println(sub);
System.out.println("=============");
Object[] obj = list.toArray();
for (Object object : obj) {
System.out.println("***"+object);
}
//중간 삽입(insert)
list.add(0,"정조");
System.out.println(list);
//수정(update)
list.set(0,"영조");
System.out.println(list);
list.remove(0);
list.remove("세종");
//데이터 출력
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
import java.util.ArrayList;
import java.util.Iterator;
public class ListTest6 {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("홍길동1", 10, "서울1"));
list.add(new Person("홍길동2", 12, "서울2"));
list.add(new Person("홍길동3", 13, "서울3"));
for (Person p : list) {
System.out.println(p.getName());
}
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getName());
}
Iterator<Person> ite = list.iterator();
while(ite.hasNext()) {
System.out.println(ite.next().getName());
}
}
}
🙂Map
계열은 데이터를 key/value
쌍으로 저장하는 자료구조로서 key를 이용하여 원하는 값을 얻을 수 있다. 반드시 key는 유일한 값으로 사용해야 되며 value는 중복이 가능하다. 또한 순서가 없기 때문에 랜덤하게 출력된다.
만약 key가 중복되면 마지막으로 저장한 key로 덮어쓰게 된다.
또한 다른 어떤 자료구조보다도 빠른 검색이 가능하며 Generic 사용도 가능하다.
Map 인터페이스의 하위 클래스는 HashTable
과 HashMap
이다.
HashMap
은 저장되는 순서가 유지되지 않고, 단 하나의 null키를 가질 수 있다.
HashTable
은 null키와 null값을 저장할 수 없다.
Interface Map <K,V>
K - tye type of keys maintained by this map
V - the type of mapped values
🔴 Map(HashMap) 구조
key - String | value - Object |
---|---|
one | Person("홍길동") |
two | Person("이순신") |
three | Person("유관순") |
map.put("one", new Person("홍길동"));
Person p = map.get("one");
🟠 Map 인터페이스 메서드 (Hashtable, HashMap)
메서드 | 설명 |
---|---|
put(Object key, Object value) putAll(Map m) | key에 해당되는 value객체를 저장 |
V get(key) | key에 해당되는 value 반환 |
remove(key) | key에 해당되는 value 삭제 |
void clear() | Map의 모든 객체를 삭제 |
boolean isEmpty() | Map이 비어있는지 확인 |
int size() | Map에 저장된 객체의 갯수 |
Set keySet() | Map에 저장된 모든 key 객체를 Set 계열로 반환 |
Collection<V> values() | Map에 저장된 모든 값들을 Collection으로 반환 |
boolean containsKey(key) | Map에 지정된 Key가 있는지 boolean 반환 |
Collection containsValue(value) | Map에 지정된 value가 있는지 boolean 반환 |
--> 메서드 이름이 가독성이 좋아 해당 메서드가 어떤 기능을 하는지 대략적으로 알 수 있으니 자연스럽게 쓰면 된다👍
HashMap은 null값을 허용하는 특징이 있다.
<Object,Object>
typeimport java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
//<Object, Object>
Map map = new HashMap(); //다형성
map.put("one", "홍길동");
map.put("two", new Date());
map.put(1, "강감찬");
// map.put(3.14, 10);
map.put("one", "이순신"); //key "one"의 value를 "이순신"으로 덮는다.
System.out.println(map.get("one"));
System.out.println(((String)map.get("one")).length()); //형변환 후 길이 출력
System.out.println(map.get("two"));
System.out.println(map.get(1));
System.out.println(map.get(3.14)); //null
System.out.println(map.size());
}
}
<String,String>
typeimport java.util.HashMap;
public class MapTest2 {
public static void main(String[] args) {
//하나의 null키를 가질 수 있음
//Generic key/value
HashMap<String,String> map = new HashMap<>();
map.put("one", "홍길동");
System.out.println(map.get("one"));
map.put("two", "이순신");
map.put("three", "유관순");
map.put("one", "강감찬");
map.put("one", null);
map.put(null, null);
map.put(null, "aaa");
// map.put("aa", 100); //100은 String타입이 아니기 때문에 error
System.out.println(map.get("two"));
System.out.println(map.get("thres"));
System.out.println(map.get("four"));
System.out.println(map.get(null));
}
}
해시 테이블은 null 값, null 키를 허용하지 않는다.
Hashtable<String, String> map = new Hashtable<>();
map.put("one", null); //Exception 발생
map.put(null, null); //Exception 발생
Map에서 key값만 출력하는 것은 불가능하다.
그래서 map.keySet()
함수를 이용해 Set 객체를 생성하여 key값만 받아오면 된다. 그 key 값으로 map.get(key)
로 value 값을 불러올 수 있다.
import java.util.HashMap;
import java.util.Set;
public class MapTest4_1 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("one", "홍길동");
map.put("two", "이순신");
map.put("three", "유관순");
//순회
//1. key값만 얻기
Set<String> keys = map.keySet();
System.out.println(keys);
for (String key : keys) { //2. 전체 키에서 key 하나 얻기
System.out.println(key + "\t" + map.get(key));
}
System.out.println("=================");
}
}
import java.util.HashMap;
public class MapTest5_0 {
public static void main(String[] args) {
HashMap<String, Person> map = new HashMap<>();
map.put("one", new Person("홍길동",20,"서울"));
map.put("two", new Person("이순신",30,"전라"));
map.put("three", new Person("유관순",40,"서울"));
System.out.println(map);
//one, two, three 각각 get후 이름 sysout
String one = map.get("one").getName();
String two = map.get("two").getName();
String three = map.get("three").getName();
System.out.println(one);
System.out.println(two);
System.out.println(three);
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class MapTest6 {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("홍길동", 20, "서울"));
list.add(new Person("홍길동2", 30, "서울2"));
list.add(new Person("홍길동3", 40, "서울3"));
ArrayList<Person> list2 = new ArrayList<>();
list2.add(new Person("이순신", 20, "전라"));
list2.add(new Person("이순신2", 30, "전라2"));
list2.add(new Person("이순신3", 40, "전라3"));
Map<String, ArrayList<Person>> map = new HashMap<String, ArrayList<Person>>();
map.put("one", list);
map.put("two", list2);
//value 이름과 나이 출력
for (String key : map.keySet()) {
ArrayList<Person> listP = map.get(key);
Iterator<Person> ite = listP.iterator();
while(ite.hasNext()) {
Person p = (Person)ite.next();
System.out.println(p.getName() + "\t" + p.getAge());
}
}
System.out.println("=================");
for (String key : map.keySet()) {
ArrayList<Person> listP = map.get(key);
for (int i = 0; i < listP.size(); i++) {
Person p = (Person)listP.get(i);
System.out.println(p.getName() + "\t" + p.getAge());
}
}
System.out.println("=================");
for (String key : map.keySet()) {
ArrayList<Person> listP = map.get(key);
for (Person p : listP) {
System.out.println(p.getName() + "\t" + p.getAge());
}
}
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
public class MapTest7 {
public static void main(String[] args) {
HashMap<String, Person> map = new HashMap<>();
map.put("one",new Person("홍길동", 20, "서울"));
map.put("two",new Person("홍길동2", 30, "서울2"));
map.put("three",new Person("홍길동3", 40, "서울3"));
HashMap<String, Person> map2 = new HashMap<>();
map2.put("one",new Person("이순신1", 20, "전라1"));
map2.put("two",new Person("이순신2", 30, "전라2"));
map2.put("three",new Person("이순신3", 40, "전라3"));
ArrayList<HashMap<String, Person>> list = new ArrayList<HashMap<String,Person>>();
list.add(map);
list.add(map2);
// 이름과 나이 출력
for (int i = 0; i < list.size(); i++) {
HashMap<String, Person> map3 = (list.get(i));
Set <String> keys = list.get(i).keySet();
for (String key : keys) {
System.out.println(map3.get(key).getName() + "\t" + map3.get(key).getAge());
}
}
System.out.println("=====================");
for (int i = 0; i < list.size(); i++) {
Set <String> keys = list.get(i).keySet();
for (String key : keys) {
System.out.println(list.get(i).get(key).getName() + "\t" + list.get(i).get(key).getAge());
}
}
}
}
--> 이 문제와 바로 위 문제는 헷갈리기 쉬우므로 형변환과 구조를 파악하여 코드 구현 연습하자❗❗
Hashtable
의 하위 클래스인 Properties
는 key와 value 모두 String으로 저장할 때 사용하는 특화된 클래스이다.
setProperty(String key, String value)
메서드로 저장하고 getProperty(String key)
메서드로 value값을 얻는다. 시스템의 환경변수 값을 자바에서는 Properties
로 참조해서 출력할 수 있다.
import java.util.Enumeration;
import java.util.Properties;
public class MapTest8 {
public static void main(String[] args) {
//String/String 저장
Properties prop = new Properties(); //제네릭을 지정하지 않아도 String type으로 된다.
prop.setProperty("one", "홍길동"); //set과 같은 기능
prop.setProperty("two", "홍길동2");
prop.setProperty("three", "홍길동3");
String one = prop.getProperty("one");
System.out.println(one);
System.out.println(prop.getProperty("two")); //get과 같은 기능
System.out.println(prop.getProperty("three"));
System.out.println("=======================");
Enumeration<?> enu = prop.propertyNames(); //iterator랑 메서드만 다르고 용도는 비슷하다.
while (enu.hasMoreElements()) {
String key = (String) enu.nextElement();
System.out.println(key + "\t" + prop.getProperty(key));
}
} //end main
}