Java-컬렉션, 예외처리
컬렉션
- 컬렉션 종류
- List (인터페이스) : 순서가 있는 데이터 집합을 의미 (ArrayList, LinkedList, Stack로 List인터페이스 구현), 데이터의 중복을 허용한다.
- stack (클래스) : 순서가 있는 데이터집합을 LIFO(후입선출법)방식으로 관리하는 자료구조
- queue (인터페이스) : 순서가 있는 데이터집합을 FIFO(선입선출법)방식으로 관리하는 자료구조(LinkedList클래스로 구현함)
- set (인터페이스) : 순서가 없는 데이터 집합 / 중복을 허용안함 (Hashset으로 구현)
-
map (인터페이스) : 사전과 같은 자료구조, key와 value값으로 구성된 데이터들의 집합
key value firstname gildong lastname hong location seoul
ArrayList - 클래스
- ArrayList 클래스
- 데이터가 삽입, 삭제될 때마다 새로운 배열 생성.
- 검색이 많이 발생하는 자료는 ArrayList 자주 씀.
- 컬렉션 중 가장 많이 사용되는 클래스
- 기존의 Vector 클래스를 개선한 클래스
- 비효율적인 메모리 사용
- 객체생성
ArrayList<String> list = new ArrayList<String>();
- 메소드 종류
//리스트에 자료 추가하기 list.add("양파"); list.add("양파"); list.add("양파"); //리스트의 특정 인덱스 자료 삭제하기 list.remove(1); //해당 인덱스 값 가져오기. list.get(0); //해당 인덱스값을 뒤의 문자열로 수정 list.set(1, "상추");
LinkedList - 클래스
- LinkedList클래스
- 데이터가 삽입, 삭제될 때마다 해당 칸만 추가/삭제하고 기억하고 있는 위치만 변경
- 수정이 많이 일어나는 자료는 LinkedList 자주 씀.
- 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다.
- 데이터가 많을수록 접근성이 떨어짐.
ArrayList vs LinkedList
- 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.
- 중간 데이처를 추가/삭제하는 경우는 LinkedList가 ArrayList보다 빠르다.
Stack - List인터페이스를 구현하는 클래스
class Coin {
private int value;
public Coin(int value) {
super();
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
- 객체생성
Stack <Coin> coinBox = new Stack <Coin>();
- 메소드 종류
//스텍에 객체 넣기 coinBox.push(new Coin(500)); coinBox.push(new Coin(600)); coinBox.push(new Coin(800)); //스텍에서 객체 꺼내오기 coinBox.pop();
Queue - 인터페이스 - LinkedList클래스로 구현
- 이건 참조할 클래스 예시 (stack내용 아님)
class Msg { String command; String to; public Msg(String command, String to) { super(); this.command = command; this.to = to; } }
- 객체생성
Queue<Msg> msgQueue = new LinkedList<Msg>();
- 메소드 종류
//큐에 객체 넣기 msgQueue.offer(new Msg("sendMail", "김명관")); msgQueue.offer(new Msg("sendSMS", "김유민")); msgQueue.offer(new Msg("sendKAKAO", "김정욱")); msgQueue.peek(); //-> 큐에서 객체를 하나 가져옴, 객체를 큐에서 제거는 안함. msgQueue.poll(); //-> 큐에서 객체를 하나 가져옴, 객체를 큐에서 제거.
Set - 인터페이스 - HashSet클래스로 구현
- 객체생성
Set<String> set = new HashSet<String>(); Set<String> set2 = new HashSet<String>();
- 메소드 종류
//셋에 데이터 넣기 set.add("우유"); set.add("우유"); set.add("머핀"); set.add("우유"); set.add("커피"); // 이렇게 넣어도 셋에는 우유,머핀,커피 이 3가지만 저장됨 //합집합 set.addAll(set2); //set과 set2의 합집합이 있는지없는지 boolean값을 리턴, 그리고 그 합집합을 set에 저장 //교집합 set.retainAll(set2); //set과 set2의 교집합이 있는지없는지 boolean값을 리턴, 그리고 그 교집합을 set에 저장
Map - 인터페이스 - HashMap클래스로 구현
- 객체생성
Map<String, Integer> score = new HashMap<String, Integer>();
- 메소드 종류
//맵에 데이터 넣기 score.put("kim", 96); score.put("hong", 86); score.put("park", 92);
- set으로 넣어서 for문 돌려 다 순회해보기
for (Map.Entry<String, Integer> e : score.entrySet()) { if (e.getValue() > maxScore) { maxScore = e.getValue(); name = e.getKey(); } // 제일 큰 수 찾기 totalScore += e.getValue(); } int avgScore = totalScore / score.size(); System.out.println("평균 : " + avgScore); System.out.println("최고점수 : " + maxScore); System.out.println("최고점수득점자 : " + name);
예외처리
- 예외 vs 에러
- 에러 → 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생. JVM실행에 문제가 생김, 에러 대체 불가
- 예외 → 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 발생하는 오류 → 이걸 해결하는게 예외처리
- 예외의 종류
- 일반예외 (Execption) - 컴파일러 체크 예외 : 컴파일과정에서 예외처리 코드 검사, 문법오류
- 실행예외 (Runtime Execption) - 컴파일과정에서 예외처리 검사 안함, 문법오류없지만 실행은 x, 개발자의 경험에 의해서 처리, 실행예외에 대한 예외처리 코드가 없는 경우 해당예외가 발생하면 프로그램은 비정상 종료
- 실행예외
- NullPointerException → 객체가 없는 상태에서 객체를 사용하려고하면 발생하는 예외
- ArrayIndexOutBoundsException → 배열에서 인덱스 범위를 초과하여 사용할 경우
- NumberFormatException → 문자열을 숫자로 변환하려고 할 때 숫자로 변환할 수 없는 문자가 포함되어 있으면 발생
- ClassCastException → 타입변환(상위→하위, 인터페이스→구현) 시 관계가 없는 타입으로 억지로 변환하려고 할 때 발생
- 예외처리방법
- 예외가 발생했을 때 그 자리에서 프로그램의 갑작스러운 종료를 막고 정상실행을 유지할 수 있도록 처리하는 코드 (try-catch문)
try { // 예외가 발생가능한 코드들 } catch (Exception e) { // 예외가 발생하면 다 잡아줌 - 그러나 어떤 예외인지 알 수 없음 } catch (ArrayIndexOutOfBoundsException e) { // 해당 예외만 잡아줌 } finally { //finally안에 있는 코드는 try블록이 끝나면 무조건 실행됨 //예외가 발생하든 안하든 항상 실행되어야하는 코드는 finally에 넣을 수 있음 }
- finally 는 무조건 실행!! 아무리 return이 있어도!
public class FinallyTest { public static void main(String[] args) { method(); } public static void method() { try { System.out.println("메소드가 호출되었습니다."); return; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally { System.out.println("메소의 finally블록이 실행되었습니다."); } } }
- 니가 호출할 메소드가 예외를 가지고 있어.. 라고 미리 알려주는 방법
class DivideByZeroException extends ArithmeticException{ public DivideByZeroException() { super("0으로 나눴을 때 발생하는 예외"); } } public class DivideByZeroExceptionTest { public static void main(String[] args) { try { System.out.println(div(8,0)); } catch (DivideByZeroException e) { e.printStackTrace(); } } public static double div(int x, int y) throws DivideByZeroException{ if (y==0) {throw new DivideByZeroException();} return x/y; } }
- 예외가 발생했을 때 그 자리에서 프로그램의 갑작스러운 종료를 막고 정상실행을 유지할 수 있도록 처리하는 코드 (try-catch문)
댓글남기기