강좌 Course 2. Part 2. ch1 4~6강 요약
순서가 있고 중복이 가능한 객체의 모음을 다룬다.
List라는 인터페이스가 있고, 이를 구현한 ArrayList, LinkedList 클래스가 있다.
가장 많이 쓰는 것은 ArrayList이다.
* 파이썬과 다르게 자바는 인덱스 -1을 준다고 뒤에서부터 인덱스를 찾아주지 않는다. 원소 개수를 모르는 상태에서 맨 뒤 원소를 가져오려면 size()-1를 인덱스로 사용하자.
// 예시: List
public class ListExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
list.add("cherry");
list.add("banana");
for (String str:list){
System.out.println(str);
} // 중복 가능
System.out.println(list.get(0)); // 순서(인덱스) 있음
System.out.println(list.get(list.size()-1)); // 맨 끝 원소 가져오기
System.out.println("----"); // 구분선
list.remove(3); // 원소 제거
list.set(1, "orange"); // 원소 수정(수정할 원소의 인덱스, 수정할 값)
for (String str:list){
System.out.println(str);
}
}
}
순서가 없고 중복된 원소가 없는 객체의 모음을 다룬다. Set 인터페이스를 구현한 클래스로는 HashSet, TreeSet(SortedSet을 구현) 클래스가 있다.
// 예시: HashSet
public class HashSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("Apple");
set.add("Banana");
set.add("Orange");
set.add("Apple"); // 중복된 원소
System.out.println(set.size()); // 3, 중복 포함 x
for (String item : set){
System.out.println(item);
}
// 원소 제거
set.remove("Banana");
System.out.println("----");
for (String item : set){
System.out.println(item);
}
// 원소 포함되어있나 확인
boolean contains = set.contains("Orange");
System.out.println(contains);
// set이 비어있는지 확인
set.clear();
boolean empty=set.isEmpty();
System.out.println(empty);
}
}
키-값 쌍의 객체를 다룬다.
Map 인터페이스를 구현한 클래스로는 HashMap, TreeMap(SortedMap을 구현)이 있다. 순서와 상관이 없어서 넣은 순서와는 다르게 출력될 수 있는데 당황할 필요 없다.
HashMap을 사용하면 key를 사용해 value를 뽑아올 수 있기 때문에 검색 성능을 높일 수 있다. 이 때 key는 중복될 수 없다.
List와 Set과는 다르게, Map은 원소를 추가하려면 add()가 아닌 put()를 사용한다. 이미 있는 key에 새로운 값을 put하면 새로운 값으로 수정이 된다.
// 예시: HashMap
public class MapExample {
public static void main(String[] args) {
Map<String,Integer> stdScores = new HashMap<String, Integer>();
stdScores.put("Kim",90);
stdScores.put("Lee",75);
stdScores.put("Park",85);
stdScores.put("Choi",80);
// key로 값 받아오기 .get(key)
System.out.println("Kim's Score: "+stdScores.get("Kim"));
// 수정
stdScores.put("Kim",88);
System.out.println("Revised Score: "+stdScores.get("Kim"));
// 삭제 - 없는 값은 null
stdScores.remove("Choi");
System.out.println("Choi's score was removed: "+stdScores.get("Choi"));
// entry 객체로 iterate
for (Map.Entry<String,Integer> entry:stdScores.entrySet()){
System.out.println(entry.getKey()+"'s score: "+entry.getValue());
}
}
}
HashMap을 사용하여 "Hello, World"에서 각 알파벳이 몇 번 나왔는지 세볼 수 있다.
public class CharacterCount {
public static void main(String[] args) {
String str = "Hello, World";
Map<Character,Integer> charCountMap = new HashMap<>();
char[] strArray = str.toCharArray(); // {'H','e','l','l','o',...}
for (char ch:strArray){
if (charCountMap.containsKey(ch)) {
charCountMap.put(ch,charCountMap.get(ch)+1);
} else {
charCountMap.put(ch,1);
}
}
// entry로 출력
for (Map.Entry<Character,Integer> entry:charCountMap.entrySet()){
System.out.println(entry.getKey()+" was counted "+entry.getValue()+" time(s).");
}
// key 값으로 출력
for (char c:charCountMap.keySet()){
System.out.println(c+" x "+charCountMap.get(c));
}
}
}
Map에서 key와 value를 받는 방법은 여러가지가 있는데, key를 받아 value를 뽑아올 수도 있고, Map 밑의 Entry 객체를 사용하여 키와 값을 쌍을 이루어 받아올 수도 있다. 전체 저장된 쌍을 불러오는 메서드는 entrySet()이고, 한 쌍의 entry마다 getKey(), getValue() 동작으로 키와 값을 불러올 수 있다.