KOSA fullstack 교육 (Collection API 심화, 예외처리)
Collection API(HashMap)
API = library 비슷한 개념이다
Set: 중복을 벗겨내는 필터링 역할을 할 때 주로 쓰인다
이번 시간에는 HashMap에 대해 예제를 풀어보았다.
public class HashMapTest {
public static void main(String[] args) {
Map<Integer, Employee> map = new HashMap<>();
map.put(111, new Employee( "쿠로미", 10000000.0,111));
map.put(222, new Employee( "마이메로", 220000.0,222));
map.put(333, new Employee( "바쿠", 310000.0,333));
map.put(444, new Employee( "피아노", 810000.0,444));
map.put(777, new Employee( "시나모롤", 390000.0,777));
map.put(888, new Employee( "포챠코", 200000.0,888));
//귀요미들 중 777 키 값에 해당하는 멤버출력
if(map.containsKey(777)) {
System.out.println(map.get(777));
}else {
System.out.println("777인 애는 없습니다");
}
//이름이 마이메로인 사람을 찾아서 그 사람의 급여를 출력
for(Employee employee : map.values()) {
if(employee.getName().equals("피아노")) {
System.out.println("연봉: "+employee.getSalary());
break;//이름이 여러명이면 break 안 함
}
}
//멤버 중 가장 많은 급여를 받는 멤버와 가장 적은 급여를 받는 멤버의 이름을 출력
Comparator<Employee> salaryComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return Double.compare(e1.getSalary(), e2.getSalary());
}
};
Employee maxEmp = Collections.max(map.values(), salaryComparator);
Employee minEmp = Collections.min(map.values(), salaryComparator);
System.out.println("최고 급여: " + maxEmp.getName());
System.out.println("최저 급여: " + minEmp.getName());
}
}
여기서 Collections의 max 함수를 쓴 부분을 다시 보자.
공식 문서에 따르면, Collections.max()의 첫 번째 인자에는 최댓값을 찾을 대상이 되는 컬렉션을, 두 번째 인자에는 비교 기준이 되는 Comparator를 넣을 수 있다고 나와 있다.
즉, 어떤 기준으로 최댓값을 판단할지 명확히 정의할 수 있다는 의미다.
일반적인 Map은 본래 순서를 보장하지 않기 때문에,
특정 기준(예: 급여 Salary)을 기준으로 값을 정렬하고,
그 정렬 기준을 Comparator로 정의한 후 max() 또는 min()에 넘겨주면
해당 기준에 따라 최댓값이나 최솟값을 뽑아낼 수 있다.
예외처리
예외처리 시 이해해야 할 것
- 예외가 어떤 상황에서 발생하는 지
- 예외가 발생하면 어떤 결과가 나타나는지
- 예외를 처리한다는 것이 프로그램으로 어떤 작업인지
RuntimeException 예제이다.
해당 while문을 돌지만, 돌다가 터져버린다.
즉 순서대로 실행되다가 중간에 비정상종료가 된 것을 볼 수 있다.
자바는 예외조차도 객체로 만들어서 반환한다
JVM이 i가 3을 만나게 되면, 해석을 하지 못하고 에러 객체를 생성해서 다시 라인으로 보내게 되고 이 때 터지게 되는 것이다.
예외처리를 한다 라는것은
비정상종료 -> 정상종료가 되도록 처리하는 것이다.
예외를 명시적으로 처리하는 방법 1
try{
1) 예외 발생 가능성 있는 코드
} catch(발생한 예외 객체){
2) 예외 잡았을 경우 코드
}
3) 그 외의 코드
- 예외 발생 + 예외 처리 안했다면 -> 아무것도 실행되지 않는다.
- 예외 발생 안했다 -> 1) + 3)
- 예외 발생 + 잘 잡았다 -> 2) + 3)
예외는 무조건 위에서 아래로 커지게 잡아야 한다. 위에서 모든 에러처리의 부모인 Exception으로 잡아버리면 안됨!
예외를 처리하는 방법2
1) try-catch :: 즉각적으로 폭탄을 바로 처리
2) throws :: 폭탄을 던진다.. method선언부에서 발생한 폭탄을 던진다.
package com.edu.exception.test2;
public class UserExceptionTest1 {
public static void main(String[] args) {
User user = new User();
System.out.println("1. go() calling...");
try {
user.go();
}catch(ArithmeticException e) {
System.out.println("잡아따");
}
System.out.println("3. go() finished...");
}
}
class User{
public void go() throws ArithmeticException{
System.out.println("2. go() working...");
int i=10; int j=0;
System.out.println("연산적용"+i/j);
}
}
그 외에 throw 설명이다.