230110 Acorn_java 응용

kangjuju·2023년 1월 10일
0

Acorn

목록 보기
1/15

숙제

TDD방법론, junit

예외처리

  • 예외처리 : try블럭 이용
  • 키보드,파일,네트워크,DB 작업은 반드시 예외처리를 강요
  • 자바의 에러는 Exception 하위 클래스에 계층적으로 선언되어있다.
  • 응용프로그램은 강제종료 되서는 안되기때문에 예외처리를 필수로 함

try ~catch

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문 예외처리로 대응이 되는것.

throws

public void test2() throws Exception{
		FileReader fr = new FileReader("c:\\aa.txt");
	}

catch하고 예외처리를 하는것이 아닌 또다른 방법 한가지가 더있다.
메소드,클래스 옆에 throws Exception키워드로 JVM에게 throws하고 에러에서 벗어나는 방법이 있다. 다만 이 방법은 비교적 무책임함

[finally]

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("에러와 상관없이 반드시 처리");
		}

이처럼 특정오류를 따로 잡을수도있다. 자주 사용하는 형태는 아님

Collection / Map자료구조

Generic 제네릭

public class HashMap <K, V> { ... }

제네릭은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미.
자료형을 가리지않고 넣을 수 있는 컬렉션의 특성상 외부에서라도 타입을 지정하지 않으면 혼란을 야기 할 수 있다. 이때 제네릭을 사용. 들어가는 자료형에 제약을 걸어 셋을 사용한다.

  • 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.

  • 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.

  • 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

Iterator 반복자

컬렉션을 반복할때 사용한다.

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();				<<<<<전부삭제

Set

  • Set(인터페이스)류. HashSet, LinkedHashSet, TreeSet ...
  • 특징 : 데이터의 중복불가. 순서가 보장되지 않음
  • 인덱스가 따로 존재하지 않기 때문에 iterator를 사용합니다.

    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이다.

List

  • ArrayList를 주로 사용한다
  • 중복저장이 가능.
  • 저장시 순서를 따지기 때문에 인덱싱이 가능함.
  • 크기가 가변적
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라는 이름을 가진 객체로 만들었다.
리스트에 추가한 순서대로 인덱싱하여 이용했다.

print의 두가지방법

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));
		}
	}

Map

  • 순서가 보장되지 않음, Key값의 중복은 허용하지 않지만 Value값의 중복은 허용된다.
  • 자료를 키와 값으로 저장. 검색에 편리하다.
  • 인덱스가 따로 존재하지 않기 때문에 iterator를 사용합니다.
    EnumMap, HashMap 등등 사용

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)

[mapPrint 메소드의 절차적인 코드설명_iterator]

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

Autoboxing,unboxing

Java 1.5 Version에 도입된 기능으로, 원시 타입(Primitive Type)에서 래퍼 클래스(Wrapper Class) 타입으로 또는 반대로 자동 변환하는 것을 말합니다.

해당 기능으로 HashSet을 다룰때 자유롭게 데이터를 넣고 뺄 수 있었다.

0개의 댓글