오늘 학습한 부분은 Map, Set, Enum, Casting, final이다. 이 부분은 파이썬을 배우면서도 완벽하게 내 것으로 만들지 못했던 부분이였어서 좀 더 집중해서 공부를 했다. 파이썬 공부할 때보다 조금이나마 더 지식이 쌓인 듯 해서 뿌듯하다. 이런 식으로 하나하나 쌓아나갔으면 좋겠다. 어쨋든 TIL.
map은 대응관계(key, value)를 표현할 수 있게 해주는 자료형이다. 자바의 map은 파이썬에서의 dictionary와 유사한 자료형이다. map을 Associative array, Hash라고도 한다.
배열, 리스트와의 차이는 여러가지가 있다.
Map 자료형에는 item(key, value)를 불러오는 순서에 따라 HashMap, LinkedMap, TreeMap 등이 있다. Map도 List와 같이 인터페이스이다.(인터페이스는 객체지향 파트에서 공부할 것이다.)
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> dic = new HashMap<>();
dic.put("parse", "분석하다.");
dic.put("retain", "유지하다");
dic.put("associative", "연합의");
dic.put("abstract", "추상적인");
System.out.println(dic);
// {retain=유지하다, associative=연합의, parse=분석하다., abstract=추상적인}
}
}
우선 HashMap을 import한다.
HashMap 역시 List에서와 마찬가지로 제네릭스를 사용해서 자료형 타입을 명시해주어야 에러가 날 확률을 줄일 수 있다.
put은 HashMap에 item(key, value)를 추가해주는 메소드이다.
예시로 사전을 만들었다. 출력을 하면 역시 순서가 뒤죽박죽인걸 확인할 수 있다.
System.out.println(dic.get("retain")); // 유지하다 출력
System.out.println(dic.get("apple")); // null 출력
key에 해당하는 value를 출력할 수 있다. key가 존재하지 않는다면 null(아무것도 없음)이 출력된다.
System.out.println(dic.getOrDefault("retain","유지하다.") // 유지하다 출력
get에서는 keyr가 없으면 null이 출력되었었는데 getOrDefault를 사용하면 지정한 default값이 출력되게 된다.
System.out.println(dic.containsKey("parse")); // true 출력
containsKey는 해당 Key가 존재하는지 판별해주는 메소드이다.
System.out.println(dic.remove("associative")); // 연합의 출력
System.out.println(dic.remove("associative", "연합의")); // true 출력
System.out.println(dic.remove("apple")); // null 출력
System.out.println(dic.remove("apple","사과")); // false 출력
Map에 포함되어있는 item을 제거해주는 메소드이다.
System.out.println(dic.size()); // 4 출력
Map의 크기를 출력한다.
System.out.println(dic.keySet()); // [retain, associative, parse, abstract] 출력
key들만 뽑아서 set 자료형으로 retrun한다. set 자료형은 List 자료형으로도 바꾸어 사용할 수 있다.
List<String> keyList = new List<>(dic.keySet());
set은 집합 형태의 data를 처리할 수 있게 해주는 자료형이다.
중복x -set의 특징은 값에 중복이 없다는 것이다. 예를 들어 set에 문자열 "H", "e", "l", "l", "o"를 저장했다면 "e","H","l","o" 이렇게 중복없이 출력된다. 중복이 되지 않는 특징 때문에 어떠한 자료의 중복을 제거하기 위한 용도로도 사용된다.
또한 set 역시 Map과 마찬가지로 값에 순서가 정해져 있지 않은데 순서를 어떤 기준에 따라 정할 수 있게 해주는 것이 TreeSet, LinkedHashSet 등이다.
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashMap<Integer> s1 = new HashMap<>(Arrays.asList(1,2,3,4,5,6));
HashMap<Integer> s2 = new HashMap<>(Arrays.asList(4,5,6,7,8,9));
// intersection
HashSet<Interger> intersection = new HashSet(s1);
intersection.retainAll(s2);
System.out.println(intersection);
/// [1,2,3] 출력
}
}
HashMap<Integer> s1 = new HashMap<>(Arrays.asList(1,2,3,4,5,6));
HashMap<Integer> s2 = new HashMap<>(Arrays.asList(4,5,6,7,8,9));
// union
HashSet<Interger> union = new HashSet(s1);
union.addAll(s2);
System.out.println(union);
/// [1,2,3,4,5,6,7,8,9] 출력
}
}
HashMap<Integer> s1 = new HashMap<>(Arrays.asList(1,2,3,4,5,6));
HashMap<Integer> s2 = new HashMap<>(Arrays.asList(4,5,6,7,8,9));
// union
HashSet<Interger> substract = new HashSet(s1);
substract.removeAll(s2);
System.out.println(union);
/// [1,2,3] 출력
}
}
Enum은 Enumeration의 약자로 열거라는 의미이다. Enum은 서로 관련이 있는 여러개의 상수 집합을 정의할 때 사용하는 자료형이다. 자바에서는 final로 String과 같은 기본 자료형을 고정시킬 수가 있다. 한번 선언을 하면 다시 값을 변경할 수가 없다. 이렇게 고정된 값들을 상수라고 한다. 어떤 클래스가 상수만으로 작성되어 있으면 굳이 class로 선언할 필요없이 enum이라고 선언하면 이 객체는 상수의 집합이라는 것을 명시적으로 나타낼 수 있다. (아직 100% 이해가 어려워서 나중에 더 깊이 공부해 보려고 한다.)
casting은 자료형 간 타입을 변환하는 것이다. 프로젝트를 하다보면 자료형을 변경해야 하는 경우가 있다고 한다.
public class {
public static void main(String[] args) {
String s1 = "123";
int n1 = Integer.parseInt(s1);
System.out.println(n1); // 123 출력
}
}
Integer.parseInt() : 문자열 -> 정수
int n2 = 123;
// sol 1)
String s2 = "" + n2;
System.out.println(s2.getClass().getName());
// java.lang.String 출력
// sol 2)
String s3 = Integer.toString(n2);
System.out.println(s2.getClass().getName());
// java.lang.String 출력
// sol 3)
String s4 = String.valueOf(n2);
System.out.println(s2.getClass().getName());
// java.lang.String 출력
String s5 = "123.456";
Double d1 = Double.parseDouble(s5);
System.out.println(d1.getClass().getName());
// java.lang.Double 출력
Float f1 = Float.parseFloat(s5);
System.out.println(f1.getClass().getName());
// java.lang.Float 출력
int n3 = 123;
double d2 = n3; // 정수 -> 실수는 캐스팅 필요 x
System.out.println(d2); // 123.0 출력
double d3 = 123.456;
int n4 = (int) d3;
System.out.println(n4); // 123 출력(내림)
마침내(finally)!! 자료형의 마지막인 final이다. final은 enum에서 설명했듯이 데이터를 고정시키는 역할을 해서 중요한 데이터가 변경되지 않도록 하는 역할을 한다.
final int n = 123;
n = 456; // 컴파일 에러 발생
// cannot assign a value to final variable number
리스트의 경우에도 final을 선언하면 재할당이 불가능하다.
final ArrayList<String> list = new ArrayList<>(Arrays.asList("hello","World"));
list = new ArrayList<>(Arrays.asList("hi","java")); // 컴파일 에러
// cannot assign a value to final variable list
하지만 리스트에서 추가(add), 제거(remove)는 가능하다.