TDD방법론, junit
int re = 10 / 0;
System.out.println("re : " + re);
해당 코드를 실행시 0으로는 수를 나눌 수 없어 ArithmeticException 에러가 발생한다.
그러므로 프로그램은 실행되지않고 강제 종료된다.
try {
int re = 10 / 3;
System.out.println("re : " + re);
_1TryTest tt = null;
tt.test();
} catch (ArithmeticException e) {
System.out.println("연산에러 : " + e.getMessage());
} catch(NullPointerException e) {
System.out.println("참조 오류 : " + e);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("인덱싱 오류 : " + e.getMessage);
}
System.out.println("프로그램 종료");
try catch문을 사용하면 강제종료되지않고 예외처리가 된다.
먼저 try문을 실행하고, ArithmeticException에러 발생시 catch문을 확인 후 로그에서 오류에 대해 정보를 출력한다.
각각의 Exception이름을 catch에 넣어주면 해당 에러 발생시 catch문 예외처리로 대응이 되는것.
public void test2() throws Exception{
FileReader fr = new FileReader("c:\\aa.txt");
}
catch하고 예외처리를 하는것이 아닌 또다른 방법 한가지가 더있다.
메소드,클래스 옆에 throws Exception키워드로 JVM에게 throws하고 에러에서 벗어나는 방법이 있다. 다만 이 방법은 비교적 무책임함
try catch수행 후 마지막엔 finally를 반드시 거침
try {
int re = 10 / 3;
System.out.println("re : " + re);
int aa[] = {5,6,7};
System.out.println("aa : " + aa[0]);
} catch (ArithmeticException e) {
System.out.println("연산에러 : " + e.getMessage());
} catch (Exception e) {
System.out.println("연산 이외의 나머지에러" + e.getMessage());
} finally {
System.out.println("에러와 상관없이 반드시 처리");
}
이처럼 특정오류를 따로 잡을수도있다. 자주 사용하는 형태는 아님
public class HashMap <K, V> { ... }
제네릭은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미.
자료형을 가리지않고 넣을 수 있는 컬렉션의 특성상 외부에서라도 타입을 지정하지 않으면 혼란을 야기 할 수 있다. 이때 제네릭을 사용. 들어가는 자료형에 제약을 걸어 셋을 사용한다.
제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.
비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
컬렉션을 반복할때 사용한다.
public static void print (Set set) {
Iterator<String> iter = set.iterator();
while(iter.hasNext()) {
String ss = iter.next();
System.out.println(ss);
}
[main]
print(list);
여기서도 중복을 배제하고 저장한 것을 확인할 수 있다.
Iterator<자료형> 객체 선언 후 반복문을 이용해 출력을 맡도록 했다.
while문 조건으로 iter(반복자)의 hasNext(다음이 있을때까지)
ss에 문자열 저장후 출력
list.remove("lee"); <<<<lee내용을 삭제 list.clear(); <<<<<전부삭제
HashSet<자료형> list = new HashSet<>();
[String형 제네릭 지정 후 .size. 확인함]
HashSet<String> list = new HashSet<>();
list.add("kim");
list.add("lee");
list.add("park");
list.add("kim");
list.add("choi");
System.out.println(list.size());
참고로 중복을 취급하지않는 셋의 특성상 list.size의 결과는 5가 아닌 4이다.
ArrayList<String> list = new ArrayList<>();
list.add("kim");
list.add("lee");
list.add("park");
list.add("kim");
list.add("lee");
System.out.println(list.size());
System.out.println(list.get(1));
System.out.println(list.indexOf("park"));
System.out.println();
print(list);
제네릭으로 String형 ArrayList를 지정. list라는 이름을 가진 객체로 만들었다.
리스트에 추가한 순서대로 인덱싱하여 이용했다.
public static void print (List<String> list) { <<<<<매개변수부분 제네릭 확인
Iterator <String> iter = list.iterator();
while(iter.hasNext()) { <<<<<<<<<
String ss = iter.next();
System.out.println(ss);
}
for (int i = 0; i < list.size(); i++) { <<<<<<<<<
System.out.println(list.get(i));
}
}
HashMap<Integer, String> list = new HashMap<>();
HashMap<String, String> hlist = new HashMap<>();
hlist.put("0", "lee");
hlist.put("1", "kim");
hlist.put("2", "han");
hlist.put("3", "park");
hlist.put("4", "lee");
System.out.println(hlist.size());
System.out.println(hlist.containsKey("2"));
System.out.println(hlist.containsValue("kim"));
Map 일괄 출력 또한 반복자iterator 를 사용한다.
containsKey,containsValue로 자료에 해당 데이터가 있는지의 여부로 True,false를 반환한다.
제네릭에서 키,값 순으로 형식을 지정할 수 있다.
(ex><int, String>키는 int, 값은 String)
public static void mapPrint (Map map) {
Set set = map.keySet();
Iterator iter = set.iterator();
while(iter.hasNext()) {
String k = (String)iter.next();
System.out.println(k+" "+map.get(k));
}
}
mapPrint메소드 에서는 Map타입의 매개변수를 받는다.
받아온 매개변수의 키셋을 Set타입 set객체를 선언하고 그곳에 일괄 저장했다.
반복자 사용을 위해 Iterator형 iter객체를 만들고 그곳에 set(map의 키)을 저장한다.
while문에서는 iter(map의 키)가 다음데이터가 있을때까지 반복한다.
String k (키) 에 String형으로 캐스팅하여 키가 담겨있는 iter값을 저장.
println으로 k(키), 그에 대응되는 값(map.get(k))을 출력한다.
중복을 허용하지않는 set과 똑같이 맵의 키값도 중복을 허용하지 않는다.
이 점을 이용하여 그 두개를 저장하면서 출력하는 방법을 사용한것,
https://cafe.daum.net/flowlife/HqLo/22
Java 1.5 Version에 도입된 기능으로, 원시 타입(Primitive Type)에서 래퍼 클래스(Wrapper Class) 타입으로 또는 반대로 자동 변환하는 것을 말합니다.
해당 기능으로 HashSet을 다룰때 자유롭게 데이터를 넣고 뺄 수 있었다.